鍵盤是單片機(jī)與用戶交互設(shè)備之一,用戶通過鍵盤輸入數(shù)據(jù)或命令到單片機(jī)。最簡單的鍵盤僅有一個(gè)按鍵,復(fù)雜一些的鍵盤有多個(gè)按鍵。在單片機(jī)的外圍電路中,通常用到的按鍵都是機(jī)械彈性開關(guān),當(dāng)用戶按下按鍵時(shí),按鍵閉合,用戶松開按鍵后,按鍵斷開,單片機(jī)如何檢測到按鍵被按下或釋放呢?
按鍵一般與單片機(jī)的I/O口連接,按鍵的一端連接I/O口,另一端接地,與按鍵連接的I/O端口會(huì)被賦值為高電平,單片機(jī)鍵盤檢測程序會(huì)持續(xù)檢測該I/O端口的電平,若檢測到該端口由高電平變?yōu)榈碗娖?,說明與該端口連接的按鍵被按下,因?yàn)榘存I閉合后,相當(dāng)于I/O端口通過按鍵與地直接連接,導(dǎo)致該I/O端口變?yōu)榈碗娖健?/p>
按鍵的連接非常簡單,如下圖所示,按鍵的一端與任一I/O端口相連,另一端與地連接。
機(jī)械按鍵被按下后,會(huì)發(fā)生抖動(dòng)現(xiàn)象,導(dǎo)致電平在按下階段和釋放階段不會(huì)立即變?yōu)榈碗娖?,而是呈現(xiàn)鋸齒狀。下圖是按鍵按下時(shí)的電壓變化。
機(jī)械按鍵被按下或釋放后,抖動(dòng)時(shí)間大約為5~10ms,此時(shí)電壓不穩(wěn)定,呈鋸齒形,檢測程序無法檢測按鍵是否被按下,因此編寫按鍵檢測程序時(shí),需要進(jìn)行抖動(dòng)延時(shí)處理。按鍵檢測流程如下圖所示:
檢測程序持續(xù)檢測與鍵盤連接的I/O端口,當(dāng)檢測到I/O端口電壓出現(xiàn)波動(dòng)時(shí),延時(shí)10ms,然后再次檢測I/O端口,若I/O端口為低電平,說明按鍵被按下,同時(shí)還要檢測按鍵是否被釋放,檢測按鍵是否被釋放時(shí),就不需要對抖動(dòng)進(jìn)行延遲處理了。
按鍵檢測應(yīng)用案例:應(yīng)用兩個(gè)按鍵分別控制發(fā)光二極管D1和D2的通斷,按鍵1與單片機(jī)P2.0連接,按鍵2與P2.1端口連接,D1和D2分別與單片機(jī)P1.0、P1.1口連接,按下按鍵1,D1狀態(tài)反轉(zhuǎn),按下按鍵2,D2狀態(tài)反轉(zhuǎn)。
下圖是按鍵檢測案例電路設(shè)計(jì)圖:
在P2.0和P2.1端口分別接入兩個(gè)按鍵,按鍵的另一端接地。D1和D2發(fā)光二極管分別連接到單片機(jī)的P1.0和P1.1端口。
單片機(jī)內(nèi)運(yùn)行的完整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為單片機(jī)P2.0端口和P2.1端口,用于檢測按鍵狀態(tài)。位變量led_one和led_two為單片機(jī)P1.0和P1.1端口,用于控制D1和D2的狀態(tài)。函數(shù)delay()是延遲函數(shù),參數(shù)millisecond用于設(shè)置延遲的毫秒數(shù)。
key_scan是按鍵檢測函數(shù),分別檢測P2.0端口和P2.1端口電平變化,若檢測到端口電平為低電平時(shí),延時(shí)10ms后,若該端口依然是低電平,則確認(rèn)與該端口連接的按鍵被按下,然后使用while循環(huán)等待按鍵的釋放,循環(huán)條件是端口變換為高電平,最后取反led_one或led_two的電平。
main()函數(shù)主要完成按鍵的循環(huán)檢測,具體實(shí)現(xiàn)方法是在函數(shù)內(nèi)部實(shí)現(xiàn)一個(gè)無限循環(huán)結(jié)構(gòu),在循環(huán)結(jié)構(gòu)內(nèi)調(diào)用key_scan()函數(shù)。
-
單片機(jī)
+關(guān)注
關(guān)注
6035文章
44554瀏覽量
634594 -
鍵盤
+關(guān)注
關(guān)注
4文章
859瀏覽量
39647 -
端口
+關(guān)注
關(guān)注
4文章
963瀏覽量
32051 -
鍵盤檢測
+關(guān)注
關(guān)注
0文章
4瀏覽量
5792
發(fā)布評論請先 登錄
相關(guān)推薦
評論