//***********************************
// LED数码显示电子时钟
//***********************************
//***********************************
//程序编制思路:
//采用定时中断式数码管动态扫描.
//因为走时部分要求比较精确,故采用定时器自动装载式,用定时器2作为秒发生器,因为定时器2可以设置为16位为自动装载,
#include
#include
#define uchar unsigned char
sure_time (void);
bit dis;
uchar code LED_DATA[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0~9数字数据
uchar data DATA_TEMP[8]; //显示缓存区,开机时显示00-00-00
uchar data digit; //移位变量(用于动态扫描)
static uchar data t,k,i;
static uchar data sec=0,min=55,hour=22;
main ()
{
TMOD=0X01; //定时器0
ET0=1; //开定时器0中断
EA=1; //开总中断
TH0=0XFC; //定时器0 定时1ms
TL0=0X18;
TR0=1; //启动定时器
RCAP2H=0X3C; //定时器2 定时50ms
RCAP2L=0XB0;
ET2=1;
TR2=1;
digit=0xfe;
P3=0XFF; //关闭显示
sure_time ();
DATA_TEMP[2]=0XBF;
DATA_TEMP[5]=0XBF;
while (1)
{
}
}
void displayscanf (void) interrupt 1 //动态显示扫描函数
{
TH0=0XFC;
TL0=0X18;
P0=DATA_TEMP[i];
i++;
P3=digit;
digit=_crol_(digit,1);
if (i>7)
{
i=0;
digit=0xfe;
}
}
void timer_server (void) interrupt 5 //时钟走时定时
{
TF2=0;
t++;
if (t==20)
{
t=0;
sec++;
if (sec>59)
{
sec=0;
min++;
if (min>59)
{
min=0;
hour++;
if (hour>23) hour=0;
DATA_TEMP[1]=LED_DATA[hour%10];
DATA_TEMP[0]=LED_DATA[hour/10];
}
DATA_TEMP[4]=LED_DATA[min%10];
DATA_TEMP[3]=LED_DATA[min/10];
}
DATA_TEMP[7]=LED_DATA[sec%10];
DATA_TEMP[6]=LED_DATA[sec/10];
}
}
sure_time (void) //对时间初始化赋值,并更新DATA_TEMP数组里的数据
{
DATA_TEMP[1]=LED_DATA[hour%10];
DATA_TEMP[0]=LED_DATA[hour/10];
DATA_TEMP[4]=LED_DATA[min%10];
DATA_TEMP[3]=LED_DATA[min/10];
DATA_TEMP[7]=LED_DATA[sec%10];
DATA_TEMP[6]=LED_DATA[sec/10];
}
上一篇:数码管滚动显示数字...(C程序)
下一篇:基于AT90S8515的频率测量系统的设计
推荐阅读最新更新时间:2024-03-16 15:16