计时器 为什么会闪烁?

skyblackspring 2012-01-09 02:07:57
实现 一个简单的计时器,程序如下。

find_zero函数是想让计时时候数值最高位以上的位不显示。
但是运行时除了最高位,其它的位会闪烁。当去掉find_zero函数及相关语句时,可以正常计数。
请教 低位的闪烁是怎么回事?


#include<stdio.h>
#include<reg52.h>
typedef unsigned char unit8;
typedef unsigned int unit16;
typedef unsigned long unit32;


unit8 code p[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f},
num[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
unit8 a[8];
static unit8 j=0;

void timer1_init()
{
TMOD|=0x10;
TMOD&=0xdf;
TH1=0xFC;
TL1=0x67;
TR1=1;
}

void int_init()
{
EA=1;
ET1=1;

}

find_zero()
{
unit8 x;
for(x=j+1;x<=7;x++)
{
if (a[x]!=0)
return 1;

}
return 0;

}


refresh()
{

if (find_zero())
P1=num[7-j];
else { j++;
return 0;
}
switch(j)
{
case 0:P2=p[a[0]];j++;break;
case 1:P2=p[a[1]];j++;break;
case 2:P2=p[a[2]];j++;break;
case 3:P2=p[a[3]];j++;break;
case 4:P2=p[a[4]];j++;break;
case 5:P2=p[a[5]];j++;break;
case 6:P2=p[a[6]];j++;break;
case 7:P2=p[a[7]];j=0;break;
}

}




main()
{
timer1_init();
int_init();
while(1);
}


void interrupt_timer1() interrupt 3
{
unit16 counter;

static unit32 m=0;
TF1=0;
TH1=0xFC;
TL1=0x67;
counter++;
if (counter==1000)
{
counter=0;
m++;

a[0]=m%10;
a[1]=m/10%10;
a[2]=m/100%10;
a[3]=m/1000%10;
a[4]=m/10000%10;
a[5]=m/100000%10;
a[6]=m/1000000%10;
a[7]=m/10000000%10;

}
if (m==99999999)
m=0;
refresh();

}
...全文
927 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
forch 2012-01-10
  • 打赏
  • 举报
回复
可以理解成一个动态扫描数码管的程序,每个定时扫描一个数码管
1、保证扫描每位扫描数码管的时间最大限度一致,find_zero()的返回值做成在最后统一返回;refresh()也是一样;这样就能做到要么都是不闪,要么都闪;
2、会闪烁是因为两次扫描同一个数码管的时间间隔太长的原因,调整定时器时间即可,太短也不好,具体自己调试体会
3、写代码要专业一点,该写返回值要写清楚,该写参数要写明白,该缩进要缩进,看书像一坨屎一样,实在令人难以忍受
4、会问题是很好的,更要学会调试,调好了记得发篇心得上来给大家参考参考···
Binzo 2012-01-09
  • 打赏
  • 举报
回复
是不是紧跟的find_zero用的有些晚了,导致重新刷屏明显看到了。

你在下面的代码中做判断吧。是0,不显示。
a[0]=m%10;
a[1]=m/10%10;
a[2]=m/100%10;
AnYidan 2012-01-09
  • 打赏
  • 举报
回复
将最高位的on 控制换到别的位看看
skyblackspring 2012-01-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 woshi_ziyu 的回复:]

;j=0所持续的时间比其他位长

看你的代码流程
[/Quote]


楼上您好 。并不是J=0对应的第8位对应的持续时间长。比如计数到1578时,最高位1会很稳定,但其他位,5、7、8就会一直闪。
woshi_ziyu 2012-01-09
  • 打赏
  • 举报
回复
;j=0所持续的时间比其他位长

看你的代码流程
skyblackspring 2012-01-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 woshi_ziyu 的回复:]

延时时间长 缩短一些
[/Quote]


我也知道是延时时间的问题。

但是为什么最高位很稳定,其它低位就在一直闪呢?
能否详细说明?谢谢啦~
woshi_ziyu 2012-01-09
  • 打赏
  • 举报
回复
延时时间长 缩短一些
skyblackspring 2012-01-09
  • 打赏
  • 举报
回复
求高手指教啊。
net_friends 2012-01-09
  • 打赏
  • 举报
回复
不知道

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