首页 > 代码库 > 【转】 矩阵键盘的工作原理

【转】 矩阵键盘的工作原理

在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,在矩阵键盘中每条水平线和垂直线在交叉处不直接相连,而是通过一个按键相连接,这样在由N条水平线和M条垂直线最多可以有N *M 个按键,大大的减少了对于芯片I/O的占用。

键盘矩阵的按键识别方法

image

                   图1   矩阵键盘的结构

方法一 行扫描法

1、判断键盘中有无键按下 将全部行线P1.4-P1.7置低电平,当然P1.0-P1.3为高电平(或许芯片内部已经将这些引脚它上拉),然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。

2、判断闭合键所在的位置 在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。

方法二 

先从P1口的高四位输出低电平,低四位输出高电平,从P1口的低四位读取键盘状态。再从P1口的低四位输出低电平,高四位输出高电平,从P1口的高四位读取键盘状态。将两次读取结果组合起来就可以得到当前按键的特征编码。

在I.MX27中keypad模块的实现

image

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 键盘控制寄存器

     image

          当列引脚作为输出时  有凉宫输出方式

           1)Open-Drain Output   (漏极开路输出)

           2) Totem-Pole-Output(图腾柱式输出)

       KPSR 键盘状态寄存器

             作用  用于控制键盘的状态 设定键盘的中断方式等

       kDDR 键盘数据流向寄存器

              作用 用于控制键盘引脚作为输出功能还是作为输入功能使用   当相应位被置为0代表输入  当相应位被置为1时 代表输出  

       kPDR 键盘数据寄存器  

             作用  用于输出或者读出相应行列引脚上的数据,当相应引脚被置为输入/输出模式  该寄存器的响应为代表输入/输出的值

Keypad功能能模块的具体实现

image

                                                                              键盘矩阵的实现

 

本文来自:http://www.emsym.com/blog/?p=558