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 后查看