注册 登录
编程论坛 单片机编程

51 单片机的 LED 数码管发光问题,

小代帅帅 发布于 2014-10-09 21:13, 4488 次点击
过往牛人,有一问题请教,不知哪位牛人厉害!,我编了一个51单片机的LED数码管发光的小程序,下边是部分代码,问题就是为什么数字最后一位总是特别的亮,有时候输出一位数字的时候,最后一位也有这个数字的影子。这是为什么呢?还有就是在位选那里延时一下,段选那里却不用呢?我试了一下,如果延时较短的话就会出现闪烁现象!为啥呢?
void delay(uchar i)
{
//uint j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}

void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f)
{
   dula=0;
   P0=table[a];
   dula=1;
   dula=0;
   
   wela=0;
   P0=0xfe;
   wela=1;
   wela=0;
   delay(5);
   
   P0=table[b];
   dula=1;
   dula=0;
   
   P0=0xfd;
   wela=1;
   wela=0;
   delay(5);

   P0=table[c];
   dula=1;
   dula=0;
   
   P0=0xfb;
   wela=1;
   wela=0;
   delay(5);
   
   P0=table[d];
   dula=1;
   dula=0;
   
   P0=0xf7;
   wela=1;
   wela=0;
   delay(5);
   
   P0=table[e];
   dula=1;
   dula=0;
   
   P0=0xef;
   wela=1;
   wela=0;
   delay(5);
   
   P0=table[f];
   dula=1;
   dula=0;
   
   P0=0xdf;
   wela=1;
   wela=0;
   delay(5);
}

void main()
{
num=2;//这个是被显示的整数,只要不超过六位,均可显示出来。
while(1)
{
if(num<10)
{
a0=num;b0=16;c0=16;d0=16;e0=16;f0=16;
}
else
{
if(num<100)
{a0=num/10;b0=num%10;c0=16;d0=16;e0=16;f0=16;}
else
{
if(num<1000)
{a0=num/100;b0=num%100/10;c0=num%10;d0=16;e0=16;f0=16;}
else
{
if(num<10000)
{a0=num/1000;b0=num%1000/100;c0=num%100/10;d0=num%10;e0=16;f0=16;}
else
{
if(num<100000)
{a0=num/10000;b0=num%10000/1000;c0=num%1000/100;d0=num%100/10;e0=num%10;f0=16;}
else
{
if(num<1000000)
{a0=num/100000;b0=num%100000/10000;c0=num%10000/1000;d0=num%1000/100;e0=num%100/10;f0=num%10;}
}
}
}
}
}
display(a0,b0,c0,d0,e0,f0);
}
}
3 回复
#2
彭森荣2014-10-22 16:52
你没有消影,所以你看到的都是有模糊的显示,而且这样的话容易让你的数码管出现编码混乱。你可以在每个dula=0的后面加上P0=0xff就可以了···
#3
小奎、2014-10-27 17:22
楼上亮了
#4
流氓兔1号2017-11-04 20:28
这么长的代码,吓我一跳...新手飘过
1