本帖最后由 流行音乐 于 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。
- void _GenerateKeyEvent(int8u aKeyNumber, int8u u8_KeyAction)
- {
- int16u u16Key;
- if(bKeyError)
- { //按键错误
- if(oeKeyStatus!=neKeyError)
- {
- u8KeyFlag&=0xf0;
- u8KeyFlag|=0x0d;
- u16Key=0+(((int16u)u8KeyFlag)<<8);
- _SendToKeyBuffer(u16Key);
- oeKeyStatus=neKeyError;
- }
- }else
- { //按键错误消失
- if(oeKeyStatus==neKeyError)
- {
- u8KeyFlag&=0xf0;
- u8KeyFlag|=0x08;
- u16Key=0+(((int16u)u8KeyFlag)<<8);
- _SendToKeyBuffer(u16Key);
- oeKeyStatus=neKeyIdle;
- }
- switch(u8_KeyAction)
- {
- case 0: //按键按下
- u8KeyFlag|=_GetKeyFlag(aKeyNumber); //设置辅助功能键标志位
- u8KeyFlag&=0xf0;
- u8KeyFlag|=0x05;
- u16Key=aKeyNumber+(((int16u)u8KeyFlag)<<8);
- _SendToKeyBuffer(u16Key);
- u8Key=aKeyNumber;
- oeKeyStatus=neKeyWait;
- break;
- case 1: //按键松开
- u8KeyFlag&=~_GetKeyFlag(aKeyNumber); //设置辅助功能键标志位
- u8KeyFlag&=0xf0;
- u16Key=aKeyNumber+(((int16u)u8KeyFlag)<<8);
- _SendToKeyBuffer(u16Key);
- break;
- }
- }
- }
|