您的位置:首页 > 其它

矩阵键盘按键LED显示键值

2010-02-07 20:44 543 查看
这两天事情很忙,有时间的时候才来调试一下程序。想调出一个LED显示矩阵键盘按键程序,调试了很久。先调其中的一行按键键值很OK。接着就调试4行按键程序,这其中出现了问题。

写的程序语法没有错误,逻辑上有错误很难找。最后参考了别人的程序,调出了满意的结果。

写矩阵一行的程序时,主程序:

main()

{

init();

while(1)

{

keyscan();//键盘扫描程序,返回一个值全局变量keynum

display(keynum);

}

}

单独调试第三行的时候没有出现问题,能得出正确的键值。

这样应该是不会出现错误。但是&与,&&按位与前者为总线操作,后者位操作。

&是位与运算;&&是逻辑与运算。
举例:a=0xfe;b=0x31;
则:a&b=0x30; 返回的是数据。
a=0xfe;b=0x31;c=0x11;d=0x00;
则:(a>b)&&(b>c)=1(真)
(a>b)&&(c>a)=0(假,c小于a)
a&&b (真,对于不为0的数全为真,即 真“与”真,结果:真)
a&&d (假,a真d假,即 真“与”假,结果:假)
返回的是布尔值。(只有1(真)和0(假))

等待松手程序和确认按键程序中都写成了,temp=P3;temp=temp&&0xf0;

所以出现了错误。

正确的程序为temp=P3;temp=temp&0xf0;

松手检测在确认按键后。

经过下列程序调试,实验成功。

/********************************************/
/**********矩阵键盘按键显示******************/
/***************************2010年2月7日21时*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar keynum;
sbit duan=P2^6;
sbit wei=P2^7;
uchar code table[]=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39 ,0x5e,0x79,0x71};
void display(uchar num);

/******延时XMS************
**************************/
void delay(uchar xms)
{
uchar i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}

/******初始化*******************
********************************/
void init()
{
duan=1;
P0=0x00;//初始时关段显示
duan=0;
wei=1;
P0=0x00;//位选全部选中
wei=0;
}

keyscan()
{
uchar temp;
P3=0xfe;//第三行 1111 1110
temp=P3;
temp=temp&0xf0;//屏蔽低四位
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0x7e:
keynum=15;
break; //0111 1110
case 0xbe:
keynum=14;
break;
case 0xde:
keynum=13;
break;
case 0xee:
keynum=12;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(keynum);

}

}

P3=0xfd; //第二行1111 1101
temp=P3;
temp=temp&0xf0;//屏蔽低四位
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0x7d:
keynum=11;
break;
case 0xbd:
keynum=10;
break;
case 0xdd:
keynum=9;
break;
case 0xed:
keynum=8;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(keynum);

}

}

P3=0xfb;//第一行1111 1011
temp=P3;
temp=temp&0xf0;//屏蔽低四位
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0x7b:
keynum=7;
break;
case 0xbb:
keynum=6;
break;
case 0xdb:
keynum=5;
break;
case 0xeb:
keynum=4;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(keynum);

}

}

P3=0xf7; //第零行 1111 0111
temp=P3;
temp=temp&0xf0;//屏蔽低四位
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0x77:
keynum=3;
break; //1110 1110
case 0xb7:
keynum=2;
break; //1101 1110
case 0xd7:
keynum=1;
break; //1011 1110
case 0xe7:
keynum=0;
break; //0111 1110
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(keynum);

}

}

}

void display(uchar num)
{
duan=1;
P0=table[num];
duan=0;
// delay(500);//时间足够短让人分辨不出来闪烁的效果
}

void main()
{
init();
while(1)
{
keyscan();
//display();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: