鍵盤是單片機與用戶交互設備之一,用戶通過鍵盤輸入數據或命令到單片機。最簡單的鍵盤僅有一個按鍵,復雜一些的鍵盤有多個按鍵。在單片機的外圍電路中,通常用到的按鍵都是機械彈性開關,當用戶按下按鍵時,按鍵閉合,用戶松開按鍵后,按鍵斷開,單片機如何檢測到按鍵被按下或釋放呢?
按鍵一般與單片機的I/O口連接,按鍵的一端連接I/O口,另一端接地,與按鍵連接的I/O端口會被賦值為高電平,單片機鍵盤檢測程序會持續檢測該I/O端口的電平,若檢測到該端口由高電平變為低電平,說明與該端口連接的按鍵被按下,因為按鍵閉合后,相當于I/O端口通過按鍵與地直接連接,導致該I/O端口變為低電平。
按鍵的連接非常簡單,如下圖所示,按鍵的一端與任一I/O端口相連,另一端與地連接。
機械按鍵被按下后,會發生抖動現象,導致電平在按下階段和釋放階段不會立即變為低電平,而是呈現鋸齒狀。下圖是按鍵按下時的電壓變化。
機械按鍵被按下或釋放后,抖動時間大約為5~10ms,此時電壓不穩定,呈鋸齒形,檢測程序無法檢測按鍵是否被按下,因此編寫按鍵檢測程序時,需要進行抖動延時處理。按鍵檢測流程如下圖所示:
檢測程序持續檢測與鍵盤連接的I/O端口,當檢測到I/O端口電壓出現波動時,延時10ms,然后再次檢測I/O端口,若I/O端口為低電平,說明按鍵被按下,同時還要檢測按鍵是否被釋放,檢測按鍵是否被釋放時,就不需要對抖動進行延遲處理了。
按鍵檢測應用案例:應用兩個按鍵分別控制發光二極管D1和D2的通斷,按鍵1與單片機P2.0連接,按鍵2與P2.1端口連接,D1和D2分別與單片機P1.0、P1.1口連接,按下按鍵1,D1狀態反轉,按下按鍵2,D2狀態反轉。
下圖是按鍵檢測案例電路設計圖:
在P2.0和P2.1端口分別接入兩個按鍵,按鍵的另一端接地。D1和D2發光二極管分別連接到單片機的P1.0和P1.1端口。
單片機內運行的完整C程序如下:
#include < reg51.h >
#include < stdio.h >
sbit key_one = P2^0;
sbit key_two = P2^1;
sbit led_one = P1^0;
sbit led_two = P1^1;
void delay(unsigned int millisecond)
{
unsigned int i,j;
for(i=millisecond;i >0;i--)
for(j=120;j >0;j--);
}
void key_scan()
{
if( key_one == 0 )
{
delay(10);
if( key_one == 0 )
{
while(!key_one);
led_one = !led_one;
}
}
if( key_two == 0 )
{
delay(10);
if( key_two == 0 )
{
while(!key_two);
led_two = !led_two;
}
}
}
void main(void)
{
unsigned int i;
led_one = 1;
led_two = 1;
while(1)
{
key_scan();
}
}
位變量key_one和key_two為單片機P2.0端口和P2.1端口,用于檢測按鍵狀態。位變量led_one和led_two為單片機P1.0和P1.1端口,用于控制D1和D2的狀態。函數delay()是延遲函數,參數millisecond用于設置延遲的毫秒數。
key_scan是按鍵檢測函數,分別檢測P2.0端口和P2.1端口電平變化,若檢測到端口電平為低電平時,延時10ms后,若該端口依然是低電平,則確認與該端口連接的按鍵被按下,然后使用while循環等待按鍵的釋放,循環條件是端口變換為高電平,最后取反led_one或led_two的電平。
main()函數主要完成按鍵的循環檢測,具體實現方法是在函數內部實現一個無限循環結構,在循環結構內調用key_scan()函數。
-
單片機
+關注
關注
6043文章
44622瀏覽量
638518 -
鍵盤
+關注
關注
4文章
859瀏覽量
39866 -
端口
+關注
關注
4文章
990瀏覽量
32206 -
鍵盤檢測
+關注
關注
0文章
4瀏覽量
5808
發布評論請先 登錄
相關推薦
評論