矩阵键盘有几行代码不懂,求高手支招!
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar disnum,temp,key,num;
uchar code table_du[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0};
delay(uchar);
uchar keyscan();
void main()
{
disnum=16;
wela=1;
P0=0XFE;
wela=0;
while(1)
{
num=keyscan();
P0=table_du[num];
dula=1;
dula=0;
}
}
uchar keyscan()
{
P3=0xf0;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
temp=temp|0X0f; //这行代码表示什么意思?
P3=temp;
key=P3;
switch(key)
{
case 0xee:disnum=0;
break;
case 0xde:disnum=1;
break;
case 0xbe:disnum=2;
break;
case 0x7e:disnum=3;
break;
case 0xed:disnum=4;
break;
case 0xdd:disnum=5;
break;
case 0xbd:disnum=6;
break;
case 0x7d:disnum=7;
break;
case 0xeb:disnum=8;
break;
case 0xdb:disnum=9;
break;
case 0xbb:disnum=10;
break;
case 0x7b:disnum=11;
break;
case 0xe7:disnum=12;
break;
case 0xd7:disnum=13;
break;
case 0xb7:disnum=14;
break;
case 0x77:disnum=15;
break;
}
}
}
return disnum;
}
delay(uchar x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=200;b>0;b--);
}
uchar keyscan()
{
P3=0xf0; //先给P3赋一个初值
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0) //如果有键按下temp!=0xf0成立
{
delay(10); //延时消抖
if(temp!=0xf0) //再次判断有键按下temp!=0xf0成立
{
temp=P3; //读取P3的值保存在temp
temp=temp|0X0f; //temp保留高4位的值,低4位全置1 //这行代码表示什么意思?
P3=temp; //再把temp的值赋给P3,高4位不会变化,低4位会变化
key=P3; //此时读取P3的值就是高4位+低4位值,此值赋给key
switch(key)
{
我这样理解对不
你理解的不准确
uchar keyscan()
{
P3=0xf0; //先给P3赋一个初值 1111 0000
temp=P3; //此句无实际意义,可以舍弃
temp=temp&0xf0; //此句无实际意义,可以舍弃
if(temp!=0xf0) //如果有键按下temp!=0xf0成立 XXXX 0000(高4位4个X中有1个为0其余为1)
{
delay(10); //延时消抖
if(temp!=0xf0) //再次判断有键按下temp!=0xf0成立 XXXX 0000
{
temp=P3; //读取P3的值保存在temp XXXX 0000
temp=temp|0X0f; //temp保留高4位的值,低4位全置1 XXXX 1111
P3=temp; //再把temp的值赋给P3,高4位不会变化,低4位会变化 XXXX XXXX(低4位4个X中有1个为0其余为1)
key=P3; //此时读取P3的值就是高4位+低4位值,此值赋给key
switch(key)
{
还是不太懂
个人认为应该要加几行语句,如下
uchar keyscan()
{
P3=0xf0;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3; //增加
temp=temp&0xf0; //增加
if(temp!=0xf0)
{
temp=P3;
给你一个比较好懂的写法
uchar keyscan()
{
uchar temp1,temp2,temp3;//临时变量
P3=0xf0; //先给P3赋一个初值,1111 0000
if(temp!=0xf0) //如果有键按下,假设1110 0000,执行花括号内语句,
{
delay(10); //延时消抖
if(temp!=0xf0) //再次判断有键按下,1110 0000
{
temp1=P3; //读取P3实际值保存在temp1,1110 0000
P3=0x0f; //再给P3赋值0x0f,0000 1111
temp2=P3; //读取P3实际值保存在temp2,假设0000 1110
temp3=temp1|temp2;//temp3=1110 0000按位或0000 1110,结果是1110 1110
key=temp3; //把temp3值赋与key,1110 1110
switch(key)
{
......
你确定一楼贴出来的程序是能正确运行的吗
能