在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,在矩阵键盘中每条水平线和垂直线在交叉处不直接相连,而是通过一个按键相连接,这样在由N条水平线和M条垂直线最多可以有N *M 个按键,大大的减少了对于芯片I/O的占用。
键盘矩阵的按键识别方法
图1 矩阵键盘的结构
方法一 行扫描法
1、判断键盘中有无键按下 将全部行线P1.4-P1.7置低电平,当然P1.0-P1.3为高电平(或许芯片内部已经将这些引脚它上拉),然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。
2、判断闭合键所在的位置 在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。
方法二
先从P1口的高四位输出低电平,低四位输出高电平,从P1口的低四位读取键盘状态。再从P1口的低四位输出低电平,高四位输出高电平,从P1口的高四位读取键盘状态。将两次读取结果组合起来就可以得到当前按键的特征编码。
在I.MX27中keypad模块的实现
Keypad port 相关引脚说明:
在keypad模块中 总共有16个引脚 (8个行引脚 8个列引脚)
KP_COL[7:0] 其中[5:0] 作为键盘模块的列引脚 如果未使用 也可以做为通常的GPIO口使用
[7:6]两引脚复用 可以作为键盘模块的列引脚 7脚还可以用做串口2的UART2_CTS 引脚
6脚还可以当做串口2 的UART2_TXD脚使用 6脚有时还做为芯片内部的测试引脚
KP_ROW[5:0] 其中[5:0] 作为键盘模块的行引脚 如果未使用 也可以做为通常的GPIO口使用
[7:6]两引脚复用 可以作为键盘模块的行引脚 7脚还可以用做串口2的UART2_RTS 引脚
6脚还可以当做串口2 的UART2_RXD脚使用
keypad port 相关的寄存器
KPCR 键盘控制寄存器
当列引脚作为输出时 有凉宫输出方式
1)Open-Drain Output (漏极开路输出)
2) Totem-Pole-Output(图腾柱式输出)
KPSR 键盘状态寄存器
作用 用于控制键盘的状态 设定键盘的中断方式等
kDDR 键盘数据流向寄存器
作用 用于控制键盘引脚作为输出功能还是作为输入功能使用 当相应位被置为0代表输入 当相应位被置为1时 代表输出
kPDR 键盘数据寄存器
作用 用于输出或者读出相应行列引脚上的数据,当相应引脚被置为输入/输出模式 该寄存器的响应为代表输入/输出的值
Keypad功能能模块的具体实现
键盘矩阵的实现
本文来自:http://www.emsym.com/blog/?p=558
原文:http://www.cnblogs.com/dingwei/p/3703532.html