草莓味的棉花糖|基于proteus的51单片机开发实例24-矩阵键盘(行列式键盘)

1.基于proteus的51单片机开发实例24-矩阵键盘1.1.实验目的
本实例我们来学习矩阵键盘(行列式键盘)的电路设计、编程实现 。 目的是通过较少的I/O口来识别多个按键 。
1.2.设计思路我们在前面已经学习过独立按键 , 在独立按键电路中 , 一个按键连接单片机的一位I/O端口 。 这样通过检测I/O的状态就能很方便的识别该按键是否按下 。 这种电路的优点是:电路简单 , 程序简单 , 缺点是一个按键就要占用一个I/O口 。 我们知道 , 51单片机总共只有4个8位I/O口 , 如果外部电路功能较多 , I/O口就会不够用 , 例如如果电路中接了一个8位数码管 , 又接了16个按键 , 那么即使数码管采用动态扫描法也需要占用16个I/O口(8位I/O口用于连接数码管8个段 , 另8位I/O口用于控制8位数码管的每一位) , 这时如果按键还是采用独立按键的接法 , 每个按键接一位I/O口 , 那么又要占用16个I/O口 , 这样就把单片机的I/O口全部占完了 , 如果这时候想加一个蜂鸣器 , 就没有多余的I/O口了 。 所以很与必要考虑如何用较少的I/O口实现更多的功能 。
矩阵键盘就是基于用较少I/O口连接更多按键的思路实现的 。 通常将多个按键排列成矩阵形式 , 这也是矩阵键盘名称的由来 , 编程时 , 是按照矩阵的行、列组合判断是那个按键被按下的 , 因此又称为行列式键盘 。
1.3.基础知识最常见的矩阵键盘是4*4键盘 , 其实现方法是将16个按键按照4x4矩阵方式连接 , 如下图所示 。 从连接方式来看 , 有4根行线和4根列线 。 每个行线和列线的交汇处就是一个按键位 。 这样总共有8根线就可以实现16个按键的检测 , 比一个按键连接一个I/O口节省了一半的I/O端口 。
矩阵键盘的工作原理
一般矩阵键盘都会将按键按照一定的规律赋予不同的标号(例如按照从左到右的顺序 , 或者从上到下的顺序) , 当检测到有按键按下后 , 根据被按下的按键序号赋予一定的键值 。 程序中就可以根据键值进行相应的处理 。
在51单片机中 , 对于矩阵键盘的处理方法是:使用行列扫描法 , 将键盘的行线和列线分别连接到单片机的I/O口线上 , 然后按照如下步骤操作:
第一步:判断是否有按键按下
将行线全部输出低电平 , 全部列线输出高电平 , 然后将列线置为输入状态 , 检测列线的状态 , 只要有一根列线为低电平 , 就表示矩阵键盘中有按键被按下了 。
第二步:按键消除抖动
在第一步中如果检测到有按键按下 , 则使用软件消抖的方法延时20ms左右 , 再次判断是否有列线为低电平 , 如果仍有列线为低电平 , 则认为确实有按键被按下 , 则进入到第三步处理 , 否则 , 认为是抖动 , 不予识别 , 继续回到第一步重新开始按键检测 。
第三步:按键识别
确认有按键被按下后 , 接下来就是最关键的内容:确定那个按键被按下 。 这需要用逐行扫描的方法来确定 。 先扫描第一行 , 即将第一行对应的端口输出低电平 , 然后读每一列的电平 , 当出现某一列为低电平 , 说明该列与第一行的交叉点的按键被按下 , 如果所有列都是高电平 , 说明第一行的按键都未被按下 , 那么开始扫描第二行 , 以此类推 , 直到找到被按下的键所在的行与列的交叉点 。
第四步:键值确定
在第三步中 , 当确定有按键被按下 , 则按照事先确定好的按键序号 , 根据行与列的交叉位置确定键值 。 简直一般按照一定的规律排列 , 例如1,2,3,4.... 。 例如确定第一行第一列的交叉点按键为1号按键 , 第一行与第二列交叉点的按键为2号按键....第四行与第四列的交叉点的按键为16号按键 。


推荐阅读