采用布爾處理的鍵盤矩陣解讀方法分析
運用布爾處理技術對鍵盤矩陣進行掃描解讀: 運用“位”操作方式將整個鍵盤矩陣的掃描解讀過程歸結為一系列的“位”的操作;掃描解讀過程沒有鍵值計算、沒有鍵對應的特征值返回;為便于電路板的設計布線,構成鍵盤矩陣的輸入口線可以是集中在同一P口的,也可以是隨意分散在不同P口中的。整個鍵盤矩陣的掃描簡捷、高效,解讀更為明快準確。
關鍵詞 鍵盤矩陣 布爾處理 MCU 位操作 掃描解讀
引言
傳統的各類電子專業的教科書上以及可查閱的文獻資料中,有關MCU做鍵盤矩陣的掃描解讀,大都是通過逐行逐列掃描、鍵值計算、鍵對應特征量返回、查表等數據處理的方式來進行掃描解讀的。為此還得設定在求鍵值時以輔助保存原值的行值、列值緩沖寄存器等,有的為了保證鍵每閉合一次MCU只作一次處理,往往會在程序運行中等閉合鍵釋放后才對其進行鍵解釋處理。這樣鍵盤的掃描解讀頗占CPU時間,降低了CPU的工作效率。本文揭示的是一種基于布爾處理的新穎的鍵盤矩陣解讀方法。下面結合圖示并以6×5鍵盤矩陣解讀為例進行描述。
1? 程序結構
基于布爾處理的鍵盤矩陣解讀方法,也就是使整個鍵盤矩陣的掃描解讀過程都能歸結為系列的布爾“位”的操作。掃描解讀過程主要包括如下步驟:定義各標志位;鍵盤矩陣輸出線掃描;查詢有無鍵按下;查詢鍵解讀標志位;消抖動延時;查詢相對應的哪個輸示端口電平有變化;查詢相對應的哪個輸出端口輸出掃描電平;相對應的哪個鍵作具體的解釋處理;置位鍵解讀標志位,流程如圖1所示。
2? 步驟闡述
2.1? 定義各標志位
充分利用現行MCU內部能進行位操作的RAM資源,運用偽指令來定義系統中所牽涉的各標志位。由于偽指令所揭示的定義只寫在源程序的頭文件上,是不會產生可執行目標代碼的,因而對標志位定義的“操作”在圖1的程序流程簡圖中就沒有表述。
2.2? 鍵盤矩陣輸出線掃描
輸出線掃描過程也是通過逐個改變輸出行線端口的電平來實現的,如圖2所示。輸入口線平常所有端口都處于高電平狀態;輸出口線是逐個循環的輸出低電平,也就是任何時候只有一個口線輸出低電平;通過鍵的按下接通,才有可能拉低相對應輸入口線的端口電平。
如果系統中配置有數碼顯示電路,則電路結構如圖3所示。輸入口線平常也都處于高電平狀態;輸出口線卻是逐個循環的輸出高電平,通過反相組件后掃描線才成為低電平;通過鍵的按下接通,同樣拉低相對應輸入口線的端口電平。這樣將鍵盤輸出線掃描能與數碼顯示的位掃描程序合二為一了,也就能省卻了鍵盤掃描的單獨執行,把鍵盤掃描納入到系統掃描顯示的大循環中。
2.3? 查詢有無鍵按下
有無鍵按下自然是通過對鍵盤掃描輸入口狀況的查詢來確定的。有鍵按下,鍵盤掃描輸入端口也就相應有所改變了。如果輸入端口如圖2所示,是集中在同一個Pn口的(其中,n=0,1,2,…),那么可以用對整個Pn口的字節數據的判別來確定鍵有否按動;也可運用依次對Pn口的幾個端口Pn.y進行位的查詢來確定有無鍵按下,其中,y=0、1、2、3、4。
如果輸入口不是集中的,為了設計布線的方便而零亂分散于P0口、P2口……Pn口等不同的P口上,那么只能通過依次地對輸入各端口的位狀態變化的查詢來確定有否鍵按下。若檢查到有鍵按下,就轉入到鍵盤矩陣掃描解讀程序;若沒有鍵按下,則清一次鍵解讀標志位為邏輯0,為下次按鍵解讀作好準備。
2.4? 查詢鍵解讀標志位
檢查有鍵按下后首先查詢鍵解讀標志位的狀態是處于邏輯0還是邏輯1;若是邏輯0說明本次按鍵尚未解讀過,經消抖動延時后需進一步對鍵盤矩陣的輸出、輸入口線進行查詢來確定是哪一個鍵,并作相應處理。
若鍵解讀標志位是邏輯1,則表明本次按鍵已解讀過了,沒必要浪費CPU時間,可直接從鍵掃描處理程序中返回。這就實現了鍵每閉合一次,MCU只作一次處理的效果。改變了傳統的為了保證鍵每閉合一次,MCU只作一次處理,程序中需等待鍵釋放后才對其進行解釋的弊病。
2.5? 消抖動延時
當覺察有鍵按下、查詢鍵解讀標志位為0時,就置位消抖動延時標志位及其輔助位進入消抖動延時處理。消抖動延時的具體進行可調備用的消抖動延時程序;也可借助對系統大循環次數的計數或動用MCU內部定時器的中斷來實現消抖動延時,這樣就不必設置專門的延時程序而占用CPU的時間了。消抖動延時結束時清零消抖動延時標志位及其輔助位。
2.6? 查詢哪個輸入口線電平有變化
平常所有輸入端口都處于高電平,經消抖動延時后就查詢鍵盤矩陣各輸入口線的電平是否有被拉低。若一個端口也沒被拉低,則說明本次按鍵無效(可能是某種干擾引起的“抖動”),于是直接返回。
若依次查詢作為輸入的Pn.y各端口的其中某個端口電平被拉低,則表明本次按鍵是有效的,將跳轉至查詢與該口線交叉相關的那個輸出口線。
2.7? 掃描哪個輸出口線輸出有效電平
圖2所示的鍵盤矩陣電路結構中,輸出端口Pm.x與輸入端口Pn.y是直接由鍵連接交叉的。當鍵按下時哪一個輸入端口的電平被拉低確定后,則跳轉到查詢Pm.x(Pm.0、Pm.1、Pm.2、Pm.3、Pm.4、Pm.5)六個端口中是哪個端口輸出低電平,進而確定具體哪一個鍵按下,跳轉至幾號鍵進行解釋處理。任何時候掃描輸出低電平的端口是唯一的,也只有行掃描輸出低電平的那個Pm.x口,才會將列輸入Pn.y口的電平拉低。這時,鍵按下有效交叉的行、列相應端口都處于低電平。
若運用典型的51系列MCU的指令去寫匯編程序來解讀矩陣的具體鍵時,則有:
Key_scan:JNB Pn.y,Key_matrix_j
;當輸入端口Pn.y(y=0,1,2,3,4)被拉低時,跳轉至Key_matrix_j(j=y)
LJMPReturn
;若端口Pn.y一個也沒被拉低,則返回
Key_matrix_j: JNBPm.x,Key_gloze_i
;當知曉Pn.y的某個端口被拉低,則再查詢Pm.x(x=0,1,2,3,4,5)的哪個端口掃描輸出低電平來確定具體是i號按鍵,則跳轉至Key_gloze_i(i=1,2,3,…,29,30)以對i號鍵作相應的解釋處理
LJMPReturn
Key_gloze_1:…;1號鍵解釋處理
LJMPReturn
Key_gloze_2:…;2號鍵解釋處理
LJMPReturn
…
Key_gloze_29:…;29號鍵解釋處理
LJMPReturn
Key_gloze_30:…;30號鍵解釋處理
Return:RET;鍵盤矩陣掃描解讀返回
以上匯編語言所述的鍵盤矩陣掃描解讀過程,可借助圖4來較形象化地解釋。由圖4可見,每一Pn.y(y=0,1,2,3,4)口都與Pm.x(x=0,1,2,3,4,5)的6個口有關聯,而每一Pn.y口線與Pm.x的6個口線中任一口線相交都揭出一個鍵(i號),結合以上程序,若輸入端口Pn.0被拉低,且是端口Pm.1有效掃描輸出低電平,則有(JNBPn.0,Key_matrix_0)指令跳轉至Key_matrix_0,繼而查詢輸出端口(JNBPm.1,Key_gloze_6)跳轉至Key_gloze_6,也就是先查詢到Pn.0被拉低跳轉至Key_matrix_0→再查詢到Pm.1掃描輸出低電平跳轉至Key_gloze_6→揭出是6號鍵按下并賦予其相應的解釋處理。以此類推。
如果鍵盤矩陣的電路結構如圖3所示,其掃描輸出端口Pm.x不是直接與輸入端口Pn.y交叉的,而是經過用于數碼顯示位驅動的反相組件后再與入端口Pn.y交叉的。為此,其掃描輸出有效端口不是低電平了,而是輸出高電平經反相組件后再成為低電平,通過按鍵同樣將與之交叉的輸入端口線拉低。所以,在查詢輸入端口時與圖2所示的是相同的,而在查詢掃描輸出有效端口時與圖2的就有所不同了。
圖2所示電路結構查詢的是哪個端口掃描輸出低電平,有:
JNBPm.x,Key_gloze_i;
圖3所示電路結構查詢的卻是哪個端口掃描輸出高電平,則:
JBPm.x,Key_gloze_i;
由圖4可知,若輸入端口Pn.2被拉低,且是端口Pm.3有效掃描輸出高電平,則有先查詢到Pn.2被拉低→再查詢到Pm.3掃描輸出高電平→揭出是18號鍵按下并賦予其相應的解釋處理。依此類推。具體的程序跳轉如圖5所示,可見其過程都是位的查詢跳轉。
2.8? 執行各對應鍵具體處理
因為輸出口線為行線,與輸入口線為列線的交叉點是唯一的,故確定了輸出哪一端口與輸入哪一端口,也就確定了具體哪一個鍵(i號鍵)按下了,就能賦予該鍵相應的解釋處理。整個過程中,沒必要區別哪個是數字鍵、哪個是功能鍵。每一個鍵的解讀都是等價的,是數字鍵就直接賦予其相應的數值處理,是功能鍵就直接賦予其具體的功能解釋。
2.9? 置位鍵解讀標志位
為保證鍵每閉合一次MCU只作一次處理,每一次鍵解讀后都將置鍵解讀標志位為邏輯1。對于鍵解讀標志位的置位,可以在每一個鍵解釋處理完畢后進行,也可在消抖動延時后就進行一次總置。不管鍵有多少個,鍵解讀標志位用的卻是同一個。
其實,引入了鍵解讀標志位,不只是控制鍵每閉合一次MCU只作一次處理,還可對那些持久按著的鍵有控地進行多次處理(如用于對一些數據遞進、或遞減的連續設置等)。
3? 原理綜述
本文提出基于布爾處理的鍵盤矩陣解讀方法。其原理如下:
在鍵盤矩陣掃描時,首先檢查有否鍵按動。若無鍵按動,則清零一次鍵解讀標志位就返回;若有鍵按下,則再查詢鍵解讀標志位是邏輯0還是邏輯1。如果是邏輯1,表明本次按鍵已解讀過,可直接從鍵掃描處理程序中返回;如果是邏輯0,說明本次按鍵尚未解讀過,則啟用消抖動延時。經消抖動延時后即查詢鍵盤矩陣輸入口線的各端口是否有拉低。若一個端口也沒被拉低,則說明本次按鍵無效,那可能是某種干擾引起的“抖動”,立即從鍵掃描處理程序中返回;若查詢到其中之一端口的電平被拉低了,則表明本次按鍵盤是有效的,將跳轉查詢與之相交的那個掃描有效輸出口線,進而確定具體是哪一個鍵按下,并跳轉賦予其相應的解釋處理。解釋處理后,置鍵解讀標志位為邏輯1再返回,即完成一次鍵盤矩陣的掃描解讀。
不管鍵盤矩陣有多少個鍵,其掃描確定一個具體鍵所需位查詢的總次數S不會大于行數x與列數y之和;但也不少于2次,即2≤S≤x+y。如上述的6×5矩陣,最多所需位查詢總次數S=5+6=11。當第30號鍵按下,查詢到最后一列Pn.4端口電平被拉低,繼而跳轉查詢到有效掃描輸出是最后一行Pm.5端口;但至少所需位查詢總次數S=1+1=2。當1號鍵按下,先查詢到第1列Pn.0端口電平被拉低,繼而跳轉查詢到有效掃描輸出是第1行Pm.0端口。
結語
運用布爾位操作處理進行鍵盤矩陣的解讀,可適用于所有基于MCU的智能化儀器儀表中鍵盤矩陣的解讀。運用布爾位操作方式,改變了傳統的用數據字節處理方式。掃描解讀過程中,沒有鍵值計算,沒有鍵對應的特征值返回,同時也省去了求鍵值時以輔助保存原值的行值、列值緩沖寄存器等,有的只是位的操作查詢。構成鍵盤矩陣的輸入口線可以是連續的,也可以是不連續的。在電路設計布線時,哪一個端口方便就用哪個端口作鍵盤矩陣輸入線。換言之,輸入口線可隨意分散在不同P口中,這種靈活、便捷的方式是傳統的用鍵值處理的方式所不及的;同時也改變了傳統的為了保證鍵每閉合一次MCU只作一次處理,需等待鍵釋放后才對其進行鍵解釋處理的做法。整個鍵盤矩陣的掃描顯得簡捷、高效,鍵盤矩陣的解讀更為明快、準確。
評論
查看更多