新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于Murphypinyin的嵌入式鍵盤設計

        基于Murphypinyin的嵌入式鍵盤設計

        作者: 時間:2010-03-02 來源:網絡 收藏

          2 軟件

        本文引用地址:http://www.104case.com/article/152071.htm

          2.1 矩陣的Linux驅動程序

          矩陣是作為Linux的一個字符設備注冊到系統中的。為了降低對系統資源的損耗,采用中斷處理函數對按鍵做處理;同時考慮到按鍵的抖動問題,采用定時器來消除抖動。

          該驅動程序的流程如圖3所示。首先,使用S3C2440_Kb_init()函數將作為一個字符設備進行注冊,初始化行線引腳為:輸出、非上拉,并將所有行輸出置為低電平;注冊該鍵盤設備。初始化列線所連接的中斷引腳為:輸入、下降沿觸發中斷,并建立中斷與中斷處理函數Key_interrupt()的連接。


          當有按鍵按下后,由于所有的行為低電平,必然有一行和一列線導通,從而將相應的列線拉低,觸發中斷。然后,中斷處理函數 Key_interrupt()記錄相應的中斷號碼,由于按鍵存在抖動,單憑一次中斷的觸發就判定相應的按鍵按下很不可靠,所以在中斷觸發后開啟定時器 kb_timer對按鍵狀態再次進行判定。

          上層應用程序使用S3C2440_Kb_open ()打開鍵盤設備,開啟列線中斷,初始化定時器。當中斷觸發后,開啟定時器,定時器定時時間到后,觸發定時器中斷kb_timer_handler()。 kb_timer_handler()首先會調用鍵盤掃描函數Scan_keyboard()掃描按鍵狀態,Scan_keyboard()流程如圖4所示。如果經過3次鍵盤掃描,每次都掃描到相同的按鍵值被按下,則證明確實有按鍵被按下,Scan_keyboard()函數返回:KEYDOWN。如果按本次按鍵值與上一次按鍵值不同,則保存本次按鍵值到循環隊列,這樣可以不保存重復數據到緩沖隊列。如果連續10次掃描到按鍵的狀態都不為 KEY_DOWN,則證明按鍵已經彈起,關閉定時器kb_timer。


          S3C2440_Kb_read()函數負責從循環隊列中讀取按鍵值反饋給上層應用程序。

          2.2 Qt/Embedded的鍵盤映射

          Qt/Embedded是Trolltech公司針對采用嵌人式Linux的電子設備開發的綜合應用平臺。Qt/Embedded包含完整的應用層、靈活的用戶界面、窗口操作系統、應用程序以及開發框架。

          Qt/Embedded本身提供了對按鍵的支持,它在文件qkeyboard_qws.cpp中提供了一個 QWSKeyboardHandler類來處理按鍵事件。本系統創建了QWSKeyboardHandler類的一個子類 QWSKEYMATRIXHandler。在QWSKEYMATRIXHandler類的構造函數中,通過open()函數打開矩陣鍵盤 key_matrix,通過對打開的鍵盤設備創建一個QscoketNotifer來監控按鍵設備,通過信號與槽機制,建立該 QscoketNotifer與讀鍵盤函數ReadKeyboardData()的連接,當key_matrix被激活時,就會觸發讀鍵盤函數 ReadKeyboardData()。代碼如下:

          notifier=new QSocketNotifier(key_matrix,QSock-etNotifier::Read,this);

          connect(notifier,SIGNAL(activated(int)),this,SLOT(ReadKeyboardData()));

          在讀鍵盤函數ReadKeyboardData()中,調用矩陣鍵盤驅動程序的讀函數Read()來獲取按鍵值。為了使得按鍵值能夠傳送給應用程序,要使用QWSKeyboardHandler類的成員函數processKeyEvent(int unicode,int keycode,int modifiers,bool isPress,bool autoRepeat),各參數功能如下:

          ①Unicode:按鍵的Unicode編碼,如數字1的unicode編碼為1,字母A的unicode編碼為A。如果該項為0,則為功能鍵Shift、Left、Right等;如果該項為0xFFFF,則只傳送鍵值keycode,不打印編碼。

          ②Keycode:Qt中使用的按鍵名稱,如Qt::Key_Backspace、Qt::Key_Enter等。

          ③Modifiers:Qt所支持的鍵盤組合鍵。

          ④isPress:判斷按鍵的狀態是“按下”還是“彈起”。

          ⑤autoRepeat:判斷本次事件是有自動重復機制產生,還是由一個現實中的按鍵產生。

          通過processKeyEvent()函數可以發送數字、小寫英文、大寫英文,但是目前Qt/Embedded上沒有中文輸入法,不能輸入中文。

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 临颍县| 都兰县| 瓮安县| 唐河县| 达州市| 汪清县| 霍州市| 绵竹市| 沙湾县| 蕲春县| 曲靖市| 长岛县| 天峨县| 崇明县| 怀安县| 舞钢市| 疏附县| 孟州市| 布拖县| 城步| 伊春市| 玉龙| 罗城| 新巴尔虎左旗| 手机| 青河县| 滦平县| 邢台县| 辽阳县| 灵石县| 清苑县| 桃园市| 沙田区| 高台县| 饶平县| 金坛市| 清苑县| 通江县| 石楼县| 巴中市| 太谷县|