void clock() //可调时钟
{
unsigned char num;
init_timer0();
while(1)
{
num = keyscan();
switch(num)
{
case 1: hour++;if(hour == 24)hour = 0;
break;
case 2: hour--;if(hour == 255)hour = 23;
break;
case 3:minute++;if(minute == 60)minute = 0;
break;
case 4:minute--;if(minute == 255) minute = 59;
break;
default:break;
}
if(updatetimerflag == 1)
{
updatetimerflag = 0;
P2 =dispbit[0];
P0 =LED[hour/10];
delayus(200);
P2 =dispbit[1];
P0 =LED[hour%10];
delayus(200);
P2 =dispbit[2];
P0 =0X40;
delayus(200);
P2 =dispbit[3];
P0 =LED[minute/10];
delayus(200);
P2 =dispbit[4];
P0 =LED[minute%10];
delayus(200);
P2 =dispbit[5];
P0 =0x40;
delayus(500);
P2 =dispbit[6];
P0 =LED[second/10];
delayus(500);
P2 =dispbit[7];
P0 =LED[second%10];
delayus(500);
}
}
}
void init_timer0() //定时器初始化程序
{
TMOD |= 0X01;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void timer0_isr(void) interrupt 1 //定时器中断程序
{
unsigned int num,i;
TH0 = 0XF8; //重新赋值2ms
TL0 = 0X30;
i++;
if(i==10) //20ms更新一次
{
i = 0;
updatetimerflag = 1;
}
num++;
if(num==500)
{
num = 0;
second++;
if(second==60)
{
second = 0 ;
minute++;
if(minute==60)
{
minute = 60;
hour++;
if(hour==24)
{
hour = 0;
}
}
}
}
}
unsigned char keyscan(void) //按键扫描函数,返回扫描键值
{
unsigned char keyvalue;
if(KEYPORT !=0xff)
{
delayms(10);
if(KEYPORT!=0XFF)
{
keyvalue=KEYPORT;
while(KEYPORT!=0XFF);
switch(keyvalue)
{
case 0xfe:return 1;break;
case 0xfd:return 2;break;
case 0xfb:return 3;break;
case 0xf7:return 4;break;
case 0xef:return 5;break;
case 0xdf:return 6;break;
case 0xbf:return 7;break;
case 0x7f:return 8;break;
default:return 0;break;
}
}
}
return 0;
}
{
unsigned char num;
init_timer0();
while(1)
{
num = keyscan();
switch(num)
{
case 1: hour++;if(hour == 24)hour = 0;
break;
case 2: hour--;if(hour == 255)hour = 23;
break;
case 3:minute++;if(minute == 60)minute = 0;
break;
case 4:minute--;if(minute == 255) minute = 59;
break;
default:break;
}
if(updatetimerflag == 1)
{
updatetimerflag = 0;
P2 =dispbit[0];
P0 =LED[hour/10];
delayus(200);
P2 =dispbit[1];
P0 =LED[hour%10];
delayus(200);
P2 =dispbit[2];
P0 =0X40;
delayus(200);
P2 =dispbit[3];
P0 =LED[minute/10];
delayus(200);
P2 =dispbit[4];
P0 =LED[minute%10];
delayus(200);
P2 =dispbit[5];
P0 =0x40;
delayus(500);
P2 =dispbit[6];
P0 =LED[second/10];
delayus(500);
P2 =dispbit[7];
P0 =LED[second%10];
delayus(500);
}
}
}
void init_timer0() //定时器初始化程序
{
TMOD |= 0X01;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void timer0_isr(void) interrupt 1 //定时器中断程序
{
unsigned int num,i;
TH0 = 0XF8; //重新赋值2ms
TL0 = 0X30;
i++;
if(i==10) //20ms更新一次
{
i = 0;
updatetimerflag = 1;
}
num++;
if(num==500)
{
num = 0;
second++;
if(second==60)
{
second = 0 ;
minute++;
if(minute==60)
{
minute = 60;
hour++;
if(hour==24)
{
hour = 0;
}
}
}
}
}
unsigned char keyscan(void) //按键扫描函数,返回扫描键值
{
unsigned char keyvalue;
if(KEYPORT !=0xff)
{
delayms(10);
if(KEYPORT!=0XFF)
{
keyvalue=KEYPORT;
while(KEYPORT!=0XFF);
switch(keyvalue)
{
case 0xfe:return 1;break;
case 0xfd:return 2;break;
case 0xfb:return 3;break;
case 0xf7:return 4;break;
case 0xef:return 5;break;
case 0xdf:return 6;break;
case 0xbf:return 7;break;
case 0x7f:return 8;break;
default:return 0;break;
}
}
}
return 0;
}
这篇博客介绍了一个自制的可调数字时钟程序,包括时钟的初始化、按键扫描、定时器中断处理等功能。程序通过按键操作调整小时和分钟,并用LED显示当前时间。定时器每20毫秒更新一次时间,并在中断服务程序中实现时间递增。

8467

被折叠的 条评论
为什么被折叠?



