📄 rtc.c
字号:
/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ Copyright (c) $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$ 肖遥电子(广州)研发中心
$ Shawyoo Electronics (GuangZhou) R&D Center
$ http://www.shawyoo.com Email: autoele@qq.com
$ QQ群:9069471/9069433/9524253 All rights reserved.
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ Copyright (c) $$$$$$$$$$$$$$$$$$$$$$$$$$$ */
/*
文件描述
文件名: RTC.c
功能描述:把日期时间变成秒,把秒变成日期时间格式
编译环境:通用C编译器
目标CPU:
作者:
创建时间:
建议编辑环境:UltraEdit 11.00a+ 制表符宽度为三个字符,程序可读性更好。
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
*/
#define DEF_RTC 1
#define RTC_GLOBALS 1
#include "RTC.h"
#include <stdio.h>
/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
平年中,每个月的天数.月是从1开始
*/
signed char code DayOfMonth[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
从START_YEAR开始,总计TOTAL_YEAR,每年的润年标志,润年为1,否则为0
这个表是从2000年开始,共100年。不同年份要作相应修改。
*/
unsigned char code LeapYearFlag[100] =
{
1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0,
1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0,
1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0,
1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0,
1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0,
};
/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
平年中,当月及前面月份的总天数
*/
signed short code DayOfYear[13] = { 0,31,59,90,120,151,181,212,243,273,304,334,365 };
/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
函数名称:DateTimeToSecond
功能描述:把日期和时间转换为秒(2000年1月1日0时0分0秒时刻为0秒)
入口参数:RTC结构指针
出口参数:秒
全局变量: 无
创建时间:2006-5-6 17:40
修改时间:
*/
uint32 DateTimeToSecond(RTC_STR *pRTC)
{
uchar i;
int16 LeapYear,wYear;
uint32 Day,Sec,ySec;
//////////////////////////////////////////
wYear = pRTC->wYear;
wYear -= START_YEAR;
/////////////////////////////////// 计算出已过去的整年总共秒数
for(i=0,ySec=0;i<wYear;i++)
{
ySec += ONE_YEAR_SECOND;
if(LeapYearFlag[i])
ySec += ONE_DAY_SECOND;
}
/////////////////////////////////// 计算出当年已过去的整天数
LeapYear = LeapYearFlag[wYear];
Day = DayOfYear[pRTC->Month-1];
Day += pRTC->Day;
Day -= 1;
if((LeapYear!=0)&&(pRTC->Month>2))
Day += 1;
/////////////////////////////////// 计算出当天已过去的总秒数
Sec = (pRTC->Hour)*3600L + (pRTC->Min)*60L + pRTC->Sec;
Sec += ySec;
Sec += (Day*ONE_DAY_SECOND);
///////////////////////////////////
return Sec;
} // End of function <DateTimeToSecond>
/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
函数名称:SecondToDateTime
功能描述:把秒(2000年1月1日0时0分0秒时刻为0秒)转换为年月日时分秒
入口参数:秒,RTC结构指针
出口参数:成功标志,成功为OK,不成功为ERROR
全局变量: 无
创建时间:2006-5-6 17:40
修改时间:
*/
uchar SecondToDateTime(uint32 Second, RTC_STR *pRTC)
{
uchar i,Month,Day;
int16 LeapYear,wYear;
uint32 Sec;
/////////////////////////////////// 计算出已过去的整年数
for(i=0,wYear=0;i<TOTAL_YEAR;i++)
{
Sec = ONE_YEAR_SECOND;
if(LeapYearFlag[i])
Sec += ONE_DAY_SECOND;
if(Second<Sec) break;
wYear++;
Second -= Sec;
}
pRTC->Year = wYear;
pRTC->wYear = wYear+START_YEAR;
/////////////////////////////////// 计算出当年已过去的整月数
LeapYear = LeapYearFlag[wYear];
for(i=0,Month=1;i<12;i++)
{
Sec = DayOfMonth[i];
Sec *= ONE_DAY_SECOND;
if((LeapYear!=0)&&(Month==2))
Sec += ONE_DAY_SECOND;
if(Second<Sec) break;
Month++;
Second -= Sec;
}
pRTC->Month = Month;
/////////////////////////////////// 计算出当月已过去的整天数
pRTC->Day = Second/ONE_DAY_SECOND;
pRTC->Day += 1;
/////////////////////////////////// 计算出当天已过去的整小时数
Second %= ONE_DAY_SECOND;
pRTC->Hour = Second/3600L;
/////////////////////////////////// 计算出分钟、秒
Second %= 3600L;
pRTC->Min = Second/60;
pRTC->Sec = Second%60;
/////////////////////////////////// 星期
wYear = pRTC->wYear;
Month = pRTC->Month;
Day = pRTC->Day;
if((Month==1)||(Month==2))
{
Month += 12;
wYear--;
}
pRTC->Week = ((Day+2*Month+3*(Month+1)/5+wYear+wYear/4-wYear/100+wYear/400)+1)%7;
return 0;
}
// End of function <SecondToDateTime>
/*
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ End of File $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -