STM32按鍵狀態(tài)機3——增加雙擊與功能優(yōu)化

仔細研究這個狀態(tài)圖,其它還存在一些問題:
長按狀態(tài),必須先經(jīng)過短按狀態(tài),即長按按鍵,會先觸發(fā)一個短按,再觸發(fā)一個長按。如果實際應用中需要分別使用短按和長按,則此狀態(tài)圖不滿足要求
本篇,就來解決上述兩個問題,并再增加一個按鍵雙擊檢測,實現(xiàn)一個功能更全面的按鍵檢測。
1 增加雙擊檢測
增加一個雙擊檢測,需要增加兩個狀態(tài):
等待再次按下
確認第2次按下
同時,之前的“短按狀態(tài)”和“長按狀態(tài)”分別改為“確認按下”和“確認長按”。
1.1 狀態(tài)圖修改
修改后的狀態(tài)圖如下,有以下幾點需要注意: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
“確認按下”不是短按觸發(fā)的條件,需要等松開后,經(jīng)消抖進入到“等待再次按下”一段時間后(200ms),沒有再次被按下,才觸發(fā)短按事件,這樣就解決了本篇開頭提到的第1個問題
“確認按下”不是短按觸發(fā)的條件,另一個用途是,當此狀態(tài)繼續(xù)保持按下狀態(tài)一段時間后(1s),則會單獨觸發(fā)長按事件,同時進入到“確認長按”狀態(tài),這樣就解決了本篇開頭提到的第2個問題
對于雙擊事件的檢測,首先按下按鍵進入“確認按下”狀態(tài),然后在1s內(nèi)松開進入“等待再次按下”狀態(tài),接著在200ms內(nèi)再次按下進入“確認第2次按下”狀態(tài),然后在1s內(nèi)松開,即可觸發(fā)雙擊事件,并同時進入“穩(wěn)定松開”狀態(tài)
注意,在“確認第2次按下”狀態(tài)下,如果在1s內(nèi)沒有松開,也會進入到“確認長按”狀態(tài)

1.2 程序編寫
根據(jù)狀態(tài)圖,修改對應的狀態(tài)機邏輯,修改后的代碼如下:
最后注釋掉的一句是調(diào)試打印,調(diào)試時可打開,方便觀察狀態(tài)變化
1.3 測試
短按、長按、雙擊的測試結(jié)果如下:

還有從確認第2次按下狀態(tài)到達的長按狀態(tài):

2 功能優(yōu)化
上面的代碼實現(xiàn),是在主函數(shù)中,每50ms延時執(zhí)行一次狀態(tài)機循環(huán)(主函數(shù)代碼如下),僅用做演示按鍵狀態(tài)機的運行機制。
實際開發(fā)中,按鍵檢測程序,應該作為一個獨立的模塊運行,當檢測到某一按鍵狀態(tài)觸發(fā)時,通知應用程序來使用。
對于stm32裸機開發(fā)來說,可以將按鍵狀態(tài)機放到一個定時器中斷服務函數(shù)中運行,當檢測到某一按鍵狀態(tài)觸發(fā)后,通知應用程序:
3 總結(jié)
本篇在前兩篇按鍵狀態(tài)機的基礎上,繼續(xù)介紹增加按鍵的雙擊功能,并解決之前狀態(tài)存在的兩個問題,通過實測驗證,演示短按、長按、雙擊的使用效果。最后對代碼結(jié)構(gòu)進行優(yōu)化,使其更符合實際開發(fā)應用。