关于数码管显示的问题?求高手解答!已经失眠!
时间:10-02
整理:3721RD
点击:
我的目的是:想让一个八位数码管显示不断变化的多位数的时候自动进位退位。而且前面没数的话不能显示0。
例如:显示1234;不能显示成00001234。数字变成234了就自动显示234,而不能显示00000234或者00002340。
我的想法是:
声明一个8位数组来放数字的每一位,对应8位数码管的每一段。
用138译码器控制位选,顺便发送段选。
定义一个变量控制位选。
代码如下:
#define IO_DIS P0
sbit LocationA=P1^3;
sbit LocationB=P1^4;
sbit LocationC=P1^5;
unsigned char code DisCode[16]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char DisData[8];
unsigned char SectionValue;
void DisLED(unsigned long Value)
{
if(Value>=0){DisData[7]=DisCode[Value%10/1];SectionValue=1;}
if(Value>=10){DisData[6]=DisCode[Value%100/10];SectionValue=2;}
if(Value>=100){DisData[5]=DisCode[Value%1000/100];SectionValue=3;}
if(Value>=1000){DisData[4]=DisCode[Value%10000/1000];SectionValue=4;}
if(Value>=10000){DisData[3]=DisCode[Value%100000/10000];SectionValue=5;}
if(Value>=100000){DisData[2]=DisCode[Value%1000000/100000];SectionValue=6;}
if(Value>=1000000){DisData[1]=DisCode[Value%10000000/1000000];SectionValue=7;}
if(Value>=10000000){DisData[0]=DisCode[Value%100000000/10000000];SectionValue=8;}
}
void DisIC138(unsigned char Value)
{
unsigned char i;
for(i=0;i<Value;i++)
{
switch(i)
{
case 0:LocationA=0;LocationB=0;LocationC=0; break;
case 1:LocationA=1;LocationB=0;LocationC=0; break;
case 2:LocationA=0;LocationB=1;LocationC=0; break;
case 3:LocationA=1;LocationB=1;LocationC=0; break;
case 4:LocationA=0;LocationB=0;LocationC=1; break;
case 5:LocationA=1;LocationB=0;LocationC=1; break;
case 6:LocationA=0;LocationB=1;LocationC=1; break;
case 7:LocationA=1;LocationB=1;LocationC=1; break;
}
IO_DIS=DisData[i];
DelayMs(1);
IO_DIS=0x00;
}
}
脑壳痛的是:显示8位数正常,显示7位数后面就少1位,显示6位数就少两位。
如:DisLED(6666666);
DisIC138(SectionValue);
我以为会显示【×6666666】这个不带爱像的学习板就只显示【×666666×】。
我想要的是:
1.哪位能帮我看看,我的代码错到哪里了?在源代码上指点下,我想知道我思路对吗?
2.有更好更简单的代码能告诉我吗?
3.请尽量用简单粗暴的语言帮我解决以上两个问题,说复杂了我理解不了。
例如:显示1234;不能显示成00001234。数字变成234了就自动显示234,而不能显示00000234或者00002340。
我的想法是:
声明一个8位数组来放数字的每一位,对应8位数码管的每一段。
用138译码器控制位选,顺便发送段选。
定义一个变量控制位选。
代码如下:
#define IO_DIS P0
sbit LocationA=P1^3;
sbit LocationB=P1^4;
sbit LocationC=P1^5;
unsigned char code DisCode[16]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char DisData[8];
unsigned char SectionValue;
void DisLED(unsigned long Value)
{
if(Value>=0){DisData[7]=DisCode[Value%10/1];SectionValue=1;}
if(Value>=10){DisData[6]=DisCode[Value%100/10];SectionValue=2;}
if(Value>=100){DisData[5]=DisCode[Value%1000/100];SectionValue=3;}
if(Value>=1000){DisData[4]=DisCode[Value%10000/1000];SectionValue=4;}
if(Value>=10000){DisData[3]=DisCode[Value%100000/10000];SectionValue=5;}
if(Value>=100000){DisData[2]=DisCode[Value%1000000/100000];SectionValue=6;}
if(Value>=1000000){DisData[1]=DisCode[Value%10000000/1000000];SectionValue=7;}
if(Value>=10000000){DisData[0]=DisCode[Value%100000000/10000000];SectionValue=8;}
}
void DisIC138(unsigned char Value)
{
unsigned char i;
for(i=0;i<Value;i++)
{
switch(i)
{
case 0:LocationA=0;LocationB=0;LocationC=0; break;
case 1:LocationA=1;LocationB=0;LocationC=0; break;
case 2:LocationA=0;LocationB=1;LocationC=0; break;
case 3:LocationA=1;LocationB=1;LocationC=0; break;
case 4:LocationA=0;LocationB=0;LocationC=1; break;
case 5:LocationA=1;LocationB=0;LocationC=1; break;
case 6:LocationA=0;LocationB=1;LocationC=1; break;
case 7:LocationA=1;LocationB=1;LocationC=1; break;
}
IO_DIS=DisData[i];
DelayMs(1);
IO_DIS=0x00;
}
}
脑壳痛的是:显示8位数正常,显示7位数后面就少1位,显示6位数就少两位。
如:DisLED(6666666);
DisIC138(SectionValue);
我以为会显示【×6666666】这个不带爱像的学习板就只显示【×666666×】。
我想要的是:
1.哪位能帮我看看,我的代码错到哪里了?在源代码上指点下,我想知道我思路对吗?
2.有更好更简单的代码能告诉我吗?
3.请尽量用简单粗暴的语言帮我解决以上两个问题,说复杂了我理解不了。
你的value变量分解是从 个位开始往高位走,而且数组最高位存储的是value的最低位的数值。
但是你在显示的时候是从最低位开始显示的。是不是顺序的问题?
建议你用每位数值不同的数测试,比如123456,看看是不是分解和显示数据的顺序问题。
已经解决了,你说的差不多,138扣位扣后面了,DisLED扣前面了。
加一个空白的数0x00或者0xff看你电路共阳还是共阴