51 线反转法 实现矩阵键盘检测

2024-01-19 11:34

  最直接的方式是先逐行检测有哪一行的按键被按下,再逐列检测有哪一列的按钮被按下。这样就能够得到按键的行值和列值即得到按键的坐标,就检测到了是哪一个按键被按下了。但是使用这种方法程序执行效率就跟矩阵的行数R和列数C有关了,每次检测都需要检测R * R次。

  到了21世纪,线反转法肯定会替代以上扫描方法的,因为这种检测方法只需要两次就可以扫描出来是哪一个按键被按下了。它是如何来实现就用扫面两次就可以得到按键的坐标的呢?单片机的引脚在默认情况下为高电平,将接接矩阵键盘行的引脚置位低电平(0)[如上图P3就应该被置为],将接矩阵键盘列的引脚置位高电平(1),则结合上图中的2X4键盘的P3端口的值应为宏值#define ROW_LOW_COLUMN_HIGH 0x9f,然后检测接矩阵键盘列中是否有低电平出现,如果有则说明在低电平列有按钮被按下;若检测到某列为低电平后,确定是哪一列,然后将行和列所接引脚电位反转:行为高电平,列为低电平(结合上图P3端口为宏值#define ROW_HIGH_COLUMN_LOW 0xe1),检测行是否有高电平的行,如果有则确定是哪一行为高电平即确定哪一行有按键被按下。这样就确定了一个按键的行和列坐标。

  此函数时检测矩阵键盘中是否有按键被按下。KEY_INDEX是一个包含按键行和列坐标的结构体。temp = temp &KEY_ALL_UP_IN_COLUMN; KEY_ALL_UP_IN_COLUMN宏值为0x9f表示在列中的键盘全为高电平时的状态,if(temp != KEY_ALL_UP_IN_COLUMN)表示若temp与此值做与运算后的值不为键盘全列为高电平状态,则可能(还有可能是抖动带来的干扰)有按键被按下,于是用自定义延迟函数nms_delay(10);延迟10ms的时间来消除键盘抖动(目的是进一步判断是否是按键真的被按下),然后用相同的方法判断一次键盘是否全列都为高电平状态,如果不是,则此时确实有按键被按下,则接下来用case语言判断是哪一列的按键被按下,将被按下按键的列赋值给结构体的列值,从而得到按键的列值。得到列值之后,将接矩阵键盘行和列引脚P3反转,因为此时已经有按键被按下,所以无需再做消扰动等操作。只需检测是哪一行的按键被按下得到被按下按键的行值即可,代码中还判断了是否行值被按下,其实此时已经有按键被按下,这一步可有可无。

  最后函数将按键的列值和行值返回,供数码管或LCD中显示,是哪一个按键被按下了。实现人机合作。

  这里代码是对2X4矩阵键盘的扫描,其实以上程序设计方法适合任何矩阵键盘和任何其它的芯片。需要变动的是接矩阵键盘的端口:将接矩阵键盘行引脚和列引脚找出来赋予合适的宏值[高低电平,将进行检测的行或列置成高电平,另一些引脚置为低电平]。另外还需要改动的一个地方是,判断矩阵式哪一行和哪一列被按下,增加一些行和列值即可。基圆螺旋角叶片进口半径浴盆曲线带孔销间歇运动机构

地址: 客服热线:(服务时间9:00-18:00) QQ:

Copyright © 2002-2017 DEDECMS. 织梦科技 版权所有 Power by DedeCms