本帖最后由 流行音乐 于 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;
}
}
}
|