基于Windows CE的7×3手机键盘驱动实现
nCodeToVKeyEx函数将扫描码映射成虚拟码。把从PDD返回的键盘事件发送到输入系统,输入系统对它们进行排队并分发给相应的应用程序。
6. KeypdPdd_GetEventEx函数
当输入系统载入矩阵键盘驱动后,由矩阵键盘驱动执行一系列初始化工作,然后开启一个线程进入键盘中断主循环,等待键盘事件的发生。一旦发生键盘事件,即检测到有按键被按下,立即调用KeypdPdd_GetEventEx函数来获取按键的扫描码。
其中,列为矩阵扫描输入端,行为矩阵键盘输出端,当有按键被按下时,矩阵键盘的相应行和列所对应的输入输出电平将相应地发生变化,通过矩阵键盘的扫描,将此值存储于键盘接口自动扫描寄存器的相应位中,然后将此数据进行如下操作:
1) 屏蔽键盘自动扫描寄存器的列数据的值,将此值存储于C中。
1) 屏蔽键盘自动扫描寄存器的行数据的值,将此值存储于R中。
2) 将上面两步产生的数据进行或运算,所得的数据就是被按下键的扫描码。
对于7×3的矩阵键盘,下图为物理按键和扫描码的对应关系(扫描码为16进制):
| 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函数
此函数提供扫描码到虚拟键的映射操作,主要调用MapVkeyFromSCode函数完成从扫描码到虚拟按键的映射。在 MapVkeyFromSCode函数的实现过程中,首先需要按照自己的要求和物理键盘的布局确定SC2VKMap[i][j]二维数组,其中数组的第一列为物理键盘上每个按键所对应的扫描码,第二列为第一列扫描码所对应的虚拟按键,开发者可以根据实际需要确定扫描码和虚拟按键的对应关系,通过这个二维数组的设定,就可以在程序运行的过程中,当检测到有按键被按下时,通过KeypdPdd_GetEventEx函数产生的扫描码,然后通过查表的方式得到扫描码所对应的虚拟按键值。下表为扫描码与虚拟码的对应关系表:
| 5列 | 6列 | 7列 | ||||||
扫描码 | 虚拟码 | 物理按键 | 扫描码 | 虚拟码 | 物理按键 | 扫描码 | 虚拟码 | 物理按键 | |
1行 | 0x04 | VK_A | 预留 | 0x05 | VK_B | 上 | 0x06 | VK_C | 预留 |
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对应的输出为A、B、C、D 、E、F、G、H、I、J、K、1、2、3、4、5、6、7、8、9、0,但实际显示的时候可以按照具体的要求进行定义,完成物理按键对应的输出值,每个按键所实现的功能是由上层应用程序定义的,这里再不详细叙述。
8. KeyPadGpioConfigure函数
此函数的功能是完成矩阵键盘所对应GPIO口的配置,在具体函数的实现和开发中必须按照物理键盘的布局及芯片引脚占用情况进行相应的更改的。下面为KeyPadGpioConfigure函数的实现:
XLLP_UINT32_T GpioDirOutList[]={3,107,108,96, }; //矩阵键盘3个输出端口引脚号
XLLP_UINT32_T GpioDirInList[]={7,100,101,102,97,39,90,91}; //矩阵键盘7个输出端口引脚号XLLP_UINT32_T GpioAltFnPinList[]={10,39,90,91,96,97,100,101,102,107,108};//矩阵键盘GPIO引脚 XLLP_UINT32_T GpioAltFnValList[]={10,1,1,1,3,1,1,1,1,2,2}; // GPIO对应的附加功能选择
if(v_pGPIOReg != 0) //判断键盘GPIO寄存器是否已经被配置
{
XllpGpioSetDirectionIn(v_pGPIOReg, GpioDirInList); //设置GPIO输入端口方向
XllpGpioSetDirectionOut(v_pGPIOReg, GpioDirOutList); //设置GPIO输出端口方向
XllpGpioSetOutput0(v_pGPIOReg, GpioDirOutList); //设置GPIO输出端口
XllpGpioSetAlternateFn(v_pGPIOReg, GpioAltFnPinList, GpioAltFnValList); //设置GPIO附加功能
}
if(v_pKeyPadRegs != 0) //判断键盘寄存器是否已经被配置
{
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 ) ; //设置矩阵键盘控制寄存器初值
retval = XLLP_TRUE;
}
return(retval);
9. 结束语
本文作者创新点:完整地分析了Windows CE操作系统中7×3矩阵键盘的基本原理及其驱动程序模型,此设计是按照目前通用的手机键盘开
- 51单片机矩阵键盘与左右流水灯控制C程序(12-02)
- 矩阵键盘实验程序(12-02)
- 51单片机矩阵键盘检测源代码(按键数码管显示0-F)(12-02)
- AVR 矩阵键盘程序源代码V3.5(有连续按键功能,有组合键功能)(12-02)
- 矩阵键盘反转扫描(中断触发)数码管新认识(12-01)
- AVR单片机扫描4X4矩阵键盘并数码管显示程序(12-01)