基于Windows CE的7×3手機(jī)鍵盤(pán)驅(qū)動(dòng)實(shí)現(xiàn)
對(duì)于7×3的矩陣鍵盤(pán),下圖為物理按鍵和掃描碼的對(duì)應(yīng)關(guān)系(掃描碼為16進(jìn)制):
| 5列(KP_MKOUT4) | 6列(KP_MKOUT5) | 7列(KP_MKOUT6) |
1行(KP_MKIN0) | 0x04 | 0x05 | 0x06 |
2行(KP_MKIN1) | 0x14 | 0x15 | 0x16 |
3行(KP_MKIN2) | 0x24 | 0x25 | 0x26 |
4行(KP_MKIN3) | 0x34 | 0x35 | 0x36 |
5行(KP_MKIN4) | 0x44 | 0x45 | 0x46 |
6行(KP_MKIN5) | 0x54 | 0x55 | 0x56 |
7行(KP_MKIN6) | 0x64 | 0x65 | 0x66 |
7. ScanCodeToVKeyEx函數(shù)
此函數(shù)提供掃描碼到虛擬鍵的映射操作,主要調(diào)用MapVkeyFromSCode函數(shù)完成從掃描碼到虛擬按鍵的映射。在 MapVkeyFromSCode函數(shù)的實(shí)現(xiàn)過(guò)程中,首先需要按照自己的要求和物理鍵盤(pán)的布局確定SC2VKMap[i][j]二維數(shù)組,其中數(shù)組的第一列為物理鍵盤(pán)上每個(gè)按鍵所對(duì)應(yīng)的掃描碼,第二列為第一列掃描碼所對(duì)應(yīng)的虛擬按鍵,開(kāi)發(fā)者可以根據(jù)實(shí)際需要確定掃描碼和虛擬按鍵的對(duì)應(yīng)關(guān)系,通過(guò)這個(gè)二維數(shù)組的設(shè)定,就可以在程序運(yùn)行的過(guò)程中,當(dāng)檢測(cè)到有按鍵被按下時(shí),通過(guò)KeypdPdd_GetEventEx函數(shù)產(chǎn)生的掃描碼,然后通過(guò)查表的方式得到掃描碼所對(duì)應(yīng)的虛擬按鍵值。下表為掃描碼與虛擬碼的對(duì)應(yīng)關(guān)系表:
| 5列 | 6列 | 7列 | ||||||
掃描碼 | 虛擬碼 | 物理按鍵 | 掃描碼 | 虛擬碼 | 物理按鍵 | 掃描碼 | 虛擬碼 | 物理按鍵 | |
1行 | 0x04 | VK_A | 預(yù)留 | 0x05 | VK_B | 上 | 0x06 | VK_C | 預(yù)留 |
2行 | 0x14 | VK_D | 左 | 0x15 | VK_E | 菜單鍵 | 0x16 | VK_F | 右 |
3行 | 0x24 | VK_G | OK鍵 | 0x25 | VK_H | 下 | 0x26 | VK_I | Cancel鍵 |
4行 | 0x34 | VK_1 | 1 | 0x35 | VK_2 | 2 | 0x36 | VK_3 | 3 |
5行 | 0x44 | VK_4 | 4 | 0x45 | VK_5 | 5 | 0x46 | VK_6 | 6 |
6行 | 0x54 | VK_7 | 7 | 0x55 | VK_8 | 8 | 0x56 | VK_9 | 9 |
7行 | 0x64 | VK_J | * | 0x65 | VK_0 | 0 | 0x66 | VK_K | # |
其中VK_A、VK_B、VK_C、VK_D、VK_E、VK_F、VK_G、VK_H、VK_I、VK_J、VK_K、VK_1、VK_2、 VK_3、VK_4、VK_5、VK_6、VK_7、VK_8、VK_9、VK_0對(duì)應(yīng)的輸出為A、B、C、D 、E、F、G、H、I、J、K、1、2、3、4、5、6、7、8、9、0,但實(shí)際顯示的時(shí)候可以按照具體的要求進(jìn)行定義,完成物理按鍵對(duì)應(yīng)的輸出值,每個(gè)按鍵所實(shí)現(xiàn)的功能是由上層應(yīng)用程序定義的,這里再不詳細(xì)敘述。
8. KeyPadGpioConfigure函數(shù)
此函數(shù)的功能是完成矩陣鍵盤(pán)所對(duì)應(yīng)GPIO口的配置,在具體函數(shù)的實(shí)現(xiàn)和開(kāi)發(fā)中必須按照物理鍵盤(pán)的布局及芯片引腳占用情況進(jìn)行相應(yīng)的更改的。下面為KeyPadGpioConfigure函數(shù)的實(shí)現(xiàn):
XLLP_UINT32_T GpioDirOutList[]={3,107,108,96, }; //矩陣鍵盤(pán)3個(gè)輸出端口引腳號(hào)
XLLP_UINT32_T GpioDirInList[]={7,100,101,102,97,39,90,91}; //矩陣鍵盤(pán)7個(gè)輸出端口引腳號(hào)XLLP_UINT32_T GpioAltFnPinList[]={10,39,90,91,96,97,100,101,102,107,108};//矩陣鍵盤(pán)GPIO引腳 XLLP_UINT32_T GpioAltFnValList[]={10,1,1,1,3,1,1,1,1,2,2}; // GPIO對(duì)應(yīng)的附加功能選擇
if(v_pGPIOReg != 0) //判斷鍵盤(pán)GPIO寄存器是否已經(jīng)被配置
{
XllpGpioSetDirectionIn(v_pGPIOReg, GpioDirInList); //設(shè)置GPIO輸入端口方向
XllpGpioSetDirectionOut(v_pGPIOReg, GpioDirOutList); //設(shè)置GPIO輸出端口方向
XllpGpioSetOutput0(v_pGPIOReg, GpioDirOutList); //設(shè)置GPIO輸出端口
XllpGpioSetAlternateFn(v_pGPIOReg, GpioAltFnPinList, GpioAltFnValList); //設(shè)置GPIO附加功能
}
if(v_pKeyPadRegs != 0) //判斷鍵盤(pán)寄存器是否已經(jīng)被配置
{
v_pKeyPadRegs->kpControlReg=(MATRIX_KP_NUMBER_OF_ROWS| MATRIX_KP_NUMBER_OF_COLUMNS | MAT_SCAN_LINE4 | MAT_SCAN_LINE5 | MAT_SCAN_LINE6 | AUTO_SCAN_ON_ACTIVITY | MATRIX_INTR_ENABLE | MATRIX_KP_ENABLE ) ; //設(shè)置矩陣鍵盤(pán)控制寄存器初值
retval = XLLP_TRUE;
}
return(retval);
9. 結(jié)束語(yǔ)
本文作者創(chuàng)新點(diǎn):完整地分析了Windows CE操作系統(tǒng)中7×3矩陣鍵盤(pán)的基本原理及其驅(qū)動(dòng)程序模型,此設(shè)計(jì)是按照目前通用的手機(jī)鍵盤(pán)開(kāi)發(fā)。并從實(shí)現(xiàn)方法的角度深入剖析了Windows CE中矩陣鍵盤(pán)掃描碼的獲取流程、將掃描碼映射到虛擬碼的方法,最后給出了矩陣鍵盤(pán)所對(duì)應(yīng)GPIO口的配置方法,對(duì)于類(lèi)似系統(tǒng)的矩陣鍵盤(pán)驅(qū)動(dòng)開(kāi)發(fā)具有重要的參考價(jià)值。
參考文獻(xiàn)
[1] 阿蘭特嵌入式實(shí)驗(yàn)室.PXA27x處理器開(kāi)發(fā)手冊(cè),2005:825-826.
[2] 楊翠娥,王麗敏,王景敏.實(shí)時(shí)系統(tǒng)VxWorks下設(shè)備驅(qū)動(dòng)程序的編寫(xiě)[J].微計(jì)算機(jī)信息2004年第一期
[3] 傅曦.Windows CE 嵌入式開(kāi)發(fā)入門(mén)——基于Xscale架構(gòu)[M] 北京.人民郵電出版社,2006 :227-230.
[4] 微軟.Platform Builder幫助文檔.
[5] Windows CE設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)指南:15-16.
評(píng)論