?

基于狀態機的單片機按鍵短按長按功能的實現

2018-01-17 10:43吳允強吳由松
電子技術與軟件工程 2017年23期
關鍵詞:狀態機按鍵

吳允強++吳由松

摘 要 本文介紹了一種基于狀態機的單片機按鍵的實現,通過狀態機實現按鍵的短按與長按的功能,同時改進按鍵消抖的方法,使單片機在節約CPU的資源的同時實現按鍵的各種狀態的檢測,提高單片機的工作效率,整個設計代碼簡潔,方便維護。

【關鍵詞】狀態機 按鍵 長按

1 引言

在自己在科研實踐和對學生教學中發現,現在單片機學習中對于按鍵處理的方法都是:檢測按鍵、延時消抖、按鍵執行、等待釋放,整個按鍵處理的程序中大量出現“delay_1ms(5);”和“while(!key);”這樣的語句,這明顯是在給自己找麻煩,延時消抖與等待釋放需要消耗CPU運行時間,執行效率低下,而且這種方法處理的按鍵程序也實現不了按鍵的短按、長按等靈活的按鍵操作方式。本文講述了一種用狀態機實現按鍵掃描的方法,達到按鍵的短按和長按功能,高效的處理按鍵消抖問題。

2 狀態機

狀態機在軟件編程中非常重要,一個思路清晰而且高效的程序,必然有狀態機的身影浮現。比如在按鍵命令解析程序中,本來是在狀態1中,觸發一個按鍵后切換到狀態2,再觸發另一個按鍵切換到狀態3,或者返回到狀態1。按鍵的擊鍵過程也是一種狀態的切換,也可以看著是一個狀態機,一個按鍵的擊鍵過程包括:按下、抖動、閉合、抖動和釋放等狀態。我們只要把這些狀態機的思想想辦法用程序表示出來就可以了。

3 按鍵的狀態機實現

我們這里用狀態機是為解決問題的,那么我們就要從問題本身去思考。為了實現按鍵掃描,達到按鍵短按和長按的功能,可以根據一個按鍵從按下按鍵到釋放按鍵的整個過程將按鍵分為4個狀態:

S0:等待按鍵按下

S1:按鍵按下

S2:等待按鍵短按釋放

S3:等待按鍵長按釋放

假設按鍵按下為低電平“0”,按鍵未按下為高電平“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,設計狀態機按鍵掃描程序。

程序代碼如下:

#define S0 0 //狀態0

#define S1 1 //狀態1

#define S2 2 //狀態2

#define S3 3 //狀態3

void key()

{static unsigned char state=S0,key_time;

unsigned char key;

key=P1&0xf0; //屏蔽P1低四位

switch (state) //檢測狀態

{case S0://狀態0

if(key!=0xf0)state=S1;break; //判斷輸入是否為0,為0轉入狀態1

case S1://狀態1

if(key==0xf0)state=S0; //判斷輸入是否為1,為1返回狀態0

else //否則,轉入狀態2,執行按鍵程序

{state=S2;

switch (key)

{case 0xe0:/*按鍵1執行程序*/break;

case 0xd0:/*按鍵2執行程序*/break;

case 0xb0:/*按鍵3執行程序*/break;

case 0x70:/*按鍵4執行程序*/break;}} break;

case S2://狀態2

if(key==0xf0)state=S0;//判斷輸入是否為1,為1返回狀態0

else if(++key_time==100){key_time=0;state=S3;}break;

//否則開始計時,計時結束轉入狀態3

case S3://狀態3

if(key==0xf0)state=S0;//判斷輸入是否為1,為1返回狀態0

else if(++key_time==5)//否則開始計時,計時結束按鍵連擊

{key_time=0;

switch (key){

case 0xe0:break;

case 0xd0:break;

case 0xb0:break;

case 0x70:break;}

}break;}}

4 中斷處理按鍵消抖

通常使用的按鍵都是機械彈性按鍵,也就是輕觸開關。機械按鍵在觸點的閉合和斷開的過程中會產生抖動,一個按鍵在按下時不會立刻穩定的導通,在釋放時也一樣,不會一下子就斷開,在按下和釋放瞬間都會有一連串的抖動現象。按鍵的抖動時間有按鍵的機械特性決定,一般情況為5ms~10ms。這種抖動人是感覺不出來的,但是單片機的運行速度是微秒級的,這里可以設計一個定時中斷來檢測按鍵的狀態,通過定時中斷來消除按鍵抖動問題。因此可以把定時器的時間設置為10ms,每隔10ms進入一次中斷檢測一次按鍵的狀態。

5 總結

本文介紹的這種以狀態機來實現按鍵檢測的方法,與一般的按鍵檢測方法相對比,能完成案件的多種狀態的檢測,實現按鍵的短按和長按功能。采用狀態機編寫的按鍵程序也大大的改進了按鍵消抖對CPU運行時間消耗的問題。程序代碼簡單,維護方便,適用范圍廣。

參考文獻

[1]黃小華.單片機中的按鍵處理方法[J].電子科技,2014(19):1.

[2]陳曉麗.按鍵的多種狀態檢測及消抖處理方法[J].家電科技,2013(04):68-70.

作者單位

南昌理工學院 江西省南昌市 330044endprint

猜你喜歡
狀態機按鍵
基于有限狀態機的按鍵檢測程序設計
基于有限狀態機的交會對接飛行任務規劃方法
按鍵消抖在單片機和FPGA實驗教學中的應用
一種多方向導光按鍵結構設計
基于狀態機比對的狀態機推斷方案
雙口RAM讀寫正確性自動測試的有限狀態機控制器設計方法
基于有限狀態機的STM32系統按鍵識別方法
按鍵的多種狀態檢測及消抖處理方法
解析某型號手機按鍵檢測程序的缺陷
FPGA設計中狀態機安全性研究
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合