4*4矩阵键盘写了个程序,仿真后发现按下矩阵按键不显示,后来查资料改了一个地方成功了,却又不知道原来没改的那个程序为什么不行。。
原来的程序如下
#include<reg52.h>
#define p P3
sbit DU=P2^6;
sbit WEI=P2^7;
unsigned char a,b[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
void main()
{ int key;
void display(unsigned char num);
void delay(int ms);
unsigned char temp;
P0=0X00;
WEI=1;
WEI=0;
while(1)
{ p=0xfe;
temp=p|0x0f;
if(temp!=0xff)
{ delay(5);
temp=p|0x0f;
if(temp!=0xff)
{
switch(temp)
{
case 0xef: display(0);break;
case 0xdf: display(1);break;
case 0xbf: display(2);break;
case 0x7f: display(3);break;
}}
}
p=0xfd;
temp=p|0x0f;
if(temp!=0xff)
{ delay(5);
temp=p|0x0f;
if(temp!=0xff)
{
switch(temp)
{
case 0xef: display(4);break;
case 0xdf: display(5);break;
case 0xbf: display(6);break;
case 0x7f: display(7);break;
}}
}
p=0xfb;
temp=p|0x0f;
if(temp!=0xff)
{ delay(5);
temp=p|0x0f;
if(temp!=0xff)
{
switch(temp)
{
case 0xef: display(4);break;
case 0xdf: display(5);break;
case 0xbf: display(6);break;
case 0x7f: display(7);break;
}}
}
p=0xf7;
temp=p|0x0f;
if(temp!=0xff)
{ delay(5);
temp=p|0x0f;
if(temp!=0xff)
{
switch(temp)
{
case 0xef: display(12);break;
case 0xdf: display(13);break;
case 0xbf: display(14);break;
case 0x7f: display(15);break;
}}
}
} }
void display(unsigned char num)
{
P0=b[num];
DU=1;
DU=0;
}
void delay(int ms)
{
int i,k;
for(i=112;i>0;i--)
for(k=ms;k>0;k--);
}
这个仿真不行,我把每一个switch前加了个temp,把switch里面的十六进制都改成相应的数;
改过后如下
#include<reg52.h>
#define p P3
sbit DU=P2^6;
sbit WEI=P2^7;
unsigned char a,b[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
void main()
{ int key;
void display(unsigned char num);
void delay(int ms);
unsigned char temp;
P0=0X00;
WEI=1;
WEI=0;
while(1)
{ p=0xfe;
temp=p|0x0f;
if(temp!=0xff)
{ delay(5);
temp=p|0x0f;
if(temp!=0xff)
{ temp=p;
switch(temp)
{
case 0xee: display(0);break;
case 0xde: display(1);break;
case 0xbe: display(2);break;
case 0x7e: display(3);break;
}}
}
p=0xfd;
temp=p|0x0f;
if(temp!=0xff)
{ delay(5);
temp=p|0x0f;
if(temp!=0xff)
{ temp=p;
switch(temp)
{
case 0xed: display(4);break;
case 0xdd: display(5);break;
case 0xbd: display(6);break;
case 0x7d: display(7);break;
}}
}
p=0xfb;
temp=p|0x0f;
if(temp!=0xff)
{ delay(5);
temp=p|0x0f;
if(temp!=0xff)
{ temp=p;
switch(temp)
{
case 0xeb: display(4);break;
case 0xdb: display(5);break;
case 0xbb: display(6);break;
case 0x7b: display(7);break;
}}
}
p=0xf7;
temp=p|0x0f;
if(temp!=0xff)
{ delay(5);
temp=p|0x0f;
if(temp!=0xff)
{ temp=p;
switch(temp)
{
case 0xe7: display(12);break;
case 0xd7: display(13);break;
case 0xb7: display(14);break;
case 0x77: display(15);break;
}}
}
} }
void display(unsigned char num)
{
P0=b[num];
DU=1;
DU=0;
}
void delay(int ms)
{
int i,k;
for(i=112;i>0;i--)
for(k=ms;k>0;k--);
}
然后仿真通过了。。。。不知道原来的为什么不行。。temp为什么一定=p,直接用temp=p|0x0x去switch不行吗???求指教
|