|
為啥實現不了從鍵盤逐個輸入到數碼管中,我在PROTUES手動控制鎖存是可以實現的,代碼不知道哪里出了問題。目標是想輸入一個數字鎖存然后輸入下一個再鎖存。這樣
單片機源程序如下:
#include <reg51.h>
unsigned char table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x6F, //0-9字形碼,也叫段碼
0x77,0x7C,0x39,0x5E,0x79,0x71};
sbit Q=P3^0; //BCD1
sbit W=P3^1; //BCD2
sbit E=P3^2; //BCD3
sbit R=P3^3; //BCD4
unsigned char count=0;
void delay(unsigned int i)
{ unsigned char j,k;
for(j=i;j>0;j--)
for(k=255;k>0;k--);
}
void keyscanf() {
unsigned char temp;
P2=0xfe;
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{ temp=P2;
switch (temp){
case 0xee:P1=table[1];count++;break;
case 0xde:P1=table[2];count++;break;
case 0xbe:P1=table[3];count++;break;
case 0x7e:P1=table[4];count++;break; }
}
P2=0xfD;
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{ temp=P2;
switch (temp){
case 0xed:P1=table[5];count++;break;
case 0xdd:P1=table[6];count++;break;
case 0xbd:P1=table[7];count++;break;
case 0x7d:P1=table[8];count++;break; }
}
P2=0xfB;
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{ temp=P2;
switch (temp){
case 0xeB:P1=table[9];count++;break;
case 0xdB:P1=table[10];count++;break;
case 0xbB:P1=table[11];count++;break;
case 0x7B:P1=table[12];count++;break; }
}
P2=0xf7;
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{ temp=P2;
switch (temp){
case 0xe7:P1=table[13];count++;break;
case 0xd7:P1=table[14];count++;break;
case 0xb7:P1=table[15];count++;break;
case 0x77:P1=table[0];count++;break; }
}
}
void main() {
Q=W=E=R=0;
while(1){
if(count==0)
{ Q=1;W=E=R=0;
keyscanf();
}
if(count==1)
{
W=1;Q=E=R=0;
keyscanf();
}
if(count==2)
{
E=1;Q=W=R=0;
keyscanf();
}
if(count==3)
{
R=1;Q=W=E=0;
keyscanf();
}
if(count==4)
{ count=0;}
}
}
|
|