八个数码管 显示 时分秒 还剩两个数码管 用作时分 分秒的分隔,我用PN4122三极管控制位选,电路图见附件
可是程序输入 用proteus仿真以后 确是一闪一闪的 ,而且数字也不是递加的
#include <reg51.h> //头文件
unsigned char pore[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选数组
unsigned char Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段选数组
unsigned char n,m;
unsigned char htime; //定义时变量
unsigned char mtime; //定义分变量
unsigned char stime; //定义秒变量
void yshi(void) //延时函数(动态显示)
{
unsigned char i;
for(i=0;i<200;i++);
}
void ds(unsigned char s)//秒位控制计算
{
P2=0xbf;
P0=Tab[s/10];
yshi();
P2=0x7f;
P0=Tab[s%10];
yshi();
P2=0xff;
}
void dm(unsigned char m)//分位控制计算
{
P2=0xf7;
P0=Tab[m/10];
yshi();
P2=0xef;
P0=Tab[m%10];
yshi();
P2=0xdf;
P0=0xbf;
yshi();
P2=0xff;
}
void dh(unsigned char h)//时位控制计算
{
P2=0xfe;
P0=Tab[h/10];
yshi();
P2=0xed;
P0=Tab[h%10];
yshi();
P2=0xfb;
P0=0xbf;
yshi();
P2=0xff;
}
void main(void)
{
TMOD=0x01; //定时器工作方式选择
EA=1; //开总中断
ET0=1; //开T0中断
TH0=(65536-46083)/256; //赋初值
TL0=(65536-46083)%256;
TR0=1; //开始计时
htime=0;
mtime=0;
stime=0;
while(1)
{
ds(stime);
yshi();
dm(mtime);
yshi();
dh(htime);
yshi();
}
}
void Time(void) interrupt 1 using 1
{
n++;
if(n==20)
{
n=0;
stime++;
}
if(stime==60)
{
stime=0;
mtime++;
}
if(mtime==60)
{
mtime=0;
htime++;
}
if(htime==24)
{
htime=0;
}
TH0=(65536-46083)/256; //赋初值
TL0=(65536-46083)%256;
} |