5dqxhzrajxt64069781754.png
点击上方「嵌入式实验基地」,选择「置顶公众号」第一时间查看嵌入式笔记!
来这里,还可以学习HAL库的使用哦
前言 ??日常设计中,不可避免的会使用到按键,像我们常见的 POS 机、计算器等设备用到的按键是非常多的,如果采用普通的 1 个 IO 1 个按键的设计方法,显然对单片机资源来说是非常浪费的,所以采用类似矩阵的设计思路,能够大大减少 MCU IO 的使用,也是我们所说的矩阵键盘。
应用场景
xo3jt1prnxq64069781854.jpg
qo4wwmkfvgd64069781954.jpg
z1jznw220fq64069782054.jpg
一、矩阵键盘的两种扫描方式??矩阵键盘常用的有以下两种扫描方式,相比较之下,小飞哥更推荐第二种扫描方式,第二种扫描方式能够更有效地避免错误按键,本次分享的也是第二种扫描方式的代码。
逐行扫描:高四位输出低电平来对矩阵键盘逐行扫描,当低四位接受数据不全为一,表示有按键按下,然后通过接收到的数据是哪一位为 0 来判断哪个按键被按下,可以简单理解为,“一厢情愿型”;行列扫描:高四位全部输出低电平,低四位输出高电平。当接受到的数据,低四位不全为高电平时,说明有按键按下。然后通过接收到的值判断是哪一列有按键按下,然后再反过来高四位输出高电平,第四位低电平,然后通过高四位接收到的值判断哪一行按键按下,可以简单理解为,“两情相悦型”;
二、“两情相悦型”按键扫描方式详解
4bzrty5mga064069782154.png
??上面图片是 4*4 矩阵键盘电路设计,ROW1-ROW4 为键盘你的行,COL1-COL4 为键盘的列,8 个 IO 共 16 个按键,我们以 K1 按下为例,分析具体的工作流程:
1、 先把行切换为上拉输入模式2、把列切换为输出模式,输出低电平3、获取当前行输入状态
即:ROW1 线上此时为低电平,按下之前 ROW1-ROW4 为:1111,即 0x0F,按下之后,ROW1 与 COL1 连通,ROW1-ROW4 的值变为:1110,即 0x0e,此时获取到按键所在行;
4、把行切换为输出状态,输出低电平5、把列切换为上拉输入模式6、获取当前列输入状态
即:COL1 线上此时为低电平,按下之前 COL1-COL4 为:1111,即 0x0F,按下之后,ROW1 与 COL1 连通,COL1-COL4 的值变为:1110,即 0x0e,此时获取到按键所在列;
7、两次行列状态获取完成之后,即确定了按键所在行列,得到按键编码:0xee,值并不是唯一的 0xee,具体跟硬件连接有关系。 硬件连接 ??调试用的键盘为这种非常简单的,某宝几毛钱,邮费都不够的说~
fobuuyoahyi64069782254.jpg
MCU键盘PF0ROW1PF1ROW2PF2ROW3PF3ROW4PG0COL1PG1COL2PG2COL3PG3COL4 |