基於狀態機的微控制器按鍵短按長按功能的實現

2022-02-05 02:23:01 字數 1989 閱讀 5339

發表於 2017-12-28 08:43:46

控制/mcu

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

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

我們這裡用狀態機是為解決問題的,那麼我們就要從問題本身去思考。為了實現按鍵掃瞄,達到按鍵短按和長按的功能,可以根據乙個按鍵從按下按鍵到釋放按鍵的整個過程將按鍵分為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()

}break;

cases2://狀態2

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

elseif(++key_time==100)break;

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

cases3://狀態3

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

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

}break;}}

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

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

微控制器按鍵檢測,狀態機編寫

include include define key1 rb5 define key state 0 0 define key state 1 1 define key state 2 2 int key number 0 unsigned char read key void else key s...

微控制器 按鍵定時器檢測 短按 長按

通過使用定時器計數的方法來分辨按鍵的 短按 長按 檢測到引腳被拉低 按鍵按下為低電平,沒有按下為高電平 延時10毫秒 濾波 引腳還是被拉低 確定按鍵被按下 設定按鍵按下標誌 開啟定時器,開始計數 定時器中有乙個全域性變數用於記錄計數值 直到引腳被拉高 按鍵被釋放將為高電平 關閉定時器 檢測按鍵按下標...

微控制器學習07 狀態機

簡介資料 有限狀態機 fsm 是表示有限個狀態及在這些狀態之間的轉移和動作等行為的數學模型,通常fsm包含幾個要素 狀態的管理 狀態的監控 狀態的觸發 狀態觸發後引發的動作。1 數學語言描述如下 乙個有限狀態機m是乙個五元組,m k,e,t,s,z 其中 1 k是乙個有窮集,其中的每個元素稱為狀態 ...