淺談如何按鍵消抖
軟件消抖
如果按鍵較多,常用軟件方法去抖,即檢測出鍵閉合后執行一個(gè)延時(shí)程序,5ms~10ms的延時(shí),讓前沿抖動(dòng)消失后再一次檢測鍵的狀態(tài),如果仍保持閉合狀態(tài)電平,則確認為真正有鍵按下。當檢測到按鍵釋放后,也要給5ms~10ms的延時(shí),待后沿抖動(dòng)消失后才能轉入該鍵的處理程序。還可以利用定時(shí)器中斷來(lái)消抖。
下面再介紹一種按鍵消抖的方法:利用switch()結構,程序設計如下:
無(wú)延時(shí)的軟件消抖
/*********************************************
名稱(chēng):鍵盤(pán)掃描子函數
功能:在按鍵穩定期內判斷鍵值,并返回鍵值
**********************************************/
uchar keyscan(void)
{
static char key_state = 0;
static char key_value = 0;
uchar key_press, key_return = 0;
key_press=turn_leftturn_right; //讀按鍵I/O電平
switch (key_state)
{
case 0 : // 按鍵初始態(tài)
if (key_press==0) key_state = 1; // 鍵被按下,但需要確認是否是干擾
break;
case 1 : // 按鍵確認態(tài)
if (key_press==0)
//如有鍵按下則不是干擾,判斷鍵值
{ if(turn_left==0) //判斷是哪一個(gè)按鍵被按下
key_value=1; //按鍵較多時(shí)可采用switch選擇結構
else if(turn_right==0)
key_value=2;
else key_value=0;
key_state = 2; // 狀態(tài)轉換到鍵釋放態(tài)
}
else key_state = 0; // 按鍵已抬起,屬于干擾,轉換到按鍵初始態(tài)
break;
case 2 :
if (key_press==1)
{
key_return=key_value;//按鍵釋放后再輸出鍵值
key_value=0;
key_state = 0; //如果按鍵釋放,轉換到按鍵初始態(tài)
} break;
}return key_return; //返回鍵值
}
/*********************************************
名稱(chēng):按鍵處理子函數
功能:
**********************************************/
void key_operation(void)
{
switch (keyscan()) //根據鍵值不同,執行不同的內容
{ case 1:
hight_votage-=1;
if(hight_votage5)
hight_votage=5; break;
case 2:
hight_votage+=1;
if(hight_votage>25)
hight_votage=25; break;
default :break;
}
}
只要有按鍵就一定要想到消抖,總之不管是硬件消抖還是軟件消抖,在腦海里始終要想到按鍵按下時(shí)出現圖一的情景,然后再進(jìn)行相應的設計。
幾個(gè)好的按鍵設計的總結
對于多個(gè)按鍵的設計常用思路是: 按照面向過(guò)程的編程方式, 將數據與過(guò)程分離. 把和按鍵狀態(tài)相關(guān)的東西比如按鍵功能統統塞到結構里, 把消抖的代碼放在一個(gè)函數中。這里介紹按鍵設計的幾種方法:
1、 矩陣鍵盤(pán),http://www.51hei.com/f/jzjpcx.rar
(這個(gè)文檔里放了幾個(gè)矩陣鍵盤(pán)的程序,個(gè)人覺(jué)得這幾個(gè)程序比較精簡(jiǎn),大家可以參看一下)
2、 ADC按鍵,具體設計點(diǎn)擊這個(gè)網(wǎng)址:http://www.ceet.hbnu.edu.cn/bbs/viewthread.php?tid=7641extra=highlight=%CA%FD%D7%D6%CA%BE%B2%A8%C6%F7page=2
ADC按鍵的優(yōu)點(diǎn)是節省IO口,但是需要調配好電阻值,個(gè)人覺(jué)得有點(diǎn)麻煩。
3、 并入串出按鍵,具體設計點(diǎn)擊這個(gè)網(wǎng)址:http://www.ceet.hbnu.edu.cn/bbs/redirect.php?tid=8059goto=lastpost#lastpost
4、 4*3鍵盤(pán)并且復用端口很牛 http://www.51hei.com/mcu/1316.html
評論