单片机控制键盘电路优化设计与实现

2022-04-28 08:53郭弘泽陈丽霞杨建利
黑龙江科学 2022年8期
关键词:二进制二极管按键

郭弘泽,李 敏,b,陈丽霞,b,杨建利,c,王 虹,b

(河北大学 a.电子信息工程学院; b.光伏技术虚拟仿真实验教学中心; c.河北省数字医疗工程重点实验室,河北 保定 071002)

0 引言

单片机应用系统中,键盘是人机交互必不可少的部分。通常实现单片机键盘的方法主要有独立式键盘结构和矩阵式键盘结构。在按键数量较多时,为了减少I/O口的需求,通常采用矩阵式键盘结构[1-3]。现有的矩阵式键盘在使用过程中,使用的是x+y条线布局,可以监控的按键数量为x×y个,若x和y均为4,那么在原有的8条线的基础上加一条线,就可以实现最多4×5=20个按键的监控。但是,单片机的内部资源不管是ROM、RAM还是I/O口都是非常有限的资源,诸如这种x+y条线控制x×y个按键的情形,某种程度上来说对单片机的资源占用是非常大的。目前,对于矩阵式键盘主要采用扫描式进行识别,有些按键需要扫描多次才能最终确认是否被按下,这就造成了很大的延迟。针对这种8个I/O口可以实现对4×4=16个按键的识别与监控的键盘结构之后又出现了一种改进型的按键阵列设计,可以使用8+2个I/O口来监控8×8=64个按键[4],这种按键阵列设计虽然使得监控按键的数量有所增加,但按键拓展性不强,且仍采用扫描式识别,依然存在较大的时间延迟问题。基于此,介绍了一种基于51单片机的键盘电路优化设计,以解决现有的按键阵列设计拓展性不强、扫描式识别所带来的时间延迟较大的问题。

1 硬件电路设计

如图1所示,键盘电路以15个按键为例进行说明。本例中键盘电路选用AT89C51型号单片机,在单片机的最小系统上搭建了键盘电路和显示电路。

图1 键盘电路仿真图Fig.1 Keyboard circuit simulation diagram

1.1 键盘电路

AT89C51型单片机上具有P0、P1、P2和P3四组端口,每组端口又包括8位I/O口。其中,P0组端口的8个引脚经反向截止器与键盘电路中相应的按键连接构成键盘电路,因为51单片机P0口内部没有上拉电阻,为高阻状态,所以不能正常输出高/低电平,为此在连接按键时外接了8只10kΩ大小的上拉电阻;P2组端口的8个引脚与单只数码管的段码相连,数码管的公共端为电源,由此构成显示电路[5]。

键盘电路中的15个按键命名为K1~K15,每一个按键都有各自对应的编号,每个编号采用二进制表示,如按键1的编号是0001,按键2的编号是0010,以此类推,按键15的编号是1111。本例中通过P0组端口的4个引脚来监控按键K1~K15按键,但是需要注意的是,按键与单片机上的引脚之间并非是直接的导线连接,两者之间还需要设置一个反向截止器。该按键电路中的反向截止器选用二极管,由二极管的正极连接按键,二极管的负极连接单片机的引脚。每一个按键的左侧至少连接一个二极管,按键通过二极管与单片机上P0组端口的其中4个引脚P0.0、P0.1、P0.2和P0.3相连接。各按键对应的编号用四位二进制来表示,因此,根据各按键的二进制编号并结合四位二进制的位次,将各按键与对应二进制位次的引脚进行连接,即引脚P0.0对应四位二进制中的第一位(最低位),P0.1对应四位二进制中的第二位,P0.2对应四位二进制中的第三位,P0.3对应四位二进制中的第四位(最高位)。连接时,依据按键的二进制编号中所存在的所有“1”对应的二进制位次进行按键与引脚之间的连接。例如:对于按键K7,其二进制编号为0111,在该二进制编号0111中,存在三个“1”,且这三个“1”所对应的二进制位次分别是四位二进制的低三位,因此,按键K7需要和单片机中三个引脚进行连接,即按键K7连接单片机的引脚P0.0(网络标号:00)、P0.1(网络标号:01)和P0.2(网络标号:02)。

本例中按键的排序是采用二进制进行的布局,按键K1对应的二进制编号为0001,因此,按键K1左端通过导线接一个二极管后接到单片机的引脚P0.0(网络标号:00)上,其二进制转成十进制后数为1;依次类推,按键15对应的二进制编号为1111,因此,按键K15左端通过导线分别连接四个二极管后分别接到单片机的引脚P0.0(网络标号:00)、P0.1(网络标号:01)、P0.2(网络标号:02)和P0.3(网络标号:03)上,即:按键K15对应四个高电平,其二进制转成十进制后数为15(仿真结果如图1所示)。因此,采用四个I/O口,能检测的按键最多是15个,通过将单片机n个引脚连接按键的拓展后,键盘电路中包括2n-1个按键(1≤n≤8),每个按键具有唯一的二进制编号;这n个引脚分别对应n位二进制的位,依据各按键n位二进制编号中所有1所在n位二进制的位次,将按键与单片机上的相应引脚相连接;或者对于某一按键来说,该按键n位二进制编号中所有1所在n位二进制的位次,在单片机中存在相对应的引脚,将该按键与单片机中相对应的引脚之间通过导线连接,即实现了按键与单片机的连接;按键被按下后,与其相连接的导线导通,对应引脚呈现高电平,显示单元在单片机的作用下,可将按键的二进制编号所对应的十进制数按十六进制显示出来。依照本例中键盘电路的设计方式,二进制数00000000无法检测,且8位二进制数最多可以表示十进制的256,因此,此类型键盘电路可以利用单片机的8个I/O口,实现255个单只按键的检测。

