本文介紹通過單片機實現按鍵控制一個LED燈,教大家學習按鍵控制原理。
下圖為按鍵連接原理,(PB0-PB3為單片機IO口),每個按鍵輸出端採用上拉電阻,目的是當按鍵斷開時,使單片機輸入埠(PB0-PB3)處於高電平狀態,只有當按鍵按下時才處於低電平。(此文用AVR單片機舉例)
按鍵的基本原理是設置單片機IO口(PB0-PB3)為輸入狀態,如DDRB = 0XF0(方向寄存器,「1」為輸出,「0」為輸入);
單片機一直檢測按鍵埠(PB0-PB3)的狀態,當埠為低電平時(即按鍵按下),實行相應的動作(比如控制LED燈)。
原理就是這麼回事,但是正真實現時,按鍵會有抖動,要進行按鍵去抖,下圖為按鍵按下時的抖動圖。
按鍵實行一個動作過程是需要一定時間的,一般為100mS-1S左右,而一個單片機執行一個機器周期的時間很短,時鐘為10MH的周期為0.1μs,這樣按鍵每一次動作程序就會多次檢測按鍵,出現誤判(一次按下,多次動作)。
按鍵觸點在閉合或者斷開的瞬間會出現抖動,抖動時間一般小於10ms。
(1) 可以使用硬體電路消抖,硬體消抖可以在按鍵與單片機IO口之間加入RS觸發器,原理如下圖所示。
(2)軟體去抖
按鍵抖動的時間間隔也就10ms以內,可以通過軟體進行延時判斷,過濾掉抖動的時間,達到消除抖動的目的。
例:按鍵消抖程序:
Keys ()
{
if(!key) //第1步:判斷是否有按鍵按下,key=0表示按鍵按下
{
delayms(20); //第2步:延時20ms,用於軟體消抖,避開抖動時間
if(!key) //第3步:再次檢測該按鍵是否按下
{
… //按鍵按下的處理程序
}
}
While(!key); //第4步:判斷按鍵動作是否結束(key=1表示按鍵已釋放)
}
例:按鍵控制LED燈程序