/**********************************************************
程序设计:51单片机八位共阴数码管动态扫描显示时间
要求:
**********************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED0=P1^0;
sbit LED1=P1^1;
sbit LATCHDUAN=P2^0;
sbit LATCHWEI=P2^1;
void Delay(uint t);
uint overflow_count=0;
uchar code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char h1=0,h2=0,m1=0,m2=0,s1=0,s2=0;
//主程序
void main()
{
LED0=0;
LED1=0;
TMOD=0x01;
TH0=0xD8;
TL0=0xF0;
//启动定时器,开中断
TR0=1;
ET0=1;
EA=1;
while(1)
{
//hour
P0=duan[h1];
LATCHDUAN=1;
LATCHDUAN=0;
P0=wei[0];
LATCHWEI=1;
LATCHWEI=0;
Delay(200);
P0=duan[h2];
LATCHDUAN=1;
LATCHDUAN=0;
P0=wei[1];
LATCHWEI=1;
LATCHWEI=0;
Delay(200);
//-
P0=0x40;
LATCHDUAN=1;
LATCHDUAN=0;
P0=wei[2];
LATCHWEI=1;
LATCHWEI=0;
Delay(200);
//minute
P0=duan[m1];
LATCHDUAN=1;
LATCHDUAN=0;
P0=wei[3];
LATCHWEI=1;
LATCHWEI=0;
Delay(200);
P0=duan[m2];
LATCHDUAN=1;
LATCHDUAN=0;
P0=wei[4];
LATCHWEI=1;
LATCHWEI=0;
Delay(200);
//-
P0=0x40;
LATCHDUAN=1;
LATCHDUAN=0;
P0=wei[5];
LATCHWEI=1;
LATCHWEI=0;
Delay(200);
//second
P0=duan[s1];
LATCHDUAN=1;
LATCHDUAN=0;
P0=wei[6];
LATCHWEI=1;
LATCHWEI=0;
Delay(200);
LATCHWEI=1;
P0=wei[7];
LATCHWEI=0;
LATCHDUAN=1;
P0=duan[s2];
Delay(200);
LATCHDUAN=0;
//一秒
if(overflow_count==100)
{
if(s2<9){s2=s2+1;}
else s2=0;
LED0=!LED0;
overflow_count=0;
}
}
}
//延时函数
void Delay(unsigned int t)
{
while(--t);
}
//定时器0中断服务子程序
void timer0_ISR(void) interrupt 1 using 1
{
//定时器初始重载
TH0=0xD8;
TL0=0xF0;
overflow_count++;
}
1.为什么第八位一直都是0,而不是像电子时钟一样?
2.但是我去掉任意一位后第八位工作就可以像时钟一样,这是为什么?
另外,图太小,看不清楚,那个芯片是74HC573吗?