首页 > 编程知识 正文

矩阵按键线反转法(51单片机外设之——矩阵键盘(传统法一))

时间:2023-05-04 06:25:20 阅读:122758 作者:306

如上所述,独立键与矩阵键盘分离。 接下来看到的是4*4的矩阵键盘,这里使用的是上一节中使用的延迟抖动补偿检测。

附上矩阵键盘的原理图:

使用矩阵键盘时,将一个和两个J5排针帽连接到J5排针帽上,确保所有键的有效端口都连接到I/O端口。

具体扫描方法如下

首先,将不同的电平值分配给P3 ^0^ P3 ^ 7的前4位和第4位,检测在确定按下键时按下了哪个行或列(原本前4位中的1位成为低电平),将前4位和第4位分配给与上次相反的电平一旦检测到,就可以找到按下的按钮。

作为例子,将S4~S19的16个键从上到下、从左到右分别设定为1~16个不同的键值,当按下S4时,数字码管显示为1; 按S19,数码管显示为16。

其核心代码如下(有关数字代码、显示函数等变量的定义,请参照前面所示的数字代码博文)。

uchar temp; 用于存储//P3端口的状态uchar key_value=0; //键值定义void矩阵密钥扫描() { P3=0x0f; //p3的前4位为0,第4位为1 temp=P3; //用一个变量保存P3端口的状态,以免从外部影响P3端口引起扫描错误if(TEMP )=0x0f (延迟10ms ); if(temp!=0x0f () /按下确定键(查看交换机(temp )/P3 (temp )状态) { case0x0e :key_value=1; 布雷克; //按下的是第1行的case0x0d :key_value=5; 布雷克; case0x0b :key_value=9; 布雷克; case0x07 :key_value=13; 布雷克; //按下的是第4行} } P3=0xf0; //再重新代入P3端口时,前4位为1,第4位为0 temp=P3; if(temp!=0xf0)交换机(temp ) { case0xe0 : key_value =3; 布雷克; //按下的是第4列,在键值key_value中输入3 case0xd0 : key_value =2; 布雷克; case0xb0 : key_value =1; 布雷克; case0x70 : key_value =0; 布雷克; //按下的是第一列,对键值key_value为0}}while(p3!=0xf0; //放手检测。 最近的赋值为P3=0xf0 }}void main () while) ) ({矩阵密钥) ); //在主函数中调用矩阵键盘扫描函数if(key_value9)//判定键值,{ dspbuf[1]=key_value; dspbuf[0]=key_value/10; } else { dspbuf[0]=key_value; dspbuf[1]=10; //键值小于10时,不显示10位,只显示1位,段数组的第10个是阴影} display (; //数码管显示函数}}注:这里基于89C52单片机的关键扫描,但蓝桥杯指定的开发板平台(CT107D )使用的单片机他们具体地说,可以参考STC15F2K61S2芯片手册。 (其他差异一般比51单片机运行速度快,运行时可以选择是否分频; 该中断模式多于51,一些I/O端口有其他功能等……)。

这里有几个需要注意的地方:

1、主函数在编程时尽量少进行数据处理等操作,主函数主要用于调用其他函数。

2、使用STC15F2K61S2单片机时,在P3端口的2次赋值和高4位电平检测阶段,需要分别列出P4^2、P4^4,并与其余6个P3引脚的I/O端口一起检测

3、P3口的第二次赋值也应该包含在第一个if语句中。 确定按下后,开始扫描行和列。 行、列扫描是对一个键的扫描,不能分开。

没有后续……

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。