之前做过很多仿真仪表盒,经常遇到盒子上既有大量LED指示灯,又有很多按键的情况,主芯片使用的SiliconLabs的一款单片机,管脚资源有限,如何应对如此多的指示灯和按键呢?当时选用了max7219来实现多个LED灯的控制,而按键则是通过矩阵扫描实现的。
所谓“矩阵扫描”,可以想象成是把几路IO横竖交叉形成网格状,然后把按键放置在网格的交叉点上。这种电路应用很广泛,可以由较少的IO口实现较多的按键控制。比如,6根IO按照3行3列排列,就可以实现接入9个按键;8根IO按照4行4列排列,就可以实现接入16个按键。来看下面这个3*3的矩阵按键原理图:
3*3矩阵按键1
注意,中间那四个行、列交叉地方的线是分离的,并没有短接:
3*3矩阵按键2
还要注意的是,我们要给行或列IO加上上拉电阻,以保证它们的默认状态是高电平。
矩阵按键扫描的实现原理是这样的:把属于列的IO口设置为输入状态,这时由于上拉电阻的作用,当按键没有动作时,程序就会读到高电平;这时开始按行进行扫描,先把行1的IO设置为输出状态,然后设置输出为低电平,接着依次读取列IO口的状态,如果有按键被按下,那么列IO口的读入电平就变成低电平,这时就可以根据行和列判断出动作按键的位置了。行1的扫描完成后,把行1的IO置高,然后按照上面步骤依次进行行2和行3的扫描,确认有动作按键的位置就可以了。下面是程序的简单流程图(没有包含去抖等处理):
简单扫描按键流程图
全部0条评论
快来发表一下你的评论吧 !