📄 time.c
字号:
//***********************************************************************
//FILE: time.c
//功能: 定义与时间相关的所有变量和相关处理函数
//***********************************************************************
#include"main.h"
#include"spi.h"
#include"key.h"
//***********************************************************************
uchar HalfSec; //秒信号量
uchar Year; //年低位
uchar Month; //月
uchar Day; //日
uchar Hour; //小时
uchar Minute; //分钟
uchar Second; //秒
uchar AlarmHour; //闹钟小时
uchar AlarmMinute; //闹钟分钟
uchar Alarm; //闹钟LED闪烁变量
bit Ampm; //AM/PM
bit AlarmAmpm; //闹钟AM/PM
bit BeepAlarm; //闹钟标志
bit RTCflag;
//***********************************************************************
uchar code DayTab[]= //月份天数表
{ //2月除外
31,28,31,30,31,30,
31,31,30,31,30,31
};
//***********************************************************************
bit AddSecond() //秒加1函数
{
if(Second<59) //秒<59
{
Second++; //秒加1
return(0); //返回进位标志为0
}
else //秒>=59
{
Second=0; //秒清零
return(1); //返回进位标志为1
}
}
//***********************************************************************
bit ModifyMinute(bit b) //分调整函数
{ //(b=1加1,否则减1)下同
if(b==1) //加1操作
{
if(Minute<59) //分<59
{
Minute++; //分加1
return(0); //返回进位标志为0
}
else //分>=59
{
Minute=0; //分清零
return(1); //返回进位标志为1
}
}
else //减1操作
{
if(Minute>0) //分>0
Minute--; //分减1
else //分等于0
Minute=59; //分=59
return(0); //返回无进位标志
}
}
//***********************************************************************
bit ModifyHour(bit b) //小时调整函数
{
if(b==1) //加1操作
{
if(Hour<12) //小时<12
{
Hour++; //小时加1
return(0); //返回进位标志0
}
else //小时>=12
{
Hour=1; //小时=1
Ampm=!Ampm; //取反AM/PM
return(!Ampm); //如果AM为0则返回进位标志1
}
}
else //减1操作
{
if(Hour>1) //如果小时>1
Hour--; //则小时减1
else //否则
{
Hour=12; //小时=12
Ampm=!Ampm; //取反AMPM标志
}
return(0); //返回无进位标志
}
}
//***********************************************************************
void ModifyAlarmMinute(bit b) //闹钟分调整函数
{
if(b==1) //加1操作
{
if(AlarmMinute<59) //小于59则加1
AlarmMinute++;
else //否则清零
AlarmMinute=0;
}
else //减1操作
{
if(AlarmMinute>0) //大于0则减1
AlarmMinute--;
else //否则设置为59
AlarmMinute=59;
}
}
//***********************************************************************
void ModifyAlarmHour(bit b) //闹钟小时调整函数
{
if(b==1) //加法操作
{
if(AlarmHour<12) //<12则加1
AlarmHour++;
else //否则闹钟小时置为1
{
AlarmHour=1;
AlarmAmpm=!AlarmAmpm; //取反闹钟AM/PM
}
}
else //减1操作
{
if(AlarmHour>1) //如果闹钟小时>1
AlarmHour--; //则减1
else
{
AlarmHour=12; //否则则置为12
AlarmAmpm=!AlarmAmpm; //取反闹钟AMPM标志
}
}
}
//***********************************************************************
bit ModifyDay(bit b) //天调整函数
{
uchar month2;
if(b==1) //天加1操作
{
if(Day<DayTab[Month]&&Month!=2)
{
Day++; //如果天<当月最大天数,并且不是2月
return(0); //则天加1,并且返回进位标志0
}
else if(Month==2) //如果当前是2月
{ //取得今年2月的最大天数
month2=((Year&0x03)==0)?29:28;
if(Day<month2) //如果小于最大天数
{
Day++; //则加1
return(0); //无进位
}
else //否则
{
Day=1; //天置为1
return(1); //有进位标志
}
}
else //大于或等于本月最大天数
{
Day=1; //置天数为1
return(1); //有进位
}
}
else //天减1操作
{
if(Day>1) //如果天大于1
Day--; //则天减1
else if(Month==2) //否则,如果当前是2月
Day=((Year&0x03)==0)?29:28;//取今年的2月的最大天数
else
Day=DayTab[Month]; //为其它月,取其对应的最大天数
return(0); //无进位标志
}
}
//***********************************************************************
bit ModifyMonth(bit b) //月调整函数
{
if(b==1) //月加1操作
{
if(Month<12) //<12则月加1
{
Month++;
return(0); //返回进位标志0
}
else
{
Month=1; //否则,月置为1
return(1); //返回进位标志1
}
}
else //月减1操作
{
if(Month>1) //月>1,则减1
Month--;
else //否则月置为12
Month=12;
return(0); //返回无进位标志
}
}
//***********************************************************************
void ModifyYear(bit b) //年调整函数
{
if(b==1) //年加1操作
{
if(Year<99) //年<99则加1
Year++;
else //否则置为0
Year=0;
}
else //年减1操作
{
if(Year>0) //年>0则减1
Year--;
else //否则将年置为99
Year=99;
}
}
//***********************************************************************
void TimeAdjuest() //时间调整函数
{
if(AddSecond()) //秒加1,如产生进位标志1,则使分钟加1
if(ModifyMinute(1)) //分加1,如产生进位标志1,则使小时加1
if(ModifyHour(1)) //小时加1,如产生进位标志1,则使天加1
if(ModifyDay(1)) //天加1,如产生进位标志1,则使月加1
if(ModifyMonth(1)) //月加1,如产生进位标志1,则使年加1
ModifyYear(1);
}
//***********************************************************************
void TimeBeep() //时间报警函数
{
if(AlarmHour==Hour&&AlarmMinute==Minute&&AlarmAmpm==Ampm)
{ //判断是否与闹钟设置值完全符合
BEEP=0; //符合则使BEEP报警
BeepAlarm=1; //同时设置闹钟报警标志
Alarm=~Alarm;
SendDatTo595(Alarm); //使8个LED进行闪烁
}
else
{
SendDatTo595(0xff<<Mode);//将无闹钟报警,则LED指模式
BeepAlarm=0; //否则清除闹钟报警标志
if(Minute==0&&Second==0)//判断是否是整点
BEEP=0; //是,则进行整点提示
else BEEP=1; //不满足任何报警情况,关闭蜂鸣器。
}
}
//***********************************************************************
void RTCINT() interrupt 10 //RTC中断,中断频率为1Hz
{
RTCCON=0x43; //清楚RTC中断标志
RTCflag=1; //置RTC中断标志
HalfSec++; //半秒信号量加1
}
//*********************************END***********************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -