一、实验原理
1、分析电路中按键状态检测的方法。
矩阵式(也称行列式)键盘用于按键数目较多的场合,由行线和列线组成,按键位于行、列交叉点上,见图5-26,一个4×4的行、列结构可以构成一个16个按键的键盘,只需要一个8位的并行I/O口即可。
如果采用8×8的行、列结构,可以构成一个64按键的键盘,只需要两个并行I/O口即可。 在按键数目较多场合,矩阵式键盘要比独立式键盘节省较多I/O口线。 在图5-26中行线通过上拉电阻接+5V,当无键按下时,行线为高电平,而有键按下时,则对应的行线和列线短接,行线电平状态将由与此行线相连的列线电平决定。
键盘矩阵中无按键按下时,行线处于高电平状态;当有按键按下时,行线电平状态将由与此行线相连的列线的电平决定。
图5-26
列线的电平如果为低,则行线电平为低;列线的电平如果为高,则行线的电平也为高,这一点是识别矩阵式键盘是否有按键按下的关键所在。由于矩阵式键盘中行、列线为多键共用,各按键均影响该键所在行和列的电平,因此各按键彼此将相互发生影响,所以必须将行、列线信号配合,才能确定闭合键的位置。
识别矩阵键盘有无键被按下,可分两步进行:
第1步,首先识别键盘有无键按下;
第2步,如有键被按下,识别出具体的键号。
下面以图5-26所示的K3键被按下为例,说明扫描法识别此键的过程。
第1步,识别键盘有无键按下。首先把所有列线均置为0电平,然后检查各行线电平是否都为高电平,如果不全为高电平,说明有键按下,否则说明无键被按下。例如,当K3键按下时,第1行线电平为低电平,但还不能确定是K3被按下,因为如果同一行的K2、K1或K0之一被按下,行线也为低电平。所以,只能得出第1行有键被按下的结论。
第2步,识别出哪个按键被按下。采用逐行扫描法,在某一时刻只让1条列线处于低电平,其余所有列线处于高电平。当第1列为低电平,其余各列为高电平时,因为是K3被按下,所以第1行的行线仍处于高电平状态;而当第2列为低电平,其余各列为高电平时,同样也会发现第1行的行线仍处于高电平状态;直到让第4列为低电平,其余各列为高电平时,此时第1行的行线电平变为低电平,据此,可判断第1行第4列交叉点处的按键,即K3被按下。
与独立式键盘类似,常见的矩阵式键盘扫描的工作方式也分为查询方式和中断方式。
二、设计硬件电路原理图,画出实际接线图。
三、根据实验任务设计出相应的程序。
#include <reg51.h>
#define uchar unsigned char
sbit L1=P1^0; // 定义键盘的4列线
sbit L2=P1^1;
sbit L3=P1^2;
sbit L4=P1^3;
uchar code dis[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86, 0x8e}; //共阳极数码管字符0~F
// 对应的段码
unsigned int time;
void delay(unsigned int time) //延时函数
{
unsigned int i;
for(i=0;i<time;i++)
{ }
}
main() //主函数
{
uchar temp;
uchar i;
while(1)
{
P1=0xef; //行扫描初值,P1.4=0,P1.5~ P1.7=1
for(i=0;i<=3;i++) //按行扫描, i为行变量,一共4行
{
if(L1==0) P2=dis[i*4+0]; //判第1列是否有键按下,若有,键号可
//能为0,4,8,C,键号的段码送显示
if(L2==0) P2=dis[i*4+1]; //判第2列是否有键按下,若有,键号可能为
//1,5,9,d,键号的段码送显示
if(L3==0) P2=dis[i*4+2]; //判第3列是否有键按下,若有,键号可能为
//2,6,A,E,键号的段码送显示
if(L4==0) P2=dis[i*4+3]; //判第4列是否有键按下,若有,键号可
//能为3,7,b,F,键号的段码送显示
delay(500); //延时
temp=P1; //读入P1口的状态
temp=temp|0x0f; //使P1.3~P1.0为输入
temp=temp<<1; // P1.7~P1.4左移1位,准备下一行扫描
temp=temp|0x0f; //移位后,置P1.3~P1.0为1,保证其仍为输入
P1=temp; //行扫描值送P1口,为下一行扫描做准备
}
}
}
三、实验结果:
(1)按下第一个按键时:
(2)按下最后一个按键:
四、思考题
1、键盘接口程序设计的主要任务是?
(1)去抖动处理:由于机械按键在按下和释放时会产生抖动,需要设计去抖动算法来滤除这些不必要的信号波动,确保按键信号的准确性。
(2)数据转换:将键盘发送的扫描码转换为对应的字符码,以便操作系统识别和处理。
2、如何消除按键的抖动?
(1)硬件消抖:通过在键盘输入引脚上加一个RC组合电路,延迟触发信号的上升沿和下降沿,从而消除抖动。RC组合电路由一个电阻R和一个电容C组成,其原理是通过RC的时间常数来控制信号的上升和下降过程。
(2)软件消抖:在单片机程序中,可以采取一定的算法来检测按键的真实触发信号。当检测到按键状态发生变化时,即从未按下到按下或从按下到未按下,可以认为触发了一次按键操作。在这个过程中,使用去抖动算法来过滤掉抖动信号。