51单片机呼吸灯与数码管结合问题:预想结果是呼吸灯完成一次闪烁,数码管正好加1,但事实上是数码管三位只有个位一直显示,百位和十位不显示且在呼吸灯闪烁一半时闪一下,请问应该怎么改啊?
代码:
#include <reg52.h>
#define uchar unsigned char
/*通过数码管显示计时时长,
PWM 控制 LED,该 LED 亮度变化周期为 1s。
sbit LED1=P1^0;
sbit DU = P2^6;
sbit WE = P2^7;
uchar msec,sec;
uchar code table[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
void delay(xms)
{
unsigned char i;
for (i=xms;i>0;i--);
}
void display(uchar i)
{
uchar bai,shi,ge;
bai = i/100;
shi = i%100/10;
ge = i%10l;
P0=0xff;
WE=1;
P0=0xfe;
WE=0;
DU=1;
P0=table[bai];
DU=0;
delay(10);
P0=0xff;
WE=1;
P0=0xfd;
WE=0;
DU=1;
P0=table[shi];
DU=0;
delay(10);
P0=0xff;
WE=1;
P0=0xfb;
WE=0;
DU=1;
P0=table[ge];
DU=0;
delay(10);
}
void time0init()
{
EA=1;
ET0=1;
TR0=1;
TMOD=0x01;
TH0=0x4b;
TL0=0xfd;
}
void main()
{
unsigned char x,y;
time0init();
while(1)
{
display(sec);
for (x=0;x<50;x++)
{
for (y=15;y>0;y--)
{
LED1=0;
delay(x);
LED1=1;
delay(50-x);
}
}
for (x=50;x>0;x--)
{
for (y=15;y>0;y--)
{
LED1=0;
delay(x);
LED1=1;
delay(50-x);
}
}
}
}
void timer0 ()interrupt 1
{
msec++;
if (msec == 20)
{
msec=0;
sec++;
}
}
```: