最近做了一个项目,有个部分用到了矩阵扫描的原理,要检测按键是否按下去执行一个动作。一开始硬件工程师的原理图实现是设计成传统矩阵按键方式,大致原理如下所示:

这种硬件实现方式当去检测单个按下、一整行按下或一整列按下时是没有问题,但是我们同时按下s0、s1和s4的时候,问题就来了。
当我们按下s0和s1的时候相应的第一行就会导通,结合列的上拉电阻便可检测出s0和s1按键被按下。但是!!!当我们s4按下时第二行也被导通了,并且随着s1按键的按下,第二列也是被导通。所以当我们按下s0、s1和s4按键时,s5按键就会被误检测成被按下,所以这是错误的。经过不懈的努力和查阅相关资料,对以上的电路进行了修改。

在每一个按键前面加上一个二极管进行阻隔,使得各按键不受列电流的影响,有了电路原理,代码按键扫描检测就简单多了。
先对按键GPIO进行定义,方便后续编写代码。
////////////////////////////KEY ROW/////////////////////////////////////
#define KEY_ROW_APB2PERIPH (RCC_APB2Periph_GPIOA)
#define KEY_ROW_PORT GPIOA
#define KEY_ROW1_PIN GPIO_Pin_10
#define KEY_ROW2_PIN GPIO_Pin_11
#define KEY_ROW3_PIN GPIO_Pin_12
#define KEY_ROW4_PIN GPIO_Pin_15
////////////////////////////KEY COL////////////////////////////////////
#define KEY_COL_APB2PERIPH (RCC_APB2Periph_GPIOB)
#define KEY_COL_PORT GPIOB
#define KEY_COL1_PIN GPIO_Pin_3
#define KEY_COL2_PIN GPIO_Pin_4
#define KEY_COL3_PIN GPIO_Pin_5

本文介绍了在硬件设计中遇到的矩阵按键扫描问题,当多个按键同时按下时导致误检测。通过在每个按键前添加二极管隔离,解决了列电流影响的问题,实现了更准确的按键检测。代码示例展示了如何配置GPIO进行矩阵按键扫描,避免了多键按下时的误报。
2374

被折叠的 条评论
为什么被折叠?



