按键的若干要素

来源:互联网 发布:windows apache php 编辑:程序博客网 时间:2024/05/16 08:29

按键通常都是一个任务。任务就是说,这个函数要周期性的调用。首先任务要使用若干全局变量,保存当前状态。

static uint8  KeyCount  = 0;
static uint8  KeyOk     = 0;
static uint8  OldKey    = 0;
static uint16 KeyReady  = 0;

 

要素分为以下几步:

1,扫描,取得按键序号

2,去抖,连续若干次,按键为真,否则为假

3,判断释放

4,延时,消除 重复响应

 

char KeyScan( void )
{
  unsigned char key = KeyProcess();

  //延时,消除重复响应
  if ( KeyReady )
  {
    KeyReady++;
    if ( KeyReady > 20 )
    {
      KeyOk = 0;
      KeyReady = 0;
    }
  }

  if ( KeyOk == 0 )
  {
    if ( ( key != KEY_NULL ) && ( key == OldKey ) )
    {
      KeyCount++;
     
      //去抖,连续若干次,按键为真,否则为假
      if ( KeyCount > 20 )
      {
        KeyCount = 0;
        KeyOk = 1;
      }
    }
    else
    {
      //key == KEY_NULL,或者key != OldKey
      OldKey = key;
      KeyCount = 0;
    }
  } 

  //在按键释放的时候,发送当前键
  if ( KeyReady == 0 && key != OldKey )
  {
    KeyReady = 1;
    return OldKey;
  }
  else
  {
    return KEY_NULL;
  }
}