switch
、case
或者if
、else
)切換狀態,通過改變狀態機狀態,讓程式按設定的順序執行。
有限狀態機由有限的狀態和相互之間的轉移構成,在任何時候只能處於給定數目的狀態中的乙個。當接收到乙個輸入事件時,狀態機產生乙個輸出,同時也可能伴隨著狀態的轉移。狀態機的原理如下:在當前狀態下,發生某個事件後轉移到下乙個狀態,然後決定執行的功能動作。可參考如下示意圖:
要想使用狀態機思想進行程式設計,需要將任務分解成有限個穩定狀態。
這裡以常見的按鍵動作進行舉例說明:
上圖為按鍵典型的動作圖,可以分解為四個狀態,分別為:
狀態1 = 按鍵彈起、
狀態2 = 前沿抖動、
狀態3 = 按鍵按下、
狀態4 = 後沿抖動。
有限狀態機的c**實現如下:
if (定時器 >= 10ms) //10ms是典型消抖時間
}
巧妙的使用結構體和列舉一方面可以便於擴充套件和維護狀態機的狀態和事件,另一方面可提高程式的可讀性。假設有3種狀態(狀態數可以隨意增加),狀態列舉如下:typedef enum state;
假設有5個事件(也可以隨意增加),事件列舉如下:typedef enumevent;
定義乙個結構體描述如下:typedef struct stateevent;
根據具體的應用場景調整state
和event
,並賦予相應的動作功能,整體的基本流程如下:當前狀態->有事件觸發->跳到下乙個狀態->具體的動作功能
總結
狀態機應用很廣泛,也可以鍛鍊邏輯思維,lora訊息推送也常採用狀態機的思想, 實際上狀態機涉及的知識點很多,本篇文章只是簡要的介紹了下微控制器c語言的狀態機程式設計思想,在日後的開發設計中,需要不斷的總結經驗並靈活應用。
c語言源**展示:常用轉換函式實現原理
modbus-rtu-crc16校驗方法c語言實現
keil用printf函式列印輸出設定
keil複製中文出現亂碼,該如何解決
微控制器c語言程式設計:利用keil程式設計環境實現精準延時
C語言 狀態機程式設計
狀態機原理 有限狀態機的工作原理如圖1所示,發生事件 event 後,根據當前狀態 cur state 決定執行的動作 action 並設定下乙個狀態號 nxt state fsm的實現方式 1 switch case或者if else 這無意是最直觀的方式,使用一堆條件判斷,會程式設計的人都可以做...
C語言狀態機程式設計
輸入一段字串,字串由字母和分隔符 空格,逗號,句號等 組成,寫乙個函式統計該字串中的單詞數。狀態 typedef enum count state t count state t 判斷函式 static intis end char ch static intis division char ch ...
c 中文輸出亂碼解決
今天給人寫個很簡單的整理資料的小程式,一開始用python寫。寫完想起對面沒有環境,轉回c 寫完輸出中文的時候直接自閉。c 對不同編碼的支援是真的菜.查了乙個下午,配了各種環境,結果發現沒有哪個庫把這個內容給封裝得很好,最後還是靠csdn的 解決的問題。把查到的 放這裡,方便以後再利用。感謝 踏莎行...