#define uchar unsigned char /*宏定义 */ #define uint unsigned int /*宏定义 */ /****专用数码管显示表***/
uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; /*0x40显示“一”符号*/ uchar code wema[]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7}; /*小时hour 分min 秒sec*/
uchar hour,hour_h,hour_l; /*定义小时,小时的高位,小时的低位*/ uchar min,min_h,min_l; /*分*/ uchar sec,sec_h,sec_l; /*秒*/
uchar int_num; /*定时溢出作用标号*/
sbit key_secadd=P0^0; /*定义了 p0.0为秒增1键,用在调时中断里*/ sbit key_minadd=P0^1; /*定义了 p0.1为分增1键,用在调时中断里*/ sbit key_houradd=P0^2; /*定义了 p0.2为时增1键,用在调时中断里*/ void delay(uchar time); /*延时子函数声明*/ void display(); /*显示子函数声明*/ void inter_init(); /*定时器初始化子函数声明*/ void time24();
void main() {
inter_init(); /*定时器初始化*/
hour= 23; /*自定义一个初值,方便快速观察翻转状态(可修改)*/ min= 59; sec= 50; while(1) {
time24();
/*分开时间,分别显示字符*/
sec_h=sec/10; /*求出秒高位需要显示的字符*/ sec_l=sec%10; /*求出秒低位需要显示的字符*/ min_h=min/10; min_l=min%10; hour_h=hour/10; hour_l=hour%10;
display(); /*调用显示函数来显示*/ } }
void time0(void) interrupt 1 /*定时器T0服务子程序*/ {
TH0=(65535-50000)/256; TL0=(65535-50000)%256; int_num++;
}
void intsvr0(void) interrupt 0 /*外部中断INT0服务函数*/ {
// EA=0; /*关掉总中断*/ hour=0; min=0; sec=0; while(1) {
if(key_secadd==0) {
delay(80); if(key_secadd==0) {
sec++;
while(!key_secadd); if(sec==60) {
sec=0; } } }
if(key_minadd==0) {
delay(80); if(key_minadd==0) {
min++;
while(!key_minadd); if(min==60) {
min=0; } } }
if(key_houradd==0) {
delay(80);
if(key_houradd==0)
{ hour++;
while(!key_houradd); if(hour==24) {
hour=0; } } }
sec_h=sec/10; /*求出秒高位需要显示的字符*/ sec_l=sec%10; /*求出秒低位需要显示的字符*/ min_h=min/10; min_l=min%10; hour_h=hour/10; hour_l=hour%10;
display(); /*调用显示函数来显示*/ } }
void delay(uchar time) /*延时子函数*/ {
uchar time_1; for (;time>0;time--)
for (time_1=100;time_1>0;time_1--); }
void display() /*数码管显示子函数*/ {
P2=duma[sec_h]; /*显示秒高位*/ P1=wema[6]; delay(10);
P2=duma[sec_l]; /*显示秒低位*/ P1=wema[7]; delay(10);
P2=duma[10]; /* “一”符号的显示 */ P1=wema[5]; delay(10);
P2=duma[min_h]; /*分*/ P1=wema[3]; delay(10); P2=duma[min_l]; P1=wema[4]; delay(10);
P2=duma[10]; /* “一”符号的显示 */ P1=wema[2]; delay(10);
P2=duma[hour_h]; /*时*/
P1=wema[0]; delay(10); P2=duma[hour_l]; P1=wema[1]; delay(10); }
void inter_init() /*定时器初始化子函数*/ {
EA=1; /*开总中断*/
EX0=1; /*开外部中断0*/ ET0=1; /*打开定时器T0*/ TMOD=0x01; /*工作方式1*/ TCON = 0x00; /*触发方式*/
IP = 0x01; /*中断优先级别,T0优先*/
TH0=(65535-50000)/256; /*置初值,大约50ms一个中断 */ TL0=(65535-50000)%256;
TR0=1; /*置位TR0,启动定时器0*/ }
void time24() /*时间递增*/ {
if(int_num==20) /*值满20,大约就是一秒的时间。*/
{ /* 其值设为2,则定时时间快10倍,可做毫秒计时*/ int_num=0;
sec++; /*秒值加1*/
if(sec==60) /*如果秒值满60,就归0*/ { sec=0;
min++; /*分值加1*/ if(min==60) {
min=0;
hour++; /*分值归0,时值加1*/ if(hour==24) {
hour=0; /*时值满24归0*/ } }
} } }