计时器 为什么会闪烁?
实现 一个简单的计时器,程序如下。
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();
}
[解决办法]
可以理解成一个动态扫描数码管的程序,每个定时扫描一个数码管
1、保证扫描每位扫描数码管的时间最大限度一致,find_zero()的返回值做成在最后统一返回;refresh()也是一样;这样就能做到要么都是不闪,要么都闪;
2、会闪烁是因为两次扫描同一个数码管的时间间隔太长的原因,调整定时器时间即可,太短也不好,具体自己调试体会
3、写代码要专业一点,该写返回值要写清楚,该写参数要写明白,该缩进要缩进,看书像一坨屎一样,实在令人难以忍受
4、会问题是很好的,更要学会调试,调好了记得发篇心得上来给大家参考参考···