矩阵式键盘接口设计(用单片机读取4x4矩阵式键盘的键号,并将其显示在数码管上)(Proteus 与Keil uVision联合仿真)

时间:2024-10-07 07:15:37

一、实验原理

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)软件消抖:在单片机程序中,可以采取一定的算法来检测按键的真实触发信号。当检测到按键状态发生变化时,即从未按下到按下或从按下到未按下,可以认为触发了一次按键操作。在这个过程中,使用去抖动算法来过滤掉抖动信号。