探討布爾技術(shù)解讀鍵盤(pán)矩陣的方法

發(fā)布時(shí)間:2010-9-21 10:52    發(fā)布者:eetech
關(guān)鍵詞: 布爾 , 鍵盤(pán) , 矩陣
傳統的各類(lèi)電子專(zhuān)業(yè)的教科書(shū)上以及可查閱的文獻資料中,有關(guān)MCU做鍵盤(pán)矩陣的掃描解讀,大都是通過(guò)逐行逐列掃描、鍵值計算、鍵對應特征量返回、查表等數據處理的方式來(lái)進(jìn)行掃描解讀的。為此還得設定在求鍵值時(shí)以輔助保存原值的行值、列值緩沖寄存器等,有的為了保證鍵每閉合一次MCU只作一次處理,往往會(huì )在程序運行中等閉合鍵釋放后才對其進(jìn)行鍵解釋處理。這樣鍵盤(pán)的掃描解讀頗占CPU時(shí)間,降低了CPU的工作效率。本文揭示的是一種基于布爾處理的新穎的鍵盤(pán)矩陣解讀方法。下面結合圖示并以6×5鍵盤(pán)矩陣解讀為例進(jìn)行描述。  

1 程序結構  

基于布爾處理的鍵盤(pán)矩陣解讀方法,也就是使整個(gè)鍵盤(pán)矩陣的掃描解讀過(guò)程都能歸結為系列的布爾“位”的操作。掃描解讀過(guò)程主要包括如下步驟:定義各標志位;鍵盤(pán)矩陣輸出線(xiàn)掃描;查詢(xún)有無(wú)鍵按下;查詢(xún)鍵解讀標志位;消抖動(dòng)延時(shí);查詢(xún)相對應的哪個(gè)輸示端口電平有變化;查詢(xún)相對應的哪個(gè)輸出端口輸出掃描電平;相對應的哪個(gè)鍵作具體的解釋處理;置位鍵解讀標志位,流程如圖1所示。  

2 步驟闡述

2.1 定義各標志位  

充分利用現行MCU內部能進(jìn)行位操作的RAM資源,運用偽指令來(lái)定義系統中所牽涉的各標志位。由于偽指令所揭示的定義只寫(xiě)在源程序的頭文件上,是不會(huì )產(chǎn)生可執行目標代碼的,因而對標志位定義的“操作”在圖1的程序流程簡(jiǎn)圖中就沒(méi)有表述。



圖1 鍵盤(pán)矩陣掃描程序流程簡(jiǎn)圖

2.2 鍵盤(pán)矩陣輸出線(xiàn)掃描  

輸出線(xiàn)掃描過(guò)程也是通過(guò)逐個(gè)改變輸出行線(xiàn)端口的電平來(lái)實(shí)現的,如圖2所示。輸入口線(xiàn)平常所有端口都處于高電平狀態(tài);輸出口線(xiàn)是逐個(gè)循環(huán)的輸出低電平,也就是任何時(shí)候只有一個(gè)口線(xiàn)輸出低電平;通過(guò)鍵的按下接通,才有可能拉低相對應輸入口線(xiàn)的端口電平。  



圖2 鍵盤(pán)矩陣電路結構

如果系統中配置有數碼顯示電路,則電路結構如圖3所示。輸入口線(xiàn)平常也都處于高電平狀態(tài);輸出口線(xiàn)卻是逐個(gè)循環(huán)的輸出高電平,通過(guò)反相組件后掃描線(xiàn)才成為低電平;通過(guò)鍵的按下接通,同樣拉低相對應輸入口線(xiàn)的端口電平。這樣將鍵盤(pán)輸出線(xiàn)掃描能與數碼顯示的位掃描程序合二為一了,也就能省卻了鍵盤(pán)掃描的單獨執行,把鍵盤(pán)掃描納入到系統掃描顯示的大循環(huán)中。



圖3 帶數碼位矩陣電路結構

2.3 查詢(xún)有無(wú)鍵按下  

有無(wú)鍵按下自然是通過(guò)對鍵盤(pán)掃描輸入口狀況的查詢(xún)來(lái)確定的。有鍵按下,鍵盤(pán)掃描輸入端口也就相應有所改變了。

如果輸入端口如圖2所示,是集中在同一個(gè)Pn口的(其中,n=0,1,2,…),那么可以用對整個(gè)Pn口的字節數據的判別來(lái)確定鍵有否按動(dòng);也可運用依次對Pn口的幾個(gè)端口Pn.y進(jìn)行位的查詢(xún)來(lái)確定有無(wú)鍵按下,其中,y=0、1、2、3、4。  

如果輸入口不是集中的,為了設計布線(xiàn)的方便而零亂分散于P0口、P2口……Pn口等不同的P口上,那么只能通過(guò)依次地對輸入各端口的位狀態(tài)變化的查詢(xún)來(lái)確定有否鍵按下。若檢查到有鍵按下,就轉入到鍵盤(pán)矩陣掃描解讀程序;若沒(méi)有鍵按下,則清一次鍵解讀標志位為邏輯0,為下次按鍵解讀作好準備。  

2.4 查詢(xún)鍵解讀標志位  

檢查有鍵按下后首先查詢(xún)鍵解讀標志位的狀態(tài)是處于邏輯0還是邏輯1;若是邏輯0說(shuō)明本次按鍵尚未解讀過(guò),經(jīng)消抖動(dòng)延時(shí)后需進(jìn)一步對鍵盤(pán)矩陣的輸出、輸入口線(xiàn)進(jìn)行查詢(xún)來(lái)確定是哪一個(gè)鍵,并作相應處理。  

若鍵解讀標志位是邏輯1,則表明本次按鍵已解讀過(guò)了,沒(méi)必要浪費CPU時(shí)間,可直接從鍵掃描處理程序中返回。這就實(shí)現了鍵每閉合一次,MCU只作一次處理的效果。改變了傳統的為了保證鍵每閉合一次,MCU只作一次處理,程序中需等待鍵釋放后才對其進(jìn)行解釋的弊病。  

2.5 消抖動(dòng)延時(shí)  

當覺(jué)察有鍵按下、查詢(xún)鍵解讀標志位為0時(shí),就置位消抖動(dòng)延時(shí)標志位及其輔助位進(jìn)入消抖動(dòng)延時(shí)處理。消抖動(dòng)延時(shí)的具體進(jìn)行可調備用的消抖動(dòng)延時(shí)程序;也可借助對系統大循環(huán)次數的計數或動(dòng)用MCU內部定時(shí)器的中斷來(lái)實(shí)現消抖動(dòng)延時(shí),這樣就不必設置專(zhuān)門(mén)的延時(shí)程序而占用CPU的時(shí)間了。消抖動(dòng)延時(shí)結束時(shí)清零消抖動(dòng)延時(shí)標志位及其輔助位。  

2.6 查詢(xún)哪個(gè)輸入口線(xiàn)電平有變化  

平常所有輸入端口都處于高電平,經(jīng)消抖動(dòng)延時(shí)后就查詢(xún)鍵盤(pán)矩陣各輸入口線(xiàn)的電平是否有被拉低。若一個(gè)端口也沒(méi)被拉低,則說(shuō)明本次按鍵無(wú)效(可能是某種干擾引起的“抖動(dòng)”),于是直接返回。

若依次查詢(xún)作為輸入的Pn.y各端口的其中某個(gè)端口電平被拉低,則表明本次按鍵是有效的,將跳轉至查詢(xún)與該口線(xiàn)交叉相關(guān)的那個(gè)輸出口線(xiàn)。  

2.7 掃描哪個(gè)輸出口線(xiàn)輸出有效電平  

圖2所示的鍵盤(pán)矩陣電路結構中,輸出端口Pm.x與輸入端口Pn.y是直接由鍵連接交叉的。當鍵按下時(shí)哪一個(gè)輸入端口的電平被拉低確定后,則跳轉到查詢(xún)Pm.x(Pm.0、Pm.1、Pm.2、Pm.3、Pm.4、Pm.5)六個(gè)端口中是哪個(gè)端口輸出低電平,進(jìn)而確定具體哪一個(gè)鍵按下,跳轉至幾號鍵進(jìn)行解釋處理。任何時(shí)候掃描輸出低電平的端口是唯一的,也只有行掃描輸出低電平的那個(gè)Pm.x口,才會(huì )將列輸入Pn.y口的電平拉低。這時(shí),鍵按下有效交叉的行、列相應端口都處于低電平。  

若運用典型的51系列MCU的指令去寫(xiě)匯編程序來(lái)解讀矩陣的具體鍵時(shí),則有:  

Key_scan:JNB Pn.y,Key_matrix_j ;當輸入端口Pn.y(y=0,1,2,3,4)被拉低時(shí),跳轉至Key_matrix_j(j=y)
LJMPReturn ;若端口Pn.y一個(gè)也沒(méi)被拉低,則返回
Key_matrix_j: JNBPm.x,Key_gloze_i ;當知曉Pn.y的某個(gè)端口被拉低,則再查詢(xún)Pm.x(x=0,1,2,3,4,5)的哪個(gè)端口掃描輸出低電平來(lái)確定具體是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;鍵盤(pán)矩陣掃描解讀返回  



圖4 鍵盤(pán)矩陣掃描倒樹(shù)形結構

以上匯編語(yǔ)言所述的鍵盤(pán)矩陣掃描解讀過(guò)程,可借助圖4來(lái)較形象化地解釋。由圖4可見(jiàn),每一Pn.y(y=0,1,2,3,4)口都與Pm.x(x=0,1,2,3,4,5)的6個(gè)口有關(guān)聯(lián),而每一Pn.y口線(xiàn)與Pm.x的6個(gè)口線(xiàn)中任一口線(xiàn)相交都揭出一個(gè)鍵(i號),結合以上程序,若輸入端口Pn.0被拉低,且是端口Pm.1有效掃描輸出低電平,則有(JNBPn.0,Key_matrix_0)指令跳轉至Key_matrix_0,繼而查詢(xún)輸出端口(JNBPm.1,Key_gloze_6)跳轉至Key_gloze_6,也就是先查詢(xún)到Pn.0被拉低跳轉至Key_matrix_0→再查詢(xún)到Pm.1掃描輸出低電平跳轉至Key_gloze_6→揭出是6號鍵按下并賦予其相應的解釋處理。以此類(lèi)推。  

如果鍵盤(pán)矩陣的電路結構如圖3所示,其掃描輸出端口Pm.x不是直接與輸入端口Pn.y交叉的,而是經(jīng)過(guò)用于數碼顯示位驅動(dòng)的反相組件后再與入端口Pn.y交叉的。為此,其掃描輸出有效端口不是低電平了,而是輸出高電平經(jīng)反相組件后再成為低電平,通過(guò)按鍵同樣將與之交叉的輸入端口線(xiàn)拉低。所以,在查詢(xún)輸入端口時(shí)與圖2所示的是相同的,而在查詢(xún)掃描輸出有效端口時(shí)與圖2的就有所不同了。  

圖2所示電路結構查詢(xún)的是哪個(gè)端口掃描輸出低電平,有:  

JNBPm.x,Key_gloze_i;  

圖3所示電路結構查詢(xún)的卻是哪個(gè)端口掃描輸出高電平,則:  

JBPm.x,Key_gloze_i;  

由圖4可知,若輸入端口Pn.2被拉低,且是端口Pm.3有效掃描輸出高電平,則有先查詢(xún)到Pn.2被拉低→再查詢(xún)到Pm.3掃描輸出高電平→揭出是18號鍵按下并賦予其相應的解釋處理。依此類(lèi)推。具體的程序跳轉如圖5所示,可見(jiàn)其過(guò)程都是位的查詢(xún)跳轉。  



圖5 鍵盤(pán)矩陣掃描程序跳轉結構圖

2.8 執行各對應鍵具體處理  

因為輸出口線(xiàn)為行線(xiàn),與輸入口線(xiàn)為列線(xiàn)的交叉點(diǎn)是唯一的,故確定了輸出哪一端口與輸入哪一端口,也就確定了具體哪一個(gè)鍵(i號鍵)按下了,就能賦予該鍵相應的解釋處理。整個(gè)過(guò)程中,沒(méi)必要區別哪個(gè)是數字鍵、哪個(gè)是功能鍵。每一個(gè)鍵的解讀都是等價(jià)的,是數字鍵就直接賦予其相應的數值處理,是功能鍵就直接賦予其具體的功能解釋。  

2.9 置位鍵解讀標志位  

為保證鍵每閉合一次MCU只作一次處理,每一次鍵解讀后都將置鍵解讀標志位為邏輯1。對于鍵解讀標志位的置位,可以在每一個(gè)鍵解釋處理完畢后進(jìn)行,也可在消抖動(dòng)延時(shí)后就進(jìn)行一次總置。不管鍵有多少個(gè),鍵解讀標志位用的卻是同一個(gè)。  

其實(shí),引入了鍵解讀標志位,不只是控制鍵每閉合一次MCU只作一次處理,還可對那些持久按著(zhù)的鍵有控地進(jìn)行多次處理(如用于對一些數據遞進(jìn)、或遞減的連續設置等)。  

3 原理綜述  

本文提出基于布爾處理的鍵盤(pán)矩陣解讀方法。其原理如下:  

在鍵盤(pán)矩陣掃描時(shí),首先檢查有否鍵按動(dòng)。若無(wú)鍵按動(dòng),則清零一次鍵解讀標志位就返回;若有鍵按下,則再查詢(xún)鍵解讀標志位是邏輯0還是邏輯1。如果是邏輯1,表明本次按鍵已解讀過(guò),可直接從鍵掃描處理程序中返回;如果是邏輯0,說(shuō)明本次按鍵尚未解讀過(guò),則啟用消抖動(dòng)延時(shí)。經(jīng)消抖動(dòng)延時(shí)后即查詢(xún)鍵盤(pán)矩陣輸入口線(xiàn)的各端口是否有拉低。若一個(gè)端口也沒(méi)被拉低,則說(shuō)明本次按鍵無(wú)效,那可能是某種干擾引起的“抖動(dòng)”,立即從鍵掃描處理程序中返回;若查詢(xún)到其中之一端口的電平被拉低了,則表明本次按鍵盤(pán)是有效的,將跳轉查詢(xún)與之相交的那個(gè)掃描有效輸出口線(xiàn),進(jìn)而確定具體是哪一個(gè)鍵按下,并跳轉賦予其相應的解釋處理。解釋處理后,置鍵解讀標志位為邏輯1再返回,即完成一次鍵盤(pán)矩陣的掃描解讀。  

不管鍵盤(pán)矩陣有多少個(gè)鍵,其掃描確定一個(gè)具體鍵所需位查詢(xún)的總次數S不會(huì )大于行數x與列數y之和;但也不少于2次,即2≤S≤x+y。如上述的6×5矩陣,最多所需位查詢(xún)總次數S=5+6=11。當第30號鍵按下,查詢(xún)到最后一列Pn.4端口電平被拉低,繼而跳轉查詢(xún)到有效掃描輸出是最后一行Pm.5端口;但至少所需位查詢(xún)總次數S=1+1=2。當1號鍵按下,先查詢(xún)到第1列Pn.0端口電平被拉低,繼而跳轉查詢(xún)到有效掃描輸出是第1行Pm.0端口。  

結語(yǔ)  

運用布爾位操作處理進(jìn)行鍵盤(pán)矩陣的解讀,可適用于所有基于MCU的智能化儀器儀表中鍵盤(pán)矩陣的解讀。運用布爾位操作方式,改變了傳統的用數據字節處理方式。掃描解讀過(guò)程中,沒(méi)有鍵值計算,沒(méi)有鍵對應的特征值返回,同時(shí)也省去了求鍵值時(shí)以輔助保存原值的行值、列值緩沖寄存器等,有的只是位的操作查詢(xún)。構成鍵盤(pán)矩陣的輸入口線(xiàn)可以是連續的,也可以是不連續的。在電路設計布線(xiàn)時(shí),哪一個(gè)端口方便就用哪個(gè)端口作鍵盤(pán)矩陣輸入線(xiàn)。換言之,輸入口線(xiàn)可隨意分散在不同P口中,這種靈活、便捷的方式是傳統的用鍵值處理的方式所不及的;同時(shí)也改變了傳統的為了保證鍵每閉合一次MCU只作一次處理,需等待鍵釋放后才對其進(jìn)行鍵解釋處理的做法。整個(gè)鍵盤(pán)矩陣的掃描顯得簡(jiǎn)捷、高效,鍵盤(pán)矩陣的解讀更為明快、準確。
本文地址:http://selenalain.com/thread-28352-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页