<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

            2 軟件

          本文引用地址:http://www.ex-cimer.com/article/152071.htm

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

            矩陣是作為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不再難懂)


          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();