矩阵键盘逻辑讲解
矩阵键盘逻辑讲解
想象一个4行4列的网格,网格16个交点,每个交点放一个按键。
横向的线叫行线(4根) 纵向的线叫列线(4根) 按键就架在行线和列线交叉点:按下按键 = 把这根行线和列线接通。
只用 4+4=8根IO口,就能做16个按键。如果用独立按键,16个按键要16根IO,省IO。
核心思路:一行一行挨个试(逐行扫描)
行线、列线默认全部是高电平。
一句话:单独拉低一行,看看哪根列线被拉低了,就能找到是哪个按键
先把所有行全部拉高
只把第0行拉低,剩下三行保持高。
现在,如果这一行上某个按键被按住 → 这根按键连通行和列 → 对应的那根列线就会跟着变低。 四根列全是高:代表这一行没有按键按下,换下一行。
如果发现某一列变低:说明【当前这一行 + 这个列】交叉点的按键按下了。
延时10ms消抖(机械按键按下去瞬间会抖几下,防止误判),再确认一次电平。
然后等着手松开,再返回按键编号。
处理完,把这一行恢复高电平,继续扫描下一行,4行全部扫一遍算一轮。
举个例子: 第2行、第1列的按键按下
程序拉低第2行 读到第1列变成低电平 → 判断:第2行第1列按键按下。
和独立按键对比
独立按键:一根IO管一个按键,直接读这根线高低就行。 矩阵键盘:线共用,不能直接读,要“逐行测试”,才能定位按键位置。
消抖(就是你刚才学的两种逻辑,套在矩阵键盘上)
按键金属弹片按下瞬间会快速抖动,电平忽高忽低,单片机会误以为按了很多次。
检测到电平变化 → 延时等10ms再判断(延时消抖) 确认按键按下后,可以while循环卡住,等到松手之后,再执行功能
考试简单口诀
拉一行,读列线; 列变低,找到键; 延时等,去抖动; 查行列,算键号。
简单理解多键冲突
如果一次性把两行都拉低,同时按两个不同行的按键,程序分不清到底是哪一行,就乱码。所以一次只能拉低一行。
键号怎么算(最简单)
键号 = 行号 × 每行按键数量 + 列号 4×4键盘,每行4个键:键号 = 行号×4 + 列号
比如行=1,列=2:1×4+2=6,就是6号按键。