用定时器扫描数码管,只有那个秒的个位是亮的,求原因

2019-07-15 18:47发布

我用定时器扫描数码管,编写一个时钟的程序时,数码管上只有那个秒的个位是亮的,而其它都是很暗,这是什么原因???求大神。。。。下面是代码:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar duan[8];
uchar h,m,s;
/*void delay(uint t)
{
while(t--);
} */
void T_0()
{
TMOD|=0x01;
//TH0=0x00;
//TL0=0x00;
EA=1;
ET0=1;
TR0=1;
}
main()
{
void display(uchar f,uchar n);
T_0();
while(1)
{
duan[0]=table[h/10];
duan[1]=table[h%10];
duan[2]=0x40;
duan[3]=table[m/10];
duan[4]=table[m%10];
duan[5]=0x40;
duan[6]=table[s/10];
duan[7]=table[s%10];
}
}
void display(uchar f,uchar n)
{
uchar i;
for(i=0;i<n;i++)
{
P0=0x00;
P1=wei[i+f];
P0=duan;
}
}
void Te_0() interrupt 1
{
static uint t;
TH0=(65536-2000)/256; //2ms
TL0=(65536-2000)%256;
display(0,8);
t++;
if(t==500)
{               
t=0;
s++;
if(s==60)
{
s=0;
m++;
if(m==60)
{
m=0;
h++;
if(h==24)
h=0;
}
}
}
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
阿信509
1楼-- · 2019-07-15 23:41
你的display中每次扫描8个数码管,中间的时间间隔太短,导致显示变暗,
每段间应用一些时间间隔,
每次显示完秒后就退出了,导致显示秒的时间变长,所以秒的个位就是最亮的。
蒙奇路飞
2楼-- · 2019-07-16 04:49
阿信509 发表于 2014-8-16 16:18
你的display中每次扫描8个数码管,中间的时间间隔太短,导致显示变暗,
每段间应用一些时间间隔,
每次显示 ...

但是如果这样:
void display(uchar f,uchar n)
{
uchar i,j=20;
for(i=0;i<n;i++)
{
P0=0x00;
P1=wei[i+f];
P0=duan;
while(j--);
}

那么那个秒就变得很慢了,与真正的一秒相差很远。。。
小猴子卡勒
3楼-- · 2019-07-16 05:18
蒙奇路飞 发表于 2014-8-16 16:54
但是如果这样:
void display(uchar f,uchar n)
{

那个duan什么意思?没有下标?
蒙奇路飞
4楼-- · 2019-07-16 09:30
小猴子卡勒 发表于 2014-8-18 11:01
那个duan什么意思?没有下标?

duan是发送段码,也就是要显示的数值。display中第一个参数是从第几个数码管开始显示,第二个参数是显示的数值是几位。
蒙奇路飞
5楼-- · 2019-07-16 09:57
 精彩回答 2  元偷偷看……
蒙奇路飞
6楼-- · 2019-07-16 13:52
蒙奇路飞 发表于 2014-8-16 16:54
但是如果这样:
void display(uchar f,uchar n)
{

这个显示问题我解决了,但是我想添加一个可调时钟的按键,可是按键没反应?????代码如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar duan[8];
uchar h,m,s;
void delay(uint t)
{
while(t--);
}
void T_0()
{
TMOD|=0x01;
//TH0=0x00;
//TL0=0x00;
EA=1;
ET0=1;
TR0=1;
}
main()
{
void display(uchar f,uchar n);
T_0();
P3=0xff;
while(1)
{
if(P3==0xfe)
{
delay(100);
if(P3==0xfe)
{
while(P3==0xfe);
h++;
if(h==24)
h=0;
}
}
if(P3==0xfd)
{
delay(100);
if(P3==0xfd)
{
while(P3==0xfd);
m++;
if(m==60)
m=0;
}
}
/*if(P3==0xfb)
{
delay(100);
if(P3==0xfb)
while(P3==0xfb);
s++;
if(s==60)
s=0;
} */
duan[0]=table[h/10];
duan[1]=table[h%10];
duan[2]=0x40;
duan[3]=table[m/10];
duan[4]=table[m%10];
duan[5]=0x40;
duan[6]=table[s/10];
duan[7]=table[s%10];
}
}
void display(uchar f,uchar n)
{
uchar i;
for(i=0;i<n;i++)
{
P1=wei[i+f];
P0=duan;
delay(100);
P0=0x00;
}
}
void Te_0() interrupt 1
{
static uint t;
TH0=(65536-1000)/256; //2ms
TL0=(65536-1000)%256;
display(0,8);
t++;
if(t==100)
{               
t=0;
s++;
if(s==60)
{
s=0;
m++;
if(m==60)
{
m=0;
h++;
if(h==24)
h=0;
}
}
}
}

一周热门 更多>