秦國棟(廣西大學 電氣學院,南寧 530004)
0 引言
一般的按鍵驅動程式通常非常簡單。在程式 中一旦檢測到按鍵輸入口為低電平時,就採用軟體延時10 ms後再次檢測按鍵輸入口。如果仍然是低電平則表示有按鍵按下,便轉入執行按鍵處理程式;否則,當按鍵輸入口為高電平,就會放棄本次按鍵的檢測,重新開始 一次按鍵檢測過程。這種方式不僅由於採用了軟體延時而使得mcu的效率降低,同時也不容易同系統中其他功能模組協調工作,且系統的實時性也差。本文把單個 按鍵作為乙個簡單的系統,根據狀態機的原理對其動作的操作和確認的過程進行分析,並用狀態圖表示出來,然後根據狀態圖編寫出按鍵介面程式。
1 基於狀態機的簡單按鍵驅動設計
在乙個嵌入式系統中,按鍵的操作是隨機的。為了提高cpu的工作效率,在設計按鍵驅動的時候,利用 s3c2440的外部中斷來實現對按鍵的處理。很明顯,系統的輸入訊號與按鍵連線的i/o口電平,「1」表示按鍵處於開放狀態,「0」表示按鍵處於閉合狀 態。而系統的輸出訊號則表示檢測和確認到一次按鍵的閉合操作,用「1」表示。
圖1給出了乙個簡單按鍵狀態機的狀態轉換圖。
在圖中,將1次按鍵完整的操作分解為3個狀態。其中,狀態0為按鍵的初始狀態,當按 鍵輸入為「1」時,表示按鍵處於開放,輸出「0」(i/0),下一狀態仍為狀態0;當按鍵輸入為「0」時,表示按鍵閉合,但輸出還是「0」(沒有經過消 抖,不能確認按鍵真正按下),下一狀態進入狀態1。
狀態1為按鍵閉合確認狀態,它表示在10 ms前按鍵為閉合的,因此當再次檢測到按鍵輸入為「0」時,可以確認按鍵被按下了(經過10 ms的消抖);輸出「1」則表示確認按鍵閉合(0/1),下一狀態進入狀態2。而當再次檢測到按鍵的輸入為「1」時,表示按鍵可能處在抖動干擾;輸出為 「0」(i/0),下一狀態返回到狀態0。這樣,利用狀態1,實現了按鍵的消抖處理。狀態2為等待按鍵釋放狀態,因為只有等按鍵釋放後,一次完整的按鍵操 作過程才算完成。
對圖1的分析可知,在一次按鍵操作的整個過程中,按鍵的狀態是從狀態0→狀態1→狀態2,最後返回到狀態0的,並且在整 個過程中,按鍵的輸出訊號僅在狀態1時給出了唯一的一次確認按鍵閉合的訊號「1」,其他狀態均輸出「0」。因此,圖1狀態機所表示的按鍵系統,不僅克服了 按鍵抖動的問題,同時也確保在一次按鍵的整個過程中,系統只輸出一次按鍵閉合訊號(「1」)。
2 具有連發功能的按鍵驅動設計
上 面介紹的是最簡單的情況,不管按鍵被按下的時間保持多長,在這個按鍵的整個過程中都只給出了一次確認的輸出。但是有些場合為了方便使用者,根據使用者按按 鍵的時間多少來確定是否按鍵「連發」。例如,在設定時鐘時,按按鍵的時間較短時,設定加1;按按鍵時間較長時,設定加10,這時就需要根據按按鍵的時間長 短來確定具體輸出。圖2是將按鍵驅動設計為具有連發功能狀態機的狀態轉換圖。
當按鍵按下後1 s內釋放了,系統輸出為1;當按鍵按下後1 s沒有釋放,那麼以後每隔0.5 s,輸出為2,直到按鍵釋放為止。如果系統輸出1,應用程式將變數加1;如果系統輸出2,應用程式將變數加10。這樣按鍵驅動就有了處理連發按鍵的功能 了。
3 程式設計
由於篇幅所限,下面只給出按鍵驅動的關鍵程式,按鍵中斷處理程式和時間處理函式:
這裡的定時函式使用了linux的核心定時器。使用核心定時器可以方便地實現每個狀 態的特定定時時間,並且安全釋放cpu,提高cpu的效率。程式的基本思路是,首先按鍵被按下進入按鍵中斷服務程式 buttons_interrupt(),在中斷服務程式裡確定按鍵狀態是否為初始態。如果是,則進行kbd_timer初始化且使按鍵狀態轉為消抖狀 態。當kbd_timer定時到以後,按鍵檢測按鍵狀態是否仍處於按下時轉換狀態為按鍵確定狀態,如果不是則恢復初始態。當定時器1 s到達後,判斷按鍵是否仍是按下。如是則轉換為連發狀態,否則恢復初始態。當0.5 s到達後,重新判斷按鍵是否仍是按下。如是,則繼續為連發狀態,輸出值加10;如果按鍵抬起,則恢復初始態。
4 實驗結果
該 驅動程式經過gcc-arm-liunx-3.4.4編譯,並在micro2440sdk開發板上執行(開發板上的系統版本為linux2.6.13), 執行結果如圖3所示。
從執行結果可以看出,如果按下按鍵並在1 s抬起,輸出值每次只加1;如果按下按鍵超過1 s,系統的輸出值每隔0.5s將加10。說明本驅動執行正常,且具有了連發功能。
結 語
本 文主要分析了按鍵有限狀態機的工作過程,並利用liunx核心定時器實現了狀態機的狀態轉換時間間隔,最後給出了基於有限狀態機的具有連發功能linux 驅動編寫**,實現了具有連發功能的按鍵驅動,為基於有限狀態機的按鍵驅動提供了一種解決思路。
有限狀態機
有限狀態機 finite state machine,fsm 又稱有限狀態自動機,簡稱狀態機,是表示有限個狀態以及在這些狀態之間的轉移和動作等行為的數學模型。狀態儲存關於過去的資訊,就是說 它反映從系統開始到現在時刻的輸入變化。轉移指示狀態變更,並且用必須滿足來確使轉移發生的條件來描述它。動作是在給...
有限狀態機
以前,只碰到過 陣列中所有數字只出現2次,只有乙個出現1次,找這個數的問題 每次迴圈異或陣列中元素,最後的結果就是single one。這次換作出現3次就懵逼了,主要原因,沒有使用過有限狀態機,應該說是連概念都沒有,所以這次一定要好好記錄一下 關於這道題的解釋discussion中woshidais...
有限狀態機
需要掌握的名詞 數字系統有兩大類有限狀態機 finite state machine,fsm moore狀態機和mealy狀態機。狀態機名 次態輸出 moore摩爾 f 現狀,輸入 g 現狀 mealy公尺粒 f 現狀,輸入 g 現狀,輸入 mealy型狀態機 下一狀態不但與當前狀態有關,還與當前輸...