新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于Murphypinyin的嵌入式鍵盤(pán)設(shè)計(jì)

基于Murphypinyin的嵌入式鍵盤(pán)設(shè)計(jì)

作者: 時(shí)間:2010-03-02 來(lái)源:網(wǎng)絡(luò) 收藏

  2 軟件

本文引用地址:http://m.butianyuan.cn/article/152071.htm

  2.1 矩陣的Linux驅(qū)動(dòng)程序

  矩陣是作為L(zhǎng)inux的一個(gè)字符設(shè)備注冊(cè)到系統(tǒng)中的。為了降低對(duì)系統(tǒng)資源的損耗,采用中斷處理函數(shù)對(duì)按鍵做處理;同時(shí)考慮到按鍵的抖動(dòng)問(wèn)題,采用定時(shí)器來(lái)消除抖動(dòng)。

  該驅(qū)動(dòng)程序的流程如圖3所示。首先,使用S3C2440_Kb_init()函數(shù)將作為一個(gè)字符設(shè)備進(jìn)行注冊(cè),初始化行線(xiàn)引腳為:輸出、非上拉,并將所有行輸出置為低電平;注冊(cè)該鍵盤(pán)設(shè)備。初始化列線(xiàn)所連接的中斷引腳為:輸入、下降沿觸發(fā)中斷,并建立中斷與中斷處理函數(shù)Key_interrupt()的連接。


  當(dāng)有按鍵按下后,由于所有的行為低電平,必然有一行和一列線(xiàn)導(dǎo)通,從而將相應(yīng)的列線(xiàn)拉低,觸發(fā)中斷。然后,中斷處理函數(shù) Key_interrupt()記錄相應(yīng)的中斷號(hào)碼,由于按鍵存在抖動(dòng),單憑一次中斷的觸發(fā)就判定相應(yīng)的按鍵按下很不可靠,所以在中斷觸發(fā)后開(kāi)啟定時(shí)器 kb_timer對(duì)按鍵狀態(tài)再次進(jìn)行判定。

  上層應(yīng)用程序使用S3C2440_Kb_open ()打開(kāi)鍵盤(pán)設(shè)備,開(kāi)啟列線(xiàn)中斷,初始化定時(shí)器。當(dāng)中斷觸發(fā)后,開(kāi)啟定時(shí)器,定時(shí)器定時(shí)時(shí)間到后,觸發(fā)定時(shí)器中斷kb_timer_handler()。 kb_timer_handler()首先會(huì)調(diào)用鍵盤(pán)掃描函數(shù)Scan_keyboard()掃描按鍵狀態(tài),Scan_keyboard()流程如圖4所示。如果經(jīng)過(guò)3次鍵盤(pán)掃描,每次都掃描到相同的按鍵值被按下,則證明確實(shí)有按鍵被按下,Scan_keyboard()函數(shù)返回:KEYDOWN。如果按本次按鍵值與上一次按鍵值不同,則保存本次按鍵值到循環(huán)隊(duì)列,這樣可以不保存重復(fù)數(shù)據(jù)到緩沖隊(duì)列。如果連續(xù)10次掃描到按鍵的狀態(tài)都不為 KEY_DOWN,則證明按鍵已經(jīng)彈起,關(guān)閉定時(shí)器kb_timer。


  S3C2440_Kb_read()函數(shù)負(fù)責(zé)從循環(huán)隊(duì)列中讀取按鍵值反饋給上層應(yīng)用程序。

  2.2 Qt/Embedded的鍵盤(pán)映射

  Qt/Embedded是Trolltech公司針對(duì)采用嵌人式Linux的電子設(shè)備開(kāi)發(fā)的綜合應(yīng)用平臺(tái)。Qt/Embedded包含完整的應(yīng)用層、靈活的用戶(hù)界面、窗口操作系統(tǒng)、應(yīng)用程序以及開(kāi)發(fā)框架。

  Qt/Embedded本身提供了對(duì)按鍵的支持,它在文件qkeyboard_qws.cpp中提供了一個(gè) QWSKeyboardHandler類(lèi)來(lái)處理按鍵事件。本系統(tǒng)創(chuàng)建了QWSKeyboardHandler類(lèi)的一個(gè)子類(lèi) QWSKEYMATRIXHandler。在QWSKEYMATRIXHandler類(lèi)的構(gòu)造函數(shù)中,通過(guò)open()函數(shù)打開(kāi)矩陣鍵盤(pán) key_matrix,通過(guò)對(duì)打開(kāi)的鍵盤(pán)設(shè)備創(chuàng)建一個(gè)QscoketNotifer來(lái)監(jiān)控按鍵設(shè)備,通過(guò)信號(hào)與槽機(jī)制,建立該 QscoketNotifer與讀鍵盤(pán)函數(shù)ReadKeyboardData()的連接,當(dāng)key_matrix被激活時(shí),就會(huì)觸發(fā)讀鍵盤(pán)函數(shù) ReadKeyboardData()。代碼如下:

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

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

  在讀鍵盤(pán)函數(shù)ReadKeyboardData()中,調(diào)用矩陣鍵盤(pán)驅(qū)動(dòng)程序的讀函數(shù)Read()來(lái)獲取按鍵值。為了使得按鍵值能夠傳送給應(yīng)用程序,要使用QWSKeyboardHandler類(lèi)的成員函數(shù)processKeyEvent(int unicode,int keycode,int modifiers,bool isPress,bool autoRepeat),各參數(shù)功能如下:

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

 ?、贙eycode:Qt中使用的按鍵名稱(chēng),如Qt::Key_Backspace、Qt::Key_Enter等。

 ?、跰odifiers:Qt所支持的鍵盤(pán)組合鍵。

 ?、躨sPress:判斷按鍵的狀態(tài)是“按下”還是“彈起”。

 ?、輆utoRepeat:判斷本次事件是有自動(dòng)重復(fù)機(jī)制產(chǎn)生,還是由一個(gè)現(xiàn)實(shí)中的按鍵產(chǎn)生。

  通過(guò)processKeyEvent()函數(shù)可以發(fā)送數(shù)字、小寫(xiě)英文、大寫(xiě)英文,但是目前Qt/Embedded上沒(méi)有中文輸入法,不能輸入中文。

linux操作系統(tǒng)文章專(zhuān)題:linux操作系統(tǒng)詳解(linux不再難懂)


評(píng)論


相關(guān)推薦

技術(shù)專(zhuān)區(qū)

關(guān)閉