1. 程式人生 > >按鍵檢測與防抖

按鍵檢測與防抖

u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;//按鍵按鬆開標誌
if(mode)key_up=1; //支援連按
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
{
delay_ms(10);//去抖動
key_up=0;
if(KEY0==0)return KEY0_PRES;
else if(KEY1==0)return KEY1_PRES;
else if(KEY2==0)return KEY2_PRES;
else if(WK_UP==1)return WKUP_PRES;
}else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;
return 0;// 無按鍵按下
}

這個演算法比較精巧,用一個key_up來標誌按鍵是否彈開。首先判斷按鍵是否彈開,如果彈開了,並且有按鍵按下了才會進入函式,才會有延時。

假如按鍵沒有彈開,雖然程式會掃描到這個函式,但是並不會進入函式,雖然按鍵此時是按下的。

if(mode)key_up=1; //支援連按
這個語句可以讓其他按鍵沒有鬆開的時候也可以繼續按下其他鍵。只要設定好mode即可。

這個delay()函式不能是簡單的計數延時,這樣佔用系統時間。必須用作業系統的思路就行延時。

這種寫法比下面這種寫法效率提高很多

if(key2 == 0)
{
delayms(10);
if(key2 == 0)
{
…………….
}
}

if(key3 == 0)
{
delayms(10);
if(key3 == 0)
{
…………….
}
}
這樣每個函式都要延時,而上面函式只要延時一次。