李文軍




【摘?要】把有限狀態機應用于按鍵的識別過程中,能夠識別按鍵抬起、按鍵短按、按鍵長按等三個狀態,并在此三狀態的狀態機上改進了按鍵的消除抖動的觸發時機,綜合考慮了在某些場景下,按鍵有效操作的準確識別和按鍵無效操作的干擾甄別的工作,提高了按鍵識別的準確性和抗干擾能力,并在單鍵識別的基礎上,把有限狀態機應用到雙鍵(兩個按鍵同時操作)觸發邏輯的識別過程中,同時完全兼容單個按鍵的任何操作(單個按鍵短按、單個按鍵短按抬起、單個按鍵長按、單個按鍵長按抬起等),同時還不會引起單鍵的誤操作,使之互不干擾,極大地擴展了多個按鍵間邏輯組合的可能性,使之能用最少的按鍵實現最多的邏輯功能。
【關鍵詞】有限狀態機;按鍵;抗干擾;雙鍵識別
1 引言
目前公司的很多型號的顯示器中多有按鍵的采集與使用,硬件平臺有不少是基于STM32平臺的,代碼是用標準C語言編寫,每個產品的按鍵需要實現的功能的難易也基本相同,大多為簡單的單鍵短按或者單鍵長按功能,所有其按鍵處理代碼有很大的通用性與相似性。按鍵處理代碼沿用的較多。但是在某型指示器的研發交付使用過程中,用戶的需求仍在大量頻繁的產生,其中就有必須要用到組合按鍵的邏輯功能,這就對按鍵的及時準確的采集與處理提出了相當高的要求,不巧的是,我們偶然發現此產品在使用過程中,其每一個按鍵在經過若干次按壓后,就會產生一次按鍵失效,判斷是軟件缺陷導致的問題,這就要求我們必須重新審視、優化我們一直以來的通用性的按鍵處理代碼,不僅要保證按鍵每一次采集的準確性和有效性,同時也要提高按鍵的抗干擾能力,最終達到解決組合按鍵功能擴展的目的。
2 單個按鍵的狀態遷移設計
對于單個按鍵的狀態變化,詳見圖1 單個按鍵的狀態遷移圖。
我們約定,如果按鍵原先為抬起動作,則記它從按下到有效按下的時間為t0時間,簡稱按鍵按下的消除抖動時間;
如果按鍵原先為按下動作,則記它從抬起到有效抬起的時間為t1時間,簡稱按鍵抬起的消除抖動時間;
1,一個按鍵的最初始動作記為按鍵抬起(標記為狀態0);
2,狀態0在按鍵按下持續時間小于t0時間后,仍為狀態0;
3,狀態0在按鍵按下持續時間不小于t0時間后,狀態遷移到按鍵按下(狀態1);
4,狀態1在按鍵抬起持續時間小于t1時間后,仍為狀態1;
5,按鍵按下(狀態1)在按鍵按下持續一段時間(為程序定義的按鍵長按的最短時間,一般取值在0.5秒~1.0秒之間)后,狀態遷移到按鍵長按(狀態2);
6,狀態1在按鍵抬起持續時間不小于t1時間后,設置短按抬起事件標志;
7,狀態2在按鍵抬起持續時間不小于t1時間后,設置長按抬起事件標志;
8,在狀態2下按鍵仍持續按下,如達到50×10毫秒時,設置長按按下事件標志a,如達到100×10毫秒時,設置長按按下事件標志b,如達到150×10毫秒時,設置長按按下事件標志c,依次類推,這樣就極大地、靈活地擴展了按鍵長按的事件個數,非常便于移植和修改;
9,在狀態2下按鍵仍持續按下,超過了設定的按鍵按下的最長時間后,認為按鍵卡死,狀態遷移到按鍵卡死(狀態3);
10,在設置抬起事件標志(短按抬起事件標志或者長按抬起事件標志)之后,按鍵抬起持續時間在小于主程序運行周期(一般為40毫秒)的兩倍時間后,即在小于80毫秒時間內,必須清除抬起事件標志,如若在應用層代碼中沒有人為調用后清除抬起事件標志,則按鍵處理程序會在規定時間內強制清除抬起事件標志,這就解決了按鍵抬起標志的干擾問題(一般由按鍵無效操作的引起)。
3 單鍵處理邏輯、雙鍵處理邏輯及狀態遷移設計
對于單鍵處理邏輯、雙鍵處理邏輯的綜合考慮以及兩個按鍵狀態的(簡稱雙鍵狀態)變化,詳見圖2單鍵、雙鍵處理以及雙鍵狀態遷移圖。
關于圖2中各個狀態的解釋說明見下表1 雙鍵狀態名稱說明。
關于圖2中雙鍵狀態間的遷移條件的說明見表2雙鍵狀態間的遷移條件說明。
結束語
這樣我們通過合理設計的單鍵狀態機和雙鍵狀態機,可以保證按鍵每一次采集的準確性和有效性,同時也要提高按鍵的抗干擾能力,最終達到解決組合按鍵功能擴展的目的,極大地擴展了多個按鍵間邏輯組合的可能性,使之能用最少的按鍵實現最多的邏輯功能,這在目前公司的產品中已得到非常好的運用,使用效果良好。
參考文獻:
[1] 何劍宇,劉兢兢.有限狀態機建模在嵌入式按鍵設計中的應用[J].沈陽師范大學學報:自然科學版,2012,30(2):168-171.
[2] 唐飛,查長理.基于有限狀態機的STM32系統按鍵識別方法[J].長春工業大學學報:自然科學版,2013,34(2):160-164.
(作者單位:太原航空儀表有限公司 顯示技術研究所)