原创分享:我的完美组合按键编码方案

[复制链接]
3317|3
 楼主| 流行音乐 发表于 2010-12-13 22:43 | 显示全部楼层 |阅读模式
本帖最后由 流行音乐 于 2011-10-30 22:43 编辑

我的完美组合按键编码方案:
……
并使用按键缓冲区,以支持快速按键且不丢失按键。
按键编码位:
  x  x  x  x  x  x  x  xxxxxxxx
  _  _  _  _  _  _  _  ________
  |  |  |  |  |  |  |     |
  |  |  |  |  |  |  |     +----------- 按键编号
  |  |  |  |  |  |  +----------------- 按键按下和重发标志位,详见下面说明
  |  |  |  |  |  +-------------------- 按键按下和重发标志位,详见下面说明
  |  |  |  |  +----------------------- 按键按下和重发标志位,详见下面说明
  |  |  |  +-------------------------- 按键错误,表示有矩形三键被按下
  |  |  +----------------------------- 功能键1状态 1:按下 0:未按下
  |  +-------------------------------- 功能键2状态 1:按下 0:未按下
  +----------------------------------- 功能键3状态 1:按下 0:未按下
按键按下和重发标志位的说明:
000: 按键松开
101: 按键首次按下
110: 按键首次重发
111: 按键重发(不含首次重发)

下面只是整个按键程序的 1/6。

  1. void _GenerateKeyEvent(int8u aKeyNumber, int8u u8_KeyAction)
  2. {
  3.   int16u u16Key;
  4.   if(bKeyError)
  5.   { //按键错误
  6.     if(oeKeyStatus!=neKeyError)
  7.     {
  8.       u8KeyFlag&=0xf0;
  9.       u8KeyFlag|=0x0d;
  10.       u16Key=0+(((int16u)u8KeyFlag)<<8);
  11.       _SendToKeyBuffer(u16Key);
  12.       oeKeyStatus=neKeyError;
  13.     }
  14.   }else
  15.   { //按键错误消失
  16.     if(oeKeyStatus==neKeyError)
  17.     {
  18.       u8KeyFlag&=0xf0;
  19.       u8KeyFlag|=0x08;
  20.       u16Key=0+(((int16u)u8KeyFlag)<<8);
  21.       _SendToKeyBuffer(u16Key);
  22.       oeKeyStatus=neKeyIdle;
  23.     }
  24.     switch(u8_KeyAction)
  25.     {
  26.       case 0: //按键按下
  27.         u8KeyFlag|=_GetKeyFlag(aKeyNumber);  //设置辅助功能键标志位
  28.         u8KeyFlag&=0xf0;
  29.         u8KeyFlag|=0x05;
  30.         u16Key=aKeyNumber+(((int16u)u8KeyFlag)<<8);
  31.         _SendToKeyBuffer(u16Key);
  32.         u8Key=aKeyNumber;
  33.         oeKeyStatus=neKeyWait;
  34.         break;
  35.       case 1: //按键松开
  36.         u8KeyFlag&=~_GetKeyFlag(aKeyNumber);  //设置辅助功能键标志位
  37.         u8KeyFlag&=0xf0;
  38.         u16Key=aKeyNumber+(((int16u)u8KeyFlag)<<8);
  39.         _SendToKeyBuffer(u16Key);
  40.         break;
  41.     }
  42.   }
  43. }
coody 发表于 2010-12-13 23:42 | 显示全部楼层
太麻烦了吧?我现在一般用PS2的编码,或者直接用ASCII做键码,这样,所有的输入都可以统一影射。。。
程序匠人 发表于 2010-12-16 21:53 | 显示全部楼层
“完美”体现在哪里,能否展开讲解? :)
maxhai 发表于 2010-12-16 22:34 | 显示全部楼层
晕。。。把我骗进来!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

375

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部