1.2 二极管的应用

本例键盘电路中的所有按键均通过二极管与单片机的引脚相连接,该二极管的加入使得在某个按键按下时,能够保证与该按键相接的I/O口呈现高电平,而其他与该按键不相接的I/O口依然是低电平,可以避免一个按键被按下,所有I/O口全部接收到1进而呈现高电平的情况的发生。本例在Proteus仿真中采用了二极管实现反向截止,实际运用中可以采用其他的元器件,只要在一定电压内的具有反向截止特性即可满足条件。

1.3 显示电路

显示电路以单只数码管为核心,采用共阳极连接方式,由单片机的P2端口的8个引脚完成段码控制,以十六进制形式实现按键K1~K15的序号显示。显示电路的主要作用是显示按键号,以此测试按键排序[6]。如图1所示,按键K15被按下后,数码管显示为F。

2 键盘电路软件设计

按键的检测通过单片机引脚的电平变化来确定。需要特别说明的是:在本例中,无按键按下时单片机的P0端口的四个引脚(P0.0、P0.1、P0.2和P0.3)的值为0000,依照本例的按键排序方法,按键0对应的二进制编号为0000,对于此种情况,按键K0按下前后就无法产生电平变化,故不能用此方法来进行按键K0的监控,同理,八位二进制数中也存在一个无法检测的二进制数00000000。为此,本例中按键排序由K1开始,启动程序后,显示电路显示“0”时代表无键按下。以下为判别K1-K15按键的C语言部分源程序[7-9]。

void main()

{

P0 = 0x00; //P0口初始化

P1 = 0xff; //P1初始化

num =0;

P2 = shuzi[num];//无按键时显示为0

while(1)

{

if(P0!=0x00&&P0!=0xff)

{

DelayMs(5);

if(P0!=0x00&&P0!=0xff)//延时判断是否有按键按下

{

temp = P0; //P0口状态读取

if(temp%10>=0&&temp%10<=9)

{

num = temp%10; //读取键号0-9

}

switch(temp) //读取键号10-15(显示为16进制A-F)

{

case 0x0a:

num = 10;

break;

case 0x0b:

num = 11;

break;

case 0x0c:

num = 12;

break;

case 0x0d:

num = 13;

break;

case 0x0e:

num = 14;

break;

case 0x0f:

num = 15;

break;

default:;

}

P2 = shuzi[num];// 键值显示

}

}

}

}

根据上述程序可知在软件设计上只需要两行代码temp=P0,P2=shuzi[temp],即可实现对15个按键的识别与显示。如果需要增多按键,只需要改变对应的显示代码,但是获取按键的编号仍然只需要一行代码temp = P0。相比于传统的方案,大大加快了按键的识别及响应速度,极大地缩短了所需的代码,最低只需一行代码就可以获得被按下按键的具体编号,与扫描式识别相比,效率大大提升。

3 实验测试

为了检测优化后的键盘电路的可靠性、按键响应速度及延迟时间[10],完成了4×4矩阵键盘和优化键盘电路实物对比测试。在保证按键确定按下的情况下对两种键盘电路的按键进行多次随机检测,以STC89C52单片机为控制器,在晶振频率为11.059 2 MHZ的单片机最小系统下测试[11-12],此时该系统的机器周期Tcy≈1.085 μs。在单片机内部的定时/计数器T0工作于方式1的情况下,记录两种按键在去除软件消抖时间后的按键识别时间所需的定时器计数个数。测试结果表明,优化后的键盘的多个按键识别时间较为稳定且约为传统键盘识别时间的1/3,矩阵键盘中按键识别时间在同一行内相同,不同行内有一定差别。某次测试结果如表1所示,需说明表1内键值K0仅适用于4×4矩阵键盘,优化键盘不存在K0按键。

4 结语

优化后的键盘电路在充分利用了二极管的单向导通性的情况下,利用单片机的4个引脚实现了2n-1即15个按键(n=4)的控制,大大减少了控制按键的I/O的数量,避免了过多占用单片机I/O端口资源,硬件电路设计简单。借助Proteus仿真软件及KEIL编写的C语言程序,以单只发光二极管显示了触发按键的按键序号,软件代码简洁,对比传统的扫描方式按键电路,优化后的键盘电路对按键的识别更高效。证明本电路响应速度快,扩展性强,能够稳定可靠地工作。本例方法可适用于按键数量较多且单个控制的工程应用。

猜你喜欢
二进制二极管按键
用二进制解一道高中数学联赛数论题
基于有限状态机的按键检测程序设计
有趣的进度
二进制在竞赛题中的应用
按键消抖在单片机和FPGA实验教学中的应用
一种多方向导光按键结构设计
二极管及其典型应用电路仿真测试
二进制宽带毫米波合成器设计与分析
Smart Shirts Generate Electricity
超高亮度发光二极管外延片和芯片产业化