/*用573锁存器控制和单片机脚直接位选控制数码管
用中断T0作为秒计数器实现实时时钟功能,由于未学键盘,调时日后再加*/
#include <reg52.h>
#include <intrins.h>
#define unint unsigned int
#define unchar unsigned char
void delay(unint i); //函数声名
char num;
//此表为 LED 的字模, 共阴数码管 0-9 -
unsigned char code Disp_Tab[] = {0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xe6,0x02};
unsigned char code dispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位码 查表的方法控制
/************主函数**********************/
main()
{
unint i;
long int LedNumVal=0 ;
unint LedOut[10];
num=0;
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(num>=20) //控制数字变化速度
{
num=0;
++LedNumVal;
if(LedNumVal==86400)
LedNumVal=0;
}
LedOut[7]=Disp_Tab[LedNumVal/3600%100/10];//时的十位
LedOut[6]=Disp_Tab[LedNumVal/3600%10];//时的个位
LedOut[5]=Disp_Tab[10];//分隔杆
LedOut[4]=Disp_Tab[LedNumVal%3600/60%100/10];//分的十位
LedOut[3]=Disp_Tab[LedNumVal%3600/60%10];//分的个位
LedOut[2]=Disp_Tab[10];//分隔杆
LedOut[1]=Disp_Tab[LedNumVal%60%100/10];//秒的十位
LedOut[0]=Disp_Tab[LedNumVal%60%10];//秒的个位
for( i=0; i<8; i++)
{
P0 = LedOut[i];
P2 = dispbit[i]; //使用查表法进行位选
delay(1); //扫描间隔时间 太长会数码管会有闪烁感
}
}
}
void delay(unint z)//延时
{
unint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void time0() interrupt 1//中断服务
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
num++;
}
|