基于Murphypinyin的嵌入式鍵盤設(shè)計(jì)
2 軟件設(shè)計(jì)本文引用地址:http://www.ex-cimer.com/article/152071.htm
2.1 矩陣鍵盤的Linux驅(qū)動程序設(shè)計(jì)
矩陣鍵盤是作為Linux的一個字符設(shè)備注冊到系統(tǒng)中的。為了降低對系統(tǒng)資源的損耗,采用中斷處理函數(shù)對按鍵做處理;同時考慮到按鍵的抖動問題,采用定時器來消除抖動。
該驅(qū)動程序的流程如圖3所示。首先,使用S3C2440_Kb_init()函數(shù)將鍵盤作為一個字符設(shè)備進(jìn)行注冊,初始化行線引腳為:輸出、非上拉,并將所有行輸出置為低電平;注冊該鍵盤設(shè)備。初始化列線所連接的中斷引腳為:輸入、下降沿觸發(fā)中斷,并建立中斷與中斷處理函數(shù)Key_interrupt()的連接。
當(dāng)有按鍵按下后,由于所有的行為低電平,必然有一行和一列線導(dǎo)通,從而將相應(yīng)的列線拉低,觸發(fā)中斷。然后,中斷處理函數(shù) Key_interrupt()記錄相應(yīng)的中斷號碼,由于按鍵存在抖動,單憑一次中斷的觸發(fā)就判定相應(yīng)的按鍵按下很不可靠,所以在中斷觸發(fā)后開啟定時器 kb_timer對按鍵狀態(tài)再次進(jìn)行判定。
上層應(yīng)用程序使用S3C2440_Kb_open ()打開鍵盤設(shè)備,開啟列線中斷,初始化定時器。當(dāng)中斷觸發(fā)后,開啟定時器,定時器定時時間到后,觸發(fā)定時器中斷kb_timer_handler()。 kb_timer_handler()首先會調(diào)用鍵盤掃描函數(shù)Scan_keyboard()掃描按鍵狀態(tài),Scan_keyboard()流程如圖4所示。如果經(jīng)過3次鍵盤掃描,每次都掃描到相同的按鍵值被按下,則證明確實(shí)有按鍵被按下,Scan_keyboard()函數(shù)返回:KEYDOWN。如果按本次按鍵值與上一次按鍵值不同,則保存本次按鍵值到循環(huán)隊(duì)列,這樣可以不保存重復(fù)數(shù)據(jù)到緩沖隊(duì)列。如果連續(xù)10次掃描到按鍵的狀態(tài)都不為 KEY_DOWN,則證明按鍵已經(jīng)彈起,關(guān)閉定時器kb_timer。
S3C2440_Kb_read()函數(shù)負(fù)責(zé)從循環(huán)隊(duì)列中讀取按鍵值反饋給上層應(yīng)用程序。
2.2 Qt/Embedded的鍵盤映射
Qt/Embedded是Trolltech公司針對采用嵌人式Linux的電子設(shè)備開發(fā)的綜合應(yīng)用平臺。Qt/Embedded包含完整的應(yīng)用層、靈活的用戶界面、窗口操作系統(tǒng)、應(yīng)用程序以及開發(fā)框架。
Qt/Embedded本身提供了對按鍵的支持,它在文件qkeyboard_qws.cpp中提供了一個 QWSKeyboardHandler類來處理按鍵事件。本系統(tǒng)創(chuàng)建了QWSKeyboardHandler類的一個子類 QWSKEYMATRIXHandler。在QWSKEYMATRIXHandler類的構(gòu)造函數(shù)中,通過open()函數(shù)打開矩陣鍵盤 key_matrix,通過對打開的鍵盤設(shè)備創(chuàng)建一個QscoketNotifer來監(jiān)控按鍵設(shè)備,通過信號與槽機(jī)制,建立該 QscoketNotifer與讀鍵盤函數(shù)ReadKeyboardData()的連接,當(dāng)key_matrix被激活時,就會觸發(fā)讀鍵盤函數(shù) ReadKeyboardData()。代碼如下:
notifier=new QSocketNotifier(key_matrix,QSock-etNotifier::Read,this);
connect(notifier,SIGNAL(activated(int)),this,SLOT(ReadKeyboardData()));
在讀鍵盤函數(shù)ReadKeyboardData()中,調(diào)用矩陣鍵盤驅(qū)動程序的讀函數(shù)Read()來獲取按鍵值。為了使得按鍵值能夠傳送給應(yīng)用程序,要使用QWSKeyboardHandler類的成員函數(shù)processKeyEvent(int unicode,int keycode,int modifiers,bool isPress,bool autoRepeat),各參數(shù)功能如下:
?、賃nicode:按鍵的Unicode編碼,如數(shù)字1的unicode編碼為1,字母A的unicode編碼為A。如果該項(xiàng)為0,則為功能鍵Shift、Left、Right等;如果該項(xiàng)為0xFFFF,則只傳送鍵值keycode,不打印編碼。
?、贙eycode:Qt中使用的按鍵名稱,如Qt::Key_Backspace、Qt::Key_Enter等。
?、跰odifiers:Qt所支持的鍵盤組合鍵。
?、躨sPress:判斷按鍵的狀態(tài)是“按下”還是“彈起”。
?、輆utoRepeat:判斷本次事件是有自動重復(fù)機(jī)制產(chǎn)生,還是由一個現(xiàn)實(shí)中的按鍵產(chǎn)生。
通過processKeyEvent()函數(shù)可以發(fā)送數(shù)字、小寫英文、大寫英文,但是目前Qt/Embedded上沒有中文輸入法,不能輸入中文。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評論