typedef unsigned char UINT8;
typedef unsigned int UINT16;
static const KEY_TYPE keyTab[]= // P.0 P0.1 P0.2
{
NOKEY, // 0 0 0
KEY_DOWN, // 0 0 1
KEY_SET, // 0 1 0
NOKEY, // 0 1 1
KEY_UP, // 1 0 0
NOKEY, // 1 0 1
NOKEY, // 1 1 0
NOKEY // 1 1 1
};
static UINT8 keyMap=0x00;
static UINT8 preKeyEvt=NOKEY;
static UINT16 keyHoldTmot=0;
vodi keyInit(void)
{
// 设置p0.0 p0.1 p0.2内部上拉
// 或者你外部有上拉电阻,按下接地
}
// In 10ms Timer 请挂10ms定时器
void KeyScan(void)
{
UINT8 map;
// 1.采样且去抖动
map = ~(P0&0x07); // 取反使高位代表有按键,方便后面事件转换
if (map != keyMap)
{//去抖动
keyMap = map;
return;
}
// 事件翻译
if (preKeyEvt == NOKEY)
{// 0==> x
if (keyTab[keyMap] != NOKEY)
{// 0-->1 keydown
EvtPost(keyTab[keyMap]);
}
else
{// 0-->0
}
}
else
{// 1==> x
if (keyTab[keyMap] != NOKEY)
{// 1-->1 keyHold
if (++keyHoldTmot > (3000/10) ) // 3000ms/10ms
{
keyHoldTmot -= 500/10; // 连续按键事件
if (preKeyEvt == KEY_SETTHREESECOND)
{
EvtPost(preKeyEvt);
}
}
}
else
{// 1-->0 keyup
}
}
}
void main(void)
{
KeyInit();
TimerInit();
EvtQueInit();
while(1)
{
__watchdog_reset();
switch(EvtPend())
{
case KEY_DOWN:
break;
case KEY_DOWN:
break;
case KEY_DOWN:
break;
//..........
default:
break;
}
}
}
|