|
void KeyScan(void) //此函數(shù)放在定時中斷里每 1ms 掃描一次
{
static unsigned char Su8KeyLock1;
static unsigned int Su16KeyCnt1;
static unsigned char Su8KeyShortFlag=0; //按鍵“短按”觸發(fā)的標(biāo)志
if(0!=KEY_INPUT1)//單個 K1 按鍵沒有按下,及時清零一些標(biāo)志。
{
Su8KeyLock1=0; //按鍵解鎖
Su16KeyCnt1=0; //去抖動延時計數(shù)器清零,此行非常巧妙,是全場的亮點(diǎn)。
if(1==Su8KeyShortFlag) //松手的時候,如果“短按”標(biāo)志有效就觸發(fā)一次“短按”
{
Su8KeyShortFlag=0;
//先清零“短按”標(biāo)志避免一直觸發(fā)。
vGu8SingleKeySec=1;
//觸發(fā) K1 的“短按”
}
}
else if(0==Su8KeyLock1)//單個按鍵 K1 被按下
{
Su16KeyCnt1++; //累加定時中斷次數(shù)
if(Su16KeyCnt1>=KEY_SHORT_TIME) //“短按”兼“濾波”的“穩(wěn)定時間”KEY_SHORT_TIME
{
//注意,這里不能“自鎖”。后面“長按”觸發(fā)的時候才“自鎖”。
Su8KeyShortFlag=1;
//K1 的“短按”標(biāo)志有效,待松手時觸發(fā)。
}if(Su16KeyCnt1>=KEY_LONG_TIME) //“長按”兼“濾波”的“穩(wěn)定時間”KEY_LONG_TIME
{
Su8KeyLock1=1;
//此時“長按”觸發(fā)才“自鎖”
Su8KeyShortFlag=0; //既然此時“長按”有效,那么就要廢除潛在的“短按”。
vGu8SingleKeySec=2; //觸發(fā) K1 的“長按”
}
}
}
不知道為什么,按鍵完全沒用啊,有沒有好用的按鍵長按短按程序推薦一下
|
|