|
发表于 2005-11-15 17:27:52
|
显示全部楼层
#define KEY_INPUT_ADDR1 0x2000
#define KEY_INPUT_ADDR2 0x6000
#define ANTI_SHAKE_TIMES 1 //per 50ms
#define REPEAT_DELAY_TIMES 20 //per 50ms
#define REPEAT_BETWEEN_TIMES REPEAT_DELAY_TIMES-3 //per 50ms
#define KEY_MASK 0x00E0
#define NO_KEY_PRESS_CODE 0xFFFF
bit bdata bKeyEvent;
bit bdata bKeyChanged;
INT16U data PreviousKeyCode; //Previous Key Code, Read from Port, Before Anti-Shake
INT16U data PreviousKeyValue; //Previous Key Value After Anti-Shake
INT16U data CurrentKeyValue; //Current Key Value After Anti-Shake
INT8U data AntiShakeCount;
INT8U data RepeatCount;
//Initialize Key Variable
void InitKeyVariable ( void )
{
PreviousKeyCode = NO_KEY_PRESS_CODE;
PreviousKeyValue = NO_KEY_PRESS_CODE;
CurrentKeyValue = NO_KEY_PRESS_CODE;
AntiShakeCount = 0;
RepeatCount = 0;
bKeyEvent = 0;
bKeyChanged = 0;
}
//Read Key Code
void ReadKey ( void )
{
INT16U data CurrentKeyCode; //Curretn Key Code, Read from Port, Befrore Anti-Shake
//Get Key Code form Port
CurrentKeyCode = ( XBYTE[KEY_INPUT_ADDR1] << 8 ) | XBYTE[KEY_INPUT_ADDR2] | KEY_MASK;
//Anti-Shake Process
if ( CurrentKeyCode == PreviousKeyCode )
{
AntiShakeCount++;
if ( AntiShakeCount == ANTI_SHAKE_TIMES )
{
AntiShakeCount--;
PreviousKeyValue = CurrentKeyValue;
CurrentKeyValue = CurrentKeyCode;
}
}
else
{
PreviousKeyCode = CurrentKeyCode;
PreviousKeyValue = CurrentKeyValue;
AntiShakeCount = 0;
}
//Creat Key Event
if ( CurrentKeyValue != NO_KEY_PRESS_CODE )
{
if ( PreviousKeyValue != CurrentKeyValue )
{
bKeyChanged = 1;
bKeyEvent = 1;
RepeatCount = 0;
}
else
{
RepeatCount++;
if ( RepeatCount == REPEAT_DELAY_TIMES )
{
bKeyChanged = 0;
bKeyEvent = 1;
RepeatCount = REPEAT_BETWEEN_TIMES;
}
}
}
}
写一50ms中断或者主程序运行N周后调用一次ReadKey函数,检测bKeyEvent和bKeyChanged的状态;
bKeyEvent = 1 、bKeyChanged = 1时有新按键按下事件发生,键码在CurrentKeyValue中;bKeyEvent = 1 、bKeyChanged = 0时有按键被持继按下事件发生,键码在CurrentKeyValue中;
注:
CurrentKeyCode = ( XBYTE[KEY_INPUT_ADDR1] << 8 ) | XBYTE[KEY_INPUT_ADDR2] | KEY_MASK;与键盘硬件电路有关,可按实际情况调整。
-----此内容被fatboy于2005-11-15,17:39:14编辑过 |
|