快乐小小鱼的笔记 https://bbs.21ic.com/?871240 [收藏] [复制] [RSS]

日志

电脑键盘按键实现

热度 3已有 987 次阅读2013-6-21 20:10 |个人分类:按键处理|系统分类:兴趣爱好

特点:

1,任意单键键按键和松键都会发编码。

2,按住某些键后,再按另外的键,按键和松键,还是发送编码。编码中,原先按住的键,一直也是按住的状态。

3,没有短按和长按,双击单击的区别。

代码实现:


void Handle_SW(void)
{
  unsigned char key_change = 0;
  static unsigned char handle_value_last; 
  static unsigned char handle_value_this; 
  handle_value_this = SWV; 
  key_change = handle_value_last ^ handle_value_this;
  if(key_change) 
  {
   if(handle_value_this & key_change)
   {
    switch(key_change)
    {
     case 0x01:
      key1_press();
     break;
     case 0x02:
      key2_press();
     break;
     case 0x04:
      key3_press();
     break;
     case 0x08:
    //  key4_press();
     break;
     case 0x10:
     // key5_press();
     break;
     case 0x20:
     // key6_press();
     break;
     case 0x40:
     // key7_press();
     break; 
     case 0x80:
     // key8_press();
     break;
     default:
     break;
    }
   }
   else
   {
    switch(key_change)
    {
     case 0x01:
      key1_loosen();
     break;
     case 0x02:
      key2_loosen();
     break;
     case 0x04:
      key3_loosen();
     break;
     case 0x08:
    //  key4_loosen();
     break;
     case 0x10:
     // key5_loosen();
     break;
     case 0x20:
     // key6_press();
     break;
     case 0x40:
     // key7_press();
     break; 
     case 0x80:
     // key8_press();
     break;
     default:
     break;
    }
   }
  }
  handle_value_last = handle_value_this;
}

 

分析:不停的读取按键值,如果两次读值不同,则有按键动作。按键动作又分为按下和松开两种状态。

按下:如果这次读到某个管脚是1,而上次读到这个管脚是0,则是按键被按下了。

松开:如果这次读到某个管脚是0,而上次读到这个管脚是1,则是按键被松开了。

这里用的是异或运算来实现对两次按键值得比较。

 


路过

鸡蛋

鲜花

握手

雷人

发表评论 评论 (1 个评论)

回复 快乐小小鱼 2013-6-21 20:12
这里的SWV是按键的值,按键被按下,对应位是1,没有键按下,对应位是0,这里没有看到延时去抖,是因为SWV的值是在一个10MS的中断函数里获得的这样把按键的读取,和处理,做了“分层”的处理!