#include <reg51.h>
#include<absacc.h rel='nofollow' onclick='return false;'> /*包含润许直接访问8051不同存储区的宏定义*/
#define COM XBYTE[0x4001] /*8279命令口地址*/
#define DAT XBYTE[0x0000] /*8279数据口地址*/
#define uchar unsigned char
uchar count; /*定义全局变量*/
uchar count_s;
uchar count_m;
uchar count_h;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ;
sbit clflag=ACC^7; /*标志变量0或1 */
void service_counter0()interrupt 1 /*定时器0中断服务程序*/
{ TH0=0x3c; /*重新装载计数初值*/
TL0=0xb0;
count=count+1;
if(count>=20)
{
count_s=count_s+1;
count=0;
}
if(count_s>=60)
{
count_m=count_m+1;
count_s=0;
}
if(count_m>=60)
{
count_h=count_h+1;
count_m=0;
}
if(count_h>=24)
{
count_h=0;
}
}
void count_init() /*初始化程序*/
{
count=0;
count_s=55;
count_m=59;
count_h=23;
TMOD=0x01; /*定时器0方式1 */
TH0=0x3c; /*装载计数初值 */
TL0=0xb0;
IP=0x02; /*中断优先级设置PT0=1 */
ET0=1; /*允许定时器0中断*/
TR0=1; /*启动定时器0运行*/
EA=1; /*全部中断允许*/
}
void disp_init()
{
COM=0xd1; /*清除命令 110 10001 将显示器RAM清零*/
do{ACC=COM;}
while(clflag==1); /*等待清除结束*/
COM=0x00; /*显示方式00000000,8字符左进入;编码扫描键盘,2键锁定*/
COM=0x22; /*时钟分频 001 10100=20分频*/
}
void disp()
{
COM=0x90; /*写显示RAM命令 起始地址 地址自加*/
DAT=table[count_h/10];
DAT=table[count_h%10];
DAT=table[count_m/10];
DAT=table[count_m%10];
DAT=table[count_s/10];
DAT=table[count_s%10];
}
void main()
{
disp_init();
count_init();
while(1)
disp();
}