基於微控制器的快速按鍵識別方法

2022-06-05 01:03:05 字數 2117 閱讀 7371

摘要:在使用微控制器實現的智慧型控制系統中,快速、可靠的按鍵識別控制非常關鍵,一定程度上決定了整個系統的高效執行。本文在分析傳統的按鍵掃瞄或識別方法的基礎上,對比各種方法的優缺點,重點討論一種高效的按鍵識別方法,並給出該方法對應的程式設計思路,它可快速識別對按鍵的一次響應,解決多次冗餘響應的缺陷。

關鍵詞:微控制器按鍵識別一次響應中圖分類號:tp368.

12 文獻標識碼:a 文章編號:1007-9416(2012)08-0175-021、引言在以微控制器為核心控制的應用系統中,鍵盤按鍵能實現向微控制器輸入資料、傳送命令等功能,是微控制器應用系統中人工干預微控制器的主要手段。

而微控制器對按鍵閉合與否的判斷,主要是通過其引腳上的電壓高低進行的。本文以51微控制器為例說明,所述鍵盤按鍵的硬體電路設計也非常簡單——輕觸開關的一端接地,另一端連線微控制器引腳,該引腳同時接10k上拉電阻[1]。很明顯,微控制器引腳呈現高電平表示按鍵開關斷開;反之,引腳電壓呈現低電平表示按鍵開關閉合。

因此,對微控制器的按鍵識別只要通過對其引腳電平的高低狀態的檢測,即可確認按鍵按下與否[2]。眾所周知,按鍵為機械彈性開關,加之按鍵按下或抬起瞬間均會產生抖動現象,因此消除按鍵抖動也是整個系統的關鍵。為更突出本文的討論重點,這裡不再重點討論按鍵去抖的方法。

2、傳統按鍵識別方法2.1 簡單的按鍵識別該按鍵識別方法雖然簡單,但當按下按鍵的瞬間,卻可能讓系統多次迴圈處理同一按鍵事件,造成cpu資源的浪費。以下為該方法的程式設計思路,下述中的「按鍵確實按下」表示延遲10ms後,按鍵仍處於按下狀態。

(1)初始化按鍵;(2)if(按下按鍵)}else 微控制器程式可能是乙個迴圈執行的過程,當按鍵按下閉合,程式進入按鍵事件,執行完該事件,若按鍵仍未被抬起,則程式迴圈又再一次進入同樣的按鍵事件執行。事實上,如果採用12mhz外部晶振,微控制器處理器執行乙個指令通常只要2個機器週期的時間,也即4us。如此短暫的時間,當我們鬆開按鍵時,程式可能早已經迴圈執行很多次按鍵事件。

因此該按鍵識別的程式思路並不合適。為了不重複執行同乙個按鍵事件,可改進為如下所述的按鍵識別的方法:(1)初始化按鍵;(2)if(按下按鍵)}else 此方法雖然可識別按鍵釋放,即實現每一次按鍵,系統只會呼叫一次按鍵處理事件。

但若按鍵一直不釋放,則程式只可在此原地踏步等待,浪費系統執行時間,cpu每個時鐘週期均做無用功。解決方法是,在識別到第一次按鍵,並執行完按鍵事件後,將忽略後續的按鍵狀態,從而實現對按鍵的一次響應,解決多次冗餘響應的缺陷。2.

2 帶標誌的按鍵識別為了解決多次冗餘響應的缺陷,可設定按鍵按下與釋放兩種狀態的標誌,在程式執行過程中,檢測標誌位內容,識別按鍵的狀態。根據該思路,可在初始化按鍵時,設定按鍵按下與否的標誌位,並賦予「0」與「1」兩種狀態。標誌狀態為「0」表示按鍵無效,為「1」表示按鍵被按下。

以下為帶標誌位的按鍵識別的程式設計思路[2],這裡假定標誌位為key_mark,初始值為0。(1)初始化按鍵;(2)if(按下按鍵 && !key_mark)}else if(未按按鍵)該方法可行有效,其中標誌位key_mark起了至關重要的作用。

只有當按鍵按下,key_mark=0,且延遲10ms去抖後,程式才會確認是否真的有按鍵被按下。此時馬上對key_mark=1,使得下一次查詢key_mark標誌時,得知按鍵正處於按下狀態。如此,不僅使得按鍵被按下時可被準確檢測到,還可以在按鍵還沒被抬起釋放時,不重複響應同乙個按鍵事件。

由於此時標誌位key_mark的值被賦值為「1」,因此if(按下按鍵 && !key_mark)將不再成立,直到按鍵抬起,才重新賦值key_mark為「0」,實現了每一次按鍵,系統只會呼叫一次按鍵處理事件。3、快速按鍵識別方法對於程式設計師來說,實現同樣功能的程式,簡潔、高效對設計非常關鍵。

本文討論的快速按鍵識別方法,嘗試使用微控制器c語言中的邏輯運算方法,同樣快速有效地解決了按鍵識別的程式設計問題。該方法在初始化設定後,只需要使用一句異或運算語句,兩句賦值語句,即可快速進行按鍵識別。下面給出該快速按鍵識別方法的思路。

先初始化三個標誌位:key_now,key_old,key_change。其中,key_now表示當前讀取到的按鍵電平;key_old表示之前一次讀取到的按鍵電平;key_change表示按鍵被按下後出現的變化情況,即當key_change=0,表示按鍵處於斷開狀態,key_change=1,表示按鍵處於閉合狀態。

這三個標誌位的初始化值均為「1」。現在給出該方法的程式設計思路。(1)初始化按鍵(2)key_now = p1.

[?內容]

基於微控制器下的考勤機

2 用導線將 txd cpu模組 與 io iccard模組 相連 3 用導線將 t0 cpu模組 與 power iccard模組 相連 4 用導線將 int0 cpu模組 與 sw iccard模組 相連 5 用導線將 int1 cpu模組 與 p cpu掛箱 相連 有關8279模組和鍵盤模組的...

基於微控制器溫測系統

1 wire 網路具有嚴謹的控制結構,其結構如圖2.8所示,一般通過雙絞線與 1 wire 元件進行資料通訊,它們通常被定義為漏極開路端點,主 從式多點結構,而且一般都在主機端接上乙個上拉電阻 5v 電源。通常為了給 1 wire 裝置提供足夠的電源,需要乙個 mosfet 管將 1 wire 匯流...

基於微控制器的電梯課程設計

二 一四 二 一五學年第一學期 資訊科學與工程學院 自動化系 課程設計報告書 姓名 余義 學號 201204134019 班級 自動化1201班 課程名稱 微機原理與應用課程設計 指導教師 程磊 1 前言 1 2 現代電梯概述 3 3 硬體部分設計 6 4 軟體部分設計 12 5 電梯執行介面 52...