P1^0空,用的是P1^1-7口。这是我写的程序,我先给一行送低电平,检测列。结果第一列0,4,8。显示不了,其他列都正常显示,而且按下第一列的键第一次没有反应,再去按其他键先显示那个刚刚按下的第一列的数,之后再按又显示自己的键值。
我换个先给列送低电平的,又完全好了。求教。。
本人第一次发帖,如有不当,请多包涵。
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
void delay(uint z);
void display(uchar);
sbit LE = P1^0;
uchar code table[] = {
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
uchar num,temp,key;
void main()
{
P0=0xc0;
while(1)
{
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:key=0;break;
case 0xdd:key=1;break;
case 0xbd:key=2;break;
case 0x7d:key=3;break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:key=4;break;
case 0xdb:key=5;break;
case 0xbb:key=6;break;
case 0x7b:key=7;break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:key=8;break;
case 0xd7:key=9;break;
case 0xb7:key=10;break;
case 0x77:key=11;break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
}
}
void display(uchar num)
{
P0=table[num%16];
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
} |