51单片机矩阵键盘控制数码管

发布于:2022-12-16 ⋅ 阅读:(323) ⋅ 点赞:(0)

51单片机矩阵键盘控制数码管

我们先了解矩阵键盘的工作原理,掌握编码方法并能够编写出扫描程序,使用矩阵键盘控制数码管输出矩阵键值。

显示内容

在显示模块的八位 LED 数码的个位显示当前使用矩阵键盘所按下的值。
键阵键盘多用于键数目较多的时候。这样可以更多的节省IO口的占用量,
对于矩阵键盘常用的扫描方法为线反转查询法。具体的思路是:首先使行作为输入,使用单片机内部电阻上拉为高电平,列输出低电平,读行的状态。如果行有一个IO口是低,说明有键按下,进行下一步,否则退出扫描。如果有键按下,置列为输入,行输出低电平,读列的状态。最后根据
行列的状态查表就可以知道是那个按键按下。
在这里插入图片描述

#include <reg52.h>
#include <absacc.h>


#define smgdat P0	//数码管数据口
#define temp P2		//矩阵键盘数据口

sbit smgcs1 = P1^5;     //数码管控制
sbit smgcs2 = P1^6;
sbit smgwe = P1^4;

#define uchar unsigned char
#define uint  unsigned int

uchar keyfhz=255,juzz;		//定义一个返回

uchar code 	smg_dat[] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 };

void delay(uint i){while(i--);}

void juzxs(void);   //矩阵键盘扫描取值
void smgsaom(uchar dat1,uchar dat2,uchar dat3,uchar dat4,uchar dat5,uchar dat6,uchar dat7,uchar dat8);
void t0init(void);
void keyscan()
    {
       uchar num;	
	   EA = 0;
       temp=0x0f;	 //拉低4位
       if(temp!=0x0f)   	//判断是否有按键按下
       {
          delay(500);		//¸消抖
          if(temp!=0x0f)
          {
             temp=0x0f;    
             switch(temp)
             {
                case 0x07: num=1; break;
                case 0x0b: num=2; break;
                case 0x0d: num=3; break;
                case 0x0e: num=4; break;
             }
             temp=0xf0;   //拉低高4位,在判断
             switch(temp)
             {
                case 0x70: num=num+0;  break;
                case 0xb0: num=num+4;  break;
                case 0xd0: num=num+8;  break;
                case 0xe0: num=num+12; break;
             }
          }
       }
       keyfhz = num;	//把取出来的值附给keyfhz
       num = 255;  //复位
	   EA=1;      
    }
void main()
{
	t0init();	   //定时器0为数码管扫描
	while(1)
	{
	  keyscan();   //矩阵键盘扫描
	}
}


void t0init(void)
{
	TF0 = 0;		
	TR0 = 1;	
 	ET0 = 1;
	EA = 1;
}

void smgsaom(uchar dat1,uchar dat2,uchar dat3,uchar dat4,uchar dat5,uchar dat6,uchar dat7,uchar dat8)
{
		if(dat1!=11)
    {
	 smgcs1=0;smgcs2=1;smgdat = smg_dat[dat1];smgwe=1;delay(10);smgwe=0;
	 smgcs1=1;smgcs2=0;smgdat = 0xfe;smgwe=1;delay(10);smgwe=0;
	 delay(50);smgcs1=smgcs2=0;smgdat = 0xff;smgwe=1;smgwe=0;	
	}
		if(dat2!=11)
    {
	 smgcs1=0;smgcs2=1;smgdat = smg_dat[dat2];smgwe=1;delay(10);smgwe=0;
	 smgcs1=1;smgcs2=0;smgdat = 0xfd;smgwe=1;delay(10);smgwe=0;
	 delay(40);smgcs1=smgcs2=0;smgdat = 0xff;smgwe=1;delay(10);smgwe=0;	
	}
		if(dat3!=11)
    {
	 smgcs1=0;smgcs2=1;smgdat = smg_dat[dat3];smgwe=1;delay(10);smgwe=0;
	 smgcs1=1;smgcs2=0;smgdat = 0xfb;smgwe=1;delay(10);smgwe=0;
	 delay(40);smgcs1=smgcs2=0;smgdat = 0xff;smgwe=1;delay(10);smgwe=0;	
	}
		if(dat4!=11)
    {
	 smgcs1=0;smgcs2=1;smgdat = smg_dat[dat4];smgwe=1;delay(10);smgwe=0;
	 smgcs1=1;smgcs2=0;smgdat = 0xf7;smgwe=1;delay(10);smgwe=0;
	 delay(40);smgcs1=smgcs2=0;smgdat = 0xff;smgwe=1;delay(10);smgwe=0;	
	}
		if(dat5!=11)
    {
	 smgcs1=0;smgcs2=1;smgdat = smg_dat[dat5];smgwe=1;delay(10);smgwe=0;
	 smgcs1=1;smgcs2=0;smgdat = 0xef;smgwe=1;delay(10);smgwe=0;
	 delay(40);smgcs1=smgcs2=0;smgdat = 0xff;smgwe=1;delay(10);smgwe=0;	
	}
		if(dat6!=11)
    {
	 smgcs1=0;smgcs2=1;smgdat = smg_dat[dat6];smgwe=1;delay(10);smgwe=0;
	 smgcs1=1;smgcs2=0;smgdat = 0xdf;smgwe=1;delay(10);smgwe=0;
	 delay(40);smgcs1=smgcs2=0;smgdat = 0xff;smgwe=1;delay(10);smgwe=0;	
	}
		if(dat7!=11)
    {
	 smgcs1=0;smgcs2=1;smgdat = smg_dat[dat7];smgwe=1;delay(10);smgwe=0;
	 smgcs1=1;smgcs2=0;smgdat = 0xbf;smgwe=1;delay(10);smgwe=0;
	 delay(40);smgcs1=smgcs2=0;smgdat = 0xff;smgwe=1;delay(10);smgwe=0;	
	}
		if(dat8!=11)
    {
	 smgcs1=0;smgcs2=1;smgdat = smg_dat[dat8];smgwe=1;delay(10);smgwe=0;
	 smgcs1=1;smgcs2=0;smgdat = 0x7f;smgwe=1;delay(10);smgwe=0;
	 delay(40);smgcs1=smgcs2=0;smgdat = 0xff;smgwe=1;delay(10);smgwe=0;	
	}
}


 void t0zd(void) interrupt 1
{
	TL0 = 0xA4;		//ÉèÖö¨Ê±³õÖµ
	TH0 = 0xFF;		//ÉèÖö¨Ê±³õÖµ
	smgsaom(juzz,1,1,1,2,11,11,11);	
} 


本文含有隐藏内容,请 开通VIP 后查看