我把矩阵键盘和数码管动态显示综合起来写了个程序。这个代码的意思是在一开始8个数码管什么也不显示,因为p0的初始值是0x00,当我们按下矩阵按键里的按键时,8个数码管动态显示该按键的键值,直到按下了下一个按键,8个数码管显示的内容才可能改变。
#include<reg52.h>//目的是每按下一个按键,8个数码管就动态显示对应的键值
sbit lsa=P2^2;
sbit lsb=P2^3;
sbit lsc=P2^4;
#define duanxuan P0
#define keyboard P1
int zxm[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
int x,y;
void delay(int i)
{
while(i--);
}
void keyproc()
{
int a=0;
P1=0x0f;//检测是哪一列有按键按下;
if(P1!=0x0f)
{
delay(1000);
if(P1!=0x0f)
{
P1=0x0f;
switch(P1)
{
case(0x07):y=1;break;
case(0x0b):y=2;break;
case(0x0d):y=3;break;
case(0x0e):y=4;break;
}
}
P1=0xf0;//检测是哪一行有按键按下
switch(P1)
{
case(0x70):x=1;break;
case(0xb0):x=2;break;
case(0xd0):x=3;break;
case(0xe0):x=4;break;
}
P0=zxm[(x-1)*4+y-1];
}
}
int main()
{
P0=0x00;
while(1)
{
lsa=0;lsb=0;lsc=0;//位选选了第1个
lsa=1;lsb=0;lsc=0;//位选选了第2个
lsa=0;lsb=1;lsc=0;//位选选了第3个
lsa=1;lsb=1;lsc=0;//位选选了第4个
lsa=0;lsb=0;lsc=1;//位选选了第5个
lsa=1;lsb=0;lsc=1;//位选选了第6个
lsa=0;lsb=1;lsc=1;//位选选了第7个
lsa=1;lsb=1;lsc=1;//位选选了第8个
keyproc();
}
return 0;
}