单片机4*4键盘分别控制数码管显示0-f,不知道哪里错了,控制cdef的四个键不对,其他都对 求高手指点,多谢

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit wale=P1^4;
uchar code b[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x1e};
uint num,temp;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
while(1)
{
P0=b[num];
wale=0;
delay(2);
wale=1;
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5);
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{ temp=P3;
switch(temp)
{
case 0xe7:num=0;
break;
case 0xd7:num=1;
break;
case 0xb7:num=2;
break;
case 0x77:num=3;
break;
}
while(temp!=0xf0)
{ temp=P3;
temp=temp&0xf0;}
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5);
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{ temp=P3;
switch(temp)
{
case 0xeb:num=4;
break;
case 0xdb:num=5;
break;
case 0xbb:num=6;
break;
case 0x7b:num=7;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5);
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{ temp=P3;
switch(temp)
{
case 0xed:num=8;
break;
case 0xdd:num=9;
break;
case 0xbd:num=10;
break;
case 0x7d:num=11;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5);
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{ temp=P3;
switch(temp)
{
case 0xee:num=12;
break;
case 0xde:num=13;
break;
case 0xbe:num=14;
break;
case 0x7e:num=15;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
}
}

#include<reg51.h>           //   试试这个
#define uchar unsigned char
uchar temp;
int key1,key,disbuf;// 此表为 LED 的字模 0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
unsigned char code LED7Code[] = {~0x3F,~0x06,~0x9B,~0x8F,~0xA6,~0xAD,~0xBD,~0x07,~0xBF,~0xAF,~0xB7,~0xBC,~0x39,~0x9E,~0xB9,~0xB1};
void delay(uchar z)
{
 uchar i,j;
  for(i=0;i<120;i++)
  for(j=0;j<z;j++);
 }
void scan()   //  要是按键了,扫描键盘编码值
{
 P1=0xF0;    //  P1  4X4  键盘

 delay(1);
 temp=P1;
 switch(temp)
 {
 case 0xe0: key1=0;
 break;
 case 0xd0: key1=1;
 break;
 case 0xb0: key1=2;
 break;
 case 0x70: key1=3;
 break;
 }
 P1=0x0f;
 delay(1);
 temp=P1;
 switch(temp)
 {
 case 0x0E: key=key1+0;
 break;
 case 0x0D: key=key1+4;
 break;
 case 0x0B: key=key1+8;
 break;
 case 0x07: key=key1+12;
 break;
 default : key=-1;
 }
 if((key1+1)&&(key+1)) disbuf=key;
}
void ejjc()  //判断是否按键
{
P1=0xF0;
if(P1!=0xF0)scan();
}
void main()
{
while(1)
{
ejjc();
P3=LED7Code[disbuf];     //  P3   显示   89c2051  仿真
delay(200);
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-02-17
程序没有问题,看看你的硬件电路吧,应该是电路问题本回答被提问者采纳
第2个回答  2013-02-17
。。。你这是汇编啊。。我只看的懂c语言de
相似回答