📄 rtc.c
字号:
#include "RTC.h"
#include "MSP430X16X.h"
//实时时钟变量,分别存放时间的小时十位、个位,分钟的十位、个位,秒,冒号
char Time[9]={'2','1',':','2','9',':','5','0','\0'};
//日期
char Date[11]={'2','0','0','8','.','0','5','.','2','0','\0'};
void Init_TimerB()//定时器B初始化
{
TBCTL=TBSSEL_1+TBCLR+MC_0; //选择时钟源为ACLK(32768Hz),定时器清除,停止计数
TBCCTL0 = CCIE; //允许定时器中断
TBCCR0=32767; //定时时间1s
TBCTL |= MC_1; //打开定时器
}
//-----------------Real Time Clock------------
////////////////////定时器B中断子程序
#pragma vector=TIMERB0_VECTOR
__interrupt void RealTimeClock_ISR(void)
{
SECOND_01++;
if(SECOND_01==':')
{
SECOND_01='0';
SECOND_10++;
if(SECOND_10=='6')
{
SECOND_10='0';
if(Minute_Increase()) //分钟增加,根据返回值判断小时是否要增加
if(Hour_Increase()) //小时增加,根据返回值判断日期是否要增加
if(Day_Increase()) //日期增加,根据返回值判断月份是否要增加
if(Month_Increase()) //月份增加,根据返回值判断年份是否要增加
Year_Increase(); //年份增加
}
}
}
/////////////////////分钟增加函数,若增加满一天,返回1,否则返回0
unsigned char Minute_Increase()
{
unsigned char result=0;
MINUTE_01++;
if(MINUTE_01==':')
{
MINUTE_01='0';
MINUTE_10++;
if(MINUTE_10=='6') //小时进位
{
MINUTE_10='0';
result=1;
}
}
return result;
}
/////////////////////分钟减少函数
void Minute_Decrease()
{
MINUTE_01--;
if(MINUTE_01=='/')
{
MINUTE_01='9';
MINUTE_10--;
if(MINUTE_10=='/')
{
MINUTE_10='5';
}
}
}
//////////////小时增加函数,若增加满一天,返回1,否则返回0
unsigned char Hour_Increase()
{
unsigned char result=0;
HOUR_01++;
if(HOUR_01==':' || HOUR_10=='2' && HOUR_01=='4')
{
if(HOUR_10=='2' && HOUR_01=='4')
{
HOUR_01='0';
HOUR_10='0';
result=1;
}
else
{
HOUR_01='0';
HOUR_10++;
}
}
return result;
}
////////////////小时减少函数
void Hour_Decrease()
{
HOUR_01--;
if(HOUR_01=='/')
{
if(HOUR_10=='0')
{
HOUR_01='3';
HOUR_10='2';
}
else
{
HOUR_01='9';
HOUR_10--;
}
}
}
//////////////日期增加函数,若增加满一个月,返回1,否则返回0
unsigned char Day_Increase()
{
unsigned int year,month; //用于记录年和月的十进制值
unsigned char day,leap,result=0; //用于存放日的十进制值,2月的日数和返回值
month=MONTH_10*10+MONTH_01-528; //把字符型的月份转化为十进制
day=DAY_10*10+DAY_01-528; //把字符型的日期转化为十进制
day++;
switch(month)
{
case(1): //大月份
case(3):
case(5):
case(7):
case(8):
case(10):
case(12):
{
if(day>31) //大约增加超过31日,转到1号
{
DAY_01='1';
DAY_10='0';
result=1; //返回1,表示有月份进位
}
else
{
DAY_01=day%10+48; //没有进位,十进制日期转回字符
DAY_10=day/10+48;
}
break;
}
case(2):
{
year=1472+YEAR_10*10+YEAR_01; //把字符型的年份转化为十进制
if(year%400==0 || (year%4==0 && year%100!=0)) //闰年
leap=29;
else
leap=28;
if(day>leap) //月份增加越界,转到1号
{
DAY_01='1';
DAY_10='0';
result=1; //返回1,表示有月份进位
}
else
{
DAY_01=day%10+48; //没有进位,十进制日期转回字符
DAY_10=day/10+48;
}
break;
}
default:
{
if(day>30) //小月,30日
{
DAY_01='1';
DAY_10='0';
result=1;
}
else
{
DAY_01=day%10+48;
DAY_10=day/10+48;
}
}
}
return result;
}
////////////////日期减少函数,主要用于日期设定
void Day_Decrease()
{
unsigned int year,month;
unsigned char day,leap;
month=MONTH_10*10+MONTH_01-528;
day=DAY_10*10+DAY_01-528;
day--;
switch(month)
{
case(1): //大月份
case(3):
case(5):
case(7):
case(8):
case(10):
case(12):
{
if(day==0) //日期减少到0号时自动转为31号
{
DAY_01='1';
DAY_10='3';
}
else
{
DAY_01=day%10+48;
DAY_10=day/10+48;
}
break;
}
case(2):
{
year=1472+YEAR_10*10+YEAR_01;
if(year%400==0 || (year%4==0 && year%100!=0)) //闰年
leap=29;
else
leap=28;
if(day==0 || day>leap)
day=leap;
DAY_01=day%10+48;
DAY_10=day/10+48;
break;
}
default:
{
if(day==0)
{
DAY_01='0';
DAY_10='3';
}
else
{
DAY_01=day%10+48;
DAY_10=day/10+48;
}
}
}
}
//////////////月份增加函数,若增加满一年,返回1,否则返回0
unsigned char Month_Increase()
{
unsigned char result=0;
MONTH_01++;
if(MONTH_01==':' || MONTH_10=='1' && MONTH_01=='3') //个位进位或者增加到13月
{
if(MONTH_10=='1' && MONTH_01=='3') //如果是13月
{
MONTH_01='1'; //转到1月
MONTH_10='0';
result=1; //返回1,年份进位
}
else
{
MONTH_01='1';
MONTH_10++;
}
}
return result;
}
////////////////月份减少函数
void Month_Decrease()
{
MONTH_01--;
if(MONTH_01=='/')
{
if(MONTH_10=='0')
{
MONTH_01='2';
MONTH_10='1';
}
else
{
MONTH_01='9';
MONTH_10--;
}
}
}
////////////////年份增加函数,年份取值为2000-2099
void Year_Increase()
{
YEAR_01++;
if(YEAR_01==':')
{
YEAR_01='0';
YEAR_10++;
if(YEAR_10==':')
YEAR_10='0';
}
}
///////////////年份减少函数
void Year_Decrease()
{
YEAR_01--;
if(YEAR_01=='/')
{
YEAR_01='9';
YEAR_10--;
if(YEAR_10=='/')
YEAR_10='9';
}
}
//-----------------Real Time Clock------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -