MiniGUI中開發(fā)實現(xiàn)鍵盤輸入設備方案解析
嵌入式系統(tǒng)通常擁有特定的輸入設備。輸入設備用于實現(xiàn)數(shù)據(jù)輸入和人機交互,其種類繁多,并且不同的設備依賴不同的硬件實現(xiàn)。為了減弱系統(tǒng)的硬件相關性和提高可移植性,MiniGUI提供了統(tǒng)一的輸入抽象層IAL(Input Abstract Layer)接口來支持不同的輸入設備,減小了開發(fā)輸入設備的難度。下面以開發(fā)4×4小鍵盤輸入為例,介紹在MiniGUI中開發(fā)和實現(xiàn)特定鍵盤輸入設備輸入的方法。
本文引用地址:http://cafeforensic.com/article/202338.htmMiniGUI對鍵盤輸入的處理方式如圖1所示。鍵盤設備驅動程序從鍵盤接收原始的輸入事件和數(shù)據(jù),并把它轉換為MiniGUI抽象的鍵盤事件和數(shù)據(jù)。相關的底層事件處理例程把這些鍵盤事件轉換為上層的擊鍵消息,放到相應的消息隊列中。應用程序通過消息循環(huán)獲取這些消息,交由窗口過程處理。
開發(fā)特定的鍵盤輸入,主要完成底層的兩部分工作:鍵盤驅動程序設計和鍵盤輸入引擎開發(fā)。前者負責從鍵盤接收原始輸入事件和數(shù)據(jù),后者負責把原始的輸入事件和數(shù)據(jù)轉抉成MiniGUI抽象的鍵盤事件和數(shù)據(jù)。至于抽象鍵盤事件和數(shù)據(jù)轉換成上層的擊鍵消息等工作,則是由MiniGUI提供的底層事件處理例程自己完成,無需用戶設計,這正是MiniGUI提供輸入抽象層接口(IAL)所帶來的好處。下面具體介紹小鍵盤輸入的開發(fā)過程與實現(xiàn)方法,主要介紹重要接口函數(shù)的實現(xiàn)。
2 鍵盤驅動程序設計
該設備驅動要實現(xiàn)的主要功能是進行小鍵盤行列掃描,接收原始鍵盤輸入事件和數(shù)據(jù),如有無鍵按下、按下某鍵或釋放某鍵。返回的字符型按鍵信息(小鍵盤掃描碼)由兩部分組成:“高位”代表鍵盤輸入事件,即按下(高位為O)或釋放(高位為1);“低7 位”代表鍵盤輸入數(shù)據(jù),即按下或釋放的按鍵值。
2.1 鍵盤按鍵值的獲取
當按下某個鍵時,和該鍵所在行列相連的兩路通用外設I/O引腳就會導通,其電平就會相同,因此驅動中只需要輪詢各路I/O引腳就可以知道按鍵值。比如,使各行線輸入低電平,各列線都通過上拉電阻接高電平,此時檢測各列,如果某一列電平為低,則說明該列所在的鍵盤已經(jīng)按下,使該列與行導通變?yōu)榈碗娖剑@樣就可以確定按鍵所在列號(j);同理,將各列置低電平,再依次查詢各行,就可以確定按鍵的行號(i)。若定義一個鍵值映射數(shù)組key_arrow[5] [5]表示所有鍵盤按鍵值:Key_arrow[5][5]={{0,O,O,O,0,0},{0,‘7’,‘8’,‘9’,‘A’},{0,‘4’, ‘5’,‘6’,‘B’},{0,‘1’,‘2’,‘3’,‘C’},{0,‘D’,‘O’,‘.’,‘E’}},則按鍵值就為key_arrow[i] [j]。初始化時行列號均為0,因此當小鍵盤無鍵按下時,返回按鍵值為0(即字符NULL)。
需要注意的是,要保證驅動正常工作,設置好行列線的輸入輸出模式后,需要一定時間延時以后才能開始進行行(列)查詢。這是因為行列線進行輸入輸出模式切換時存在硬件延遲。
2.2 鍵盤掃描碼的獲取
為了判斷鍵盤事件是按下還是釋放,定義兩個無符號型字符變量last和key。前者是靜態(tài)變量,存放等待釋放的鍵的按鍵值,即前一次掃描讀到的按鍵值;后者存放當前鍵盤掃描碼。當鍵盤事件為按下時,它的值和鍵盤按鍵值相同;當鍵盤事件為釋放時,它的值等于last高位置l后的值。
2.3 功能實現(xiàn)流程
我們用驅動程序read接口函數(shù)實現(xiàn)這些功能。當應用程序凋用read函數(shù)后,該函數(shù)先進行行列掃描,得到鍵盤按鍵值key_arrow[i][j]后進行判斷。著其非零,即有鍵按下,則直接將此按鍵值作為鍵盤的掃描碼(key=key_arrow[i][j]),并將其賦給字符變量last,表示該鍵等待釋放。如果key_arrow[i][j]為零,即無鍵按下,則判斷是否有需要釋放的鍵:若沒有(即last為O),就直接將按鍵值(key=0)作為鍵盤掃描碼;若有鍵需要釋放(1ast非零),就把1ast高位置1作為鍵盤掃描碼(key=last 10x80),表示釋放剛按下的鍵,然后last清零,表示已沒有按鍵等待釋放。read函數(shù)最后發(fā)送鍵盤掃描碼(key)到用戶緩沖區(qū)后返回。
3 鍵盤輸入引擎的設計
第2部分要開發(fā)的是小鍵盤輸入引擎。它負責把鍵盤驅動提供的原始鍵盤輸入事件和數(shù)據(jù)(即小鍵盤掃描碼)轉換為MiniGUI抽象的鍵盤事件和數(shù)據(jù)(由系統(tǒng)掃描碼索引的鍵盤數(shù)組)。
3.1 MiniGUI的IAL接口
前面已提到,IAL定義了一組不依賴于任何特殊硬件的抽象接口,而用于實現(xiàn)這一抽象接口的底層代碼就稱為輸入引擎。在代碼實現(xiàn)上,MiniGUI通過 INPUT結構來表示“輸入引擎”。它實際是一個擁有若干函數(shù)指針成員的結構體,MiniGUI在特定的時候調用這些函數(shù)來達到操作硬件的目的,因此,編寫特定的輸入引擎,主要就是編碼實現(xiàn)INPUT結構中的各個函數(shù)。該結構定義在/minigui-free/libminigui-1.3. 3/src/ial/ial.h中,其中的主要成員函數(shù)如表l所列。為表述方便,定義當前工作目錄為/mlnlgui-free/libminigui- 1.3.3,后文出現(xiàn)的所有文件目錄及路徑均在該目錄下。
DIY機械鍵盤相關社區(qū):機械鍵盤DIY
評論