📄 clock.c
字号:
#include "at89x52.h"
#include "ES51_II.h"
#include "es51_ii_lib.h"
unsigned char Hour; //
unsigned char Mint; //
unsigned char Sec; //
// 设置标志位
bit bSetFlag;
// 秒进位标志位
bit bCarryFlag;
// 设置指示灯,进入设置时,LED2亮,
#define SETSHOW LED1
// T2初始化程序, 50ms定时
void Init_T2(void)
{
RCAP2H = 0x3c;
RCAP2L = 0xb0;
TH2 = RCAP2H; //工作方式1,timer2
TL2 = RCAP2L;
T2MOD = 0x00;
ET2 = 1;
TR2 = 1;
}
// 数码管显示缓冲区刷新函数
void SMG_ReDisplay(void)
{
SMG_BUFF[0] = SMG_TABLE[Hour/10];
SMG_BUFF[1] = SMG_TABLE_DP[Hour%10];
SMG_BUFF[2] = SMG_TABLE[Mint/10];
SMG_BUFF[3] = SMG_TABLE[Mint%10];
}
// 60秒定时到,分钟加1,并刷新数码管显示
void ChangeTime(void)
{
static bit bSecFlag = TRUE;
bit bAlarmFlag = FALSE;
bCarryFlag = FALSE;
bSecFlag = !bSecFlag; // 用于小数点闪烁
if( ++Sec == 60 ) // 进位,分钟
{
Sec = 0;
if( ++Mint == 60 ) // 进位,小时
{
Mint = 0;
bAlarmFlag = TRUE; // 小时进位,需要整点报时
if( ++Hour == 24 ) // 进位,24小时
Hour = 0;
}
}
if( bSecFlag == TRUE ) // 以下代码实现第二位数码管小时点的闪烁
SMG_ReDisplay(); // 显示小数点
else
{ // 不显示小数点
SMG_BUFF[0] = SMG_TABLE[Hour/10];
SMG_BUFF[1] = SMG_TABLE[Hour%10];
SMG_BUFF[2] = SMG_TABLE[Mint/10];
SMG_BUFF[3] = SMG_TABLE[Mint%10];
}
if( bAlarmFlag == TRUE ) // 判断是否需要整点报时
{
bAlarmFlag = FALSE;
Buzzer(1,0); // 蜂鸣器发一声长声
}
}
// 设置电子钟时间函数
void SetClock(void)
{
SETSHOW = 0; // 设置指示灯亮
ET2 = 0;
TR2 = 0;
KeyVal = 0x0f; // 丢弃键值,
while( bSetFlag == TRUE ) // 等待按设置键以完成设置
{
switch( KeyVal ) // 根据键值的不同进行不同的操作
{
case KEY1VAL: // 设置:小时减1
if( --Hour == 255 )
Hour = 23;
SMG_ReDisplay();
KeyVal = 0x0f;
break;
case KEY2VAL: // 设置小时加1
if( ++Hour == 24 )
Hour = 0;
SMG_BUFF[0] = SMG_TABLE[Hour/10];
SMG_BUFF[1] = SMG_TABLE_DP[Hour%10];
//nowtime = Hour*1.0+Mint*0.01;// 计算当前时间
//SMGprintf("%f",nowtime);// 刷新数码管显示
KeyVal = 0x0f;
break;
case KEY3VAL: // 设置分钟减1
if( --Mint == 255)
{
Mint = 59;
if( --Hour == 255)
Hour = 23;
}
SMG_ReDisplay();
KeyVal = 0x0f;
break;
case KEY4VAL: // 设置分钟加1
if( ++Mint == 60)
{
Mint = 0;
if( ++Hour == 24)
Hour = 0;
}
SMG_ReDisplay();
KeyVal = 0x0f;
break;
default: // 不操作
break;
}
}
SETSHOW = 1; // 设置指示灯灭,设置完成
Sec = 0;
ET2 = 1;
TR2 = 1;
}
// INT0键中断程序
void INT0_KEY(void) interrupt IE0_VECTOR using 0
{
unsigned char i=250;
while(i--);
bSetFlag = !bSetFlag;
}
// T2定时溢出中断
// 每次定时50ms,对溢出次数进行计数学,每溢出20次为1秒
void INT_T2(void) interrupt TF2_VECTOR using 0
{
static unsigned char Count_50ms = 0;
TF2 = 0;
if( ++ Count_50ms >= 20 ) // 50ms计数加1;
{
Count_50ms = 0;
bCarryFlag = TRUE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -