熱度 1|
在自己在科研實踐和對學生教學中發現,現在單片機學習中對于按鍵處理的方法都是:檢測按鍵、延時消抖、按鍵執行、等待釋放,整個按鍵處理的程序中大量出現“delay_1ms(5);”和“while(!key);”這樣的語句,這明顯是在給自己找麻煩,延時消抖與等待釋放需要消耗CPU運行時間,執行效率低下,而且這種方法處理的按鍵程序也實現不了按鍵的短按、長按等靈活的按鍵操作方式。本文講述了一種用狀態機實現按鍵掃描的方法,達到按鍵的短按和長按功能,高效的處理按鍵消抖問題。
2、狀態機狀態機在軟件編程中非常重要,一個思路清晰而且高效的程序,必然有狀態機的身影浮現。比如在按鍵命令解析程序中,本來是在狀態1中,觸發一個按鍵后切換到狀態2,再觸發另一個按鍵切換到狀態3,或者返回到狀態1。按鍵的擊鍵過程也是一種狀態的切換,也可以看著是一個狀態機,一個按鍵的擊鍵過程包括:按下、抖動、閉合、抖動和釋放等狀態。我們只要把這些狀態機的思想想辦法用程序表示出來就可以了。
3、按鍵的狀態機實現我們這里用狀態機是為解決問題的,那么我們就要從問題本身去思考。為了實現按鍵掃描,達到按鍵短按和長按的功能,可以根據一個按鍵從按下按鍵到釋放按鍵的整個過程將按鍵分為4個狀態:
S0:等待按鍵按下
S1:按鍵按下
S2:等待按鍵短按釋放
S3:等待按鍵長按釋放
假設按鍵按下為低電平“0”,按鍵未按下為高電平“1”,按鍵的整個過程我們就可以通過狀態轉移圖表示出來,如圖1所示。
圖1:按鍵的狀態轉移圖
首先,按鍵的初始狀態為S0,當檢測到輸入為1時,表示按鍵沒有按下,保持S0;當輸入為0時,表示按鍵按下,狀態轉入S1。在S1狀態中,檢測輸入信號是否為0,如果為0,執行按鍵程序轉入S2;如果為1,表示之前的按鍵操作是干擾信號,回到S0。在S2狀態中,如果輸入信號是1,則回到S0,表示按鍵短按已經釋放;如果按鍵沒有釋放,輸入為0時,就開始計時,計時沒有結束前一直在S2,當計時結束了,轉入S3,表示按鍵一直按著,為長按功能,在S2計時過程中,輸入從0變為1也會回到S0。在S3狀態中,輸入信號為1,返回S0,表示按鍵長按釋放;輸入信號為0,執行相應的按鍵程序,也可以計時,等計時結束執行按鍵程序,達到按鍵連擊的功能。這就是采用狀態機進行按鍵檢測達到短按與長按的整個過程。
下面以四個按鍵接在P1的P1.7、P1.6、P1.5、P1.4,設計狀態機按鍵掃描程序。
程序代碼如下:
#defineS00//狀態0
#defineS11//狀態1
#defineS22//狀態2
#defineS33//狀態3
voidkey()
{staticunsignedcharstate=S0,key_time;
unsignedcharkey;
key=P1&0xf0;//屏蔽P1低四位
switch(state)//檢測狀態
{caseS0://狀態0
if(key!=0xf0)state=S1;break;//判斷輸入是否為0,為0轉入狀態1
caseS1://狀態1
if(key==0xf0)state=S0;//判斷輸入是否為1,為1返回狀態0
else//否則,轉入狀態2,執行按鍵程序
{state=S2;
switch(key)
{case0xe0:/*按鍵1執行程序*/
break;
case0xd0:/*按鍵2執行程序*/break;
case0xb0:/*按鍵3執行程序*/break;
case0x70:/*按鍵4執行程序*/break;}}
break;
caseS2://狀態2
if(key==0xf0)state=S0;//判斷輸入是否為1,為1返回狀態0
elseif(++key_time==100){key_
time=0;state=S3;}break;
//否則開始計時,計時結束轉入狀態3
caseS3://狀態3
if(key==0xf0)state=S0;//判斷輸入是否為1,為1返回狀態0
elseif(++key_time==5)//否則開始計時,計時結束按鍵連擊
{key_time=0;
switch(key){
case0xe0:break;
case0xd0:break;
case0xb0:break;
case0x70:break;}
}break;}}
4、中斷處理按鍵消抖通常使用的按鍵都是機械彈性按鍵,也就是輕觸開關。機械按鍵在觸點的閉合和斷開的過程中會產生抖動,一個按鍵在按下時不會立刻穩定的導通,在釋放時也一樣,不會一下子就斷開,在按下和釋放瞬間都會有一連串的抖動現象。按鍵的抖動時間有按鍵的機械特性決定,一般情況為5ms~10ms。這種抖動人是感覺不出來的,但是單片機的運行速度是微秒級的,這里可以設計一個定時中斷來檢測按鍵的狀態,通過定時中斷來消除按鍵抖動問題。因此可以把定時器的時間設置為10ms,每隔10ms進入一次中斷檢測一次按鍵的狀態。
5、總結本文介紹的這種以狀態機來實現按鍵檢測的方法,與一般的按鍵檢測方法相對比,能完成案件的多種狀態的檢測,實現按鍵的短按和長按功能。采用狀態機編寫的按鍵程序也大大的改進了按鍵消抖對CPU運行時間消耗的問題。程序代碼簡單,維護方便,適用范圍廣。