最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網 會員登陸 & 注冊

STM32按鍵消抖——入門狀態(tài)機思維

2022-08-07 22:48 作者:碼農愛學習-B站  | 我要投稿

在嵌入式軟件開發(fā)中,狀態(tài)機編程是一個十分重要的編程思想,它也是嵌入式開發(fā)中一個常用的編程框架。掌握了狀態(tài)機編程思想,可以更加邏輯清晰的實現(xiàn)復雜的業(yè)務邏輯功能。

1 狀態(tài)機思想

狀態(tài)機,或稱有限狀態(tài)機FSM(Finite State Machine),是一種重要的編程思想。

狀態(tài)機有3要素:狀態(tài)事件響應

  • 狀態(tài):系統(tǒng)處在什么狀態(tài)?

  • 事件:發(fā)生了什么事?

  • 響應:此狀態(tài)下發(fā)生了這樣的事,系統(tǒng)要如何處理?

狀態(tài)機編程前,首先要根據需要實現(xiàn)的功能,整理出一個對應的狀態(tài)轉換圖(狀態(tài)機圖),然后就可以根據這個狀態(tài)轉換圖,套用狀態(tài)機編程模板,實現(xiàn)對應是狀態(tài)機代碼了。

狀態(tài)機編程主要有 3 種方法:switch-case 法、表格驅動法、函數指針法,本篇先介紹最簡單也最易理解的switch-case 法

2 狀態(tài)機實例

下面以按鍵消抖功能,來介紹switch-case 法的狀態(tài)機編程思路。

2.1 按鈕消抖狀態(tài)轉換圖

狀態(tài)機機編程前,首先要明確的對應功能的狀態(tài)機需要幾個狀態(tài),本例的按鍵功能,只檢測最基礎的按下與松開狀態(tài)(暫不實現(xiàn)長按、雙擊等狀態(tài)),并增加對應的按鈕去抖功能,因此,需要用到4個狀態(tài):

  • 穩(wěn)定松開狀態(tài)

  • 按下抖動狀態(tài)

  • 穩(wěn)定按下狀態(tài)

  • 松開抖動狀態(tài)

對應的狀態(tài)轉換圖如下:

由于按鍵通常處于松開狀態(tài),這里讓狀態(tài)機的初始化狀態(tài)為松開狀態(tài),然后在這4個狀態(tài)中來回切換。

圖中的VT代表按鍵檢測到電平,VT=0即檢測到低電平,可能是按鍵按下,由初始的“穩(wěn)定松開”狀態(tài)轉為“按下抖動”狀態(tài)

當持續(xù)檢測到低電平(VT=0)一段時間后,認為消抖完成,由“按下抖動”狀態(tài)轉為“穩(wěn)定按下”狀態(tài)

在“按下抖動”狀態(tài)時,在指定的一段時間內,再次檢測到高電平(VT=1),說明確實是按鈕抖動(比如按鍵被快速撥動了一下又彈起,或強烈震動導致的按鍵抖動),則由“按下抖動”狀態(tài)轉為“穩(wěn)定松開”狀態(tài)

2.2 編程實現(xiàn)

2.2.1 狀態(tài)定義

對應上面的按鈕狀態(tài)圖,可以知道需要用到4個狀態(tài):

  • 穩(wěn)定松開狀態(tài)(KS_RELEASE)

  • 按下抖動狀態(tài)(KS_PRESS_SHAKE)

  • 穩(wěn)定按下狀態(tài)(KS_PRESS)

  • 松開抖動狀態(tài)(KS_RELEASE_SHAKE)

這里使用枚舉來定義這4個狀態(tài)。為了在調試時,能夠把對應狀態(tài)名稱以字符串的形式打印出來,這里使用宏定義的一個小技巧:

#符號+自定義的枚舉名稱

即可自動轉變?yōu)樽址问剑賹⑦@些字符串放到const char* key_status_name[]數組中,便可通過數組的形式訪問這些狀態(tài)的字符串名稱形式。

此外,為了不重復書寫枚舉名稱與對應的枚舉字符串(#+枚舉名稱),進一步使用宏定義的方式,只定義一次狀態(tài),然后通過下面兩條宏定義,實現(xiàn)對枚舉項枚舉項對應的字符串的分別獲?。?/p>

具體是宏定義、枚舉定義與枚舉名稱數組聲明如下:

宏定義不便理解的,可以將宏定義分別帶入,轉為最終的結果,理解替代后的具體形式,比如下面的宏定義帶入替換示意:

2.2.2 狀態(tài)機實現(xiàn)

下面是狀態(tài)機的具體實現(xiàn):

  • 狀態(tài)機函數key_status_check在一個循環(huán)中,被每隔10ms調用一次

  • 定義一個g_keyStatus表示狀態(tài)機所處的狀態(tài)

  • 在每個循環(huán)中,switch根據當前的狀態(tài),執(zhí)行對應狀態(tài)所需要執(zhí)行的邏輯

  • 定義一個g_DebounceCnt用于消抖時間計算,當持續(xù)進入消抖狀態(tài),每次循環(huán)(10ms)中將此值加1,持續(xù)一定次數(5次,即50ms),認為是穩(wěn)定的按下或松開,消抖完成,跳轉到穩(wěn)定方向或穩(wěn)定松開狀態(tài)

  • 在每個狀態(tài)的執(zhí)行邏輯中,當檢測到某些條件滿足時,跳轉到其它的狀態(tài)

  • 通過狀態(tài)的不斷跳轉,實現(xiàn)狀態(tài)機的運行

  • 此外,為方便觀察狀態(tài)機中狀態(tài)的變化,定義了一個g_lastKeyStatus表示前一狀態(tài),當狀態(tài)發(fā)生變化時,可以將狀態(tài)名稱打印出來

注:本例程需要使用一個按鍵,需要初始化對應的GPIO,這里不再貼代碼。

2.3 使用測試

將完整的代碼編譯后燒錄到板子中,連接串口,按下與松開按鍵,觀察串口輸出信息。

我的測試輸出信息如下:

前兩次撥動按鍵模擬按鈕抖動的情況,可以看到串口打印出兩次從松開到按下抖動的狀態(tài)切換。

然后是按下按鍵,再松開按鍵,可以看到狀態(tài)的變化:松開 -> 按下抖動 -> 按下 -> 松開抖動 -> 松開

3 總結

本篇介紹了嵌入式軟件開發(fā)中常用的狀態(tài)機編程實現(xiàn),并通過按鍵消抖實例,以常用的switch-case形式,實現(xiàn)了對應的狀態(tài)機編程代碼實現(xiàn),并通過測試,串口打印對應狀態(tài),分析狀態(tài)機的狀態(tài)跳轉過程。


STM32按鍵消抖——入門狀態(tài)機思維的評論 (共 條)

分享到微博請遵守國家法律
揭西县| 佛坪县| 宣城市| 铜鼓县| 孙吴县| 武定县| 宝丰县| 西和县| 日照市| 紫阳县| 四川省| 延庆县| 麻栗坡县| 汾阳市| 阳谷县| 泾阳县| 德惠市| 会昌县| 井研县| 阳东县| 云梦县| 彰武县| 额敏县| 巫溪县| 彰化县| 盈江县| 巩义市| 扬中市| 桃园市| 呼和浩特市| 广汉市| 磐安县| 轮台县| 西华县| 财经| 南川市| 集贤县| 石嘴山市| 灵宝市| 清涧县| 称多县|