8051矩阵键盘
题目要求是:按下第一个键,让数码管显示1,第二按键按下,显示2,以此类推。
1、只列举了4*4矩阵键盘第一行的情况在temp=P3这个语句中不太理解,不懂为什么按下第一行的第一个按键可以在数码管显示相应的数字,按第二个也可以显示相应的数字,第三,第四也可以。
2、不太懂I\O口置1的输入模式,是不是只要从I\O口接收数据,便先置1,接着直接读取I\O口的数据即可吗?那么每一次读取前都要置1 吗?
问题描述有所欠缺,若有不够好的地方,希望提出来,我会完善信息。愿有人能帮忙解决问题,感激不尽。
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6; //数码管段选,锁存器控制
sbit wela=P2^7; //数码管位选,锁存器控制
uchar num,temp;
uchar code table[]={ //数码管编码
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z);
void main()
{
dula=1;
P0=0; //给段选送数据
dula=0;
wela=1;
P0=0xc0; //给位选送数据,选中所有数码管
wela=0;
while(1)
{
P3=0xfe; //P3口接矩阵键盘
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0) //若temp=0xf0,则第一行没有按键被按下。若不等于,则有按键被按下
{
delay(5); //延时消抖
temp=P3; //消抖后再读取P3口的数据
temp=temp&0xf0; //此时读取的数据便是稳定的
while(temp!=0xf0)
{
temp=P3; //不懂
switch(temp)
{
case 0xee: num=1;
break;
case 0xde: num=2;
break;
case 0xbe: num=3;
break;
case 0x7e: num=4;
break;
}
dula=1; //打开段选
P0=table[num-1]; //给数码管输送数据
dula=0; //保持
}
}
}
}
void delay(uint z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}