#include "App_RTC.h"
#include "g_includes.h"
void RTI_Init(void)
{
RealTimeClock.RollingCounter = 0;
RealTimeClock.BackupCounter = 0;
RealTimeClock.Year = RTC_DEFAULT_YEAR;
RealTimeClock.BackupYear = RTC_DEFAULT_YEAR;
RealTimeClock.Month = RTC_DEFAULT_MONTH;
RealTimeClock.Date = RTC_DEFAULT_DATE;
RealTimeClock.Hour = RTC_DEFAULT_HOUR;
RealTimeClock.Minute = RTC_DEFAULT_MINUTE;
RealTimeClock.Second = RTC_DEFAULT_SECOND;
RealTimeClock.LeapYear = Determine_Leap_Year(RealTimeClock.Year);
}
void RTI_Timing_Service(void)
{
uint16_t Counter = 0;
uint16_t SecInc = 0;
if (RealTimeClock.Year != RealTimeClock.BackupYear) //��������
{
RealTimeClock.LeapYear = Determine_Leap_Year(RealTimeClock.Year);
RealTimeClock.BackupYear = RealTimeClock.Year;
}
Counter = RealTimeClock.RollingCounter;
if(Counter == 0)
{
RealTimeClock.BackupCounter = 0;
}
if (Counter - RealTimeClock.BackupCounter >= 10)
{
SecInc = (Counter - RealTimeClock.BackupCounter) / 10;
RealTimeClock.BackupCounter += SecInc * 10;
RealTimeClock.Second += (uint8_t)(SecInc % 60);
RealTimeClock.Minute += (uint8_t)(SecInc / 60);
if (RealTimeClock.Second >= 60)
{
RealTimeClock.Minute += RealTimeClock.Second / 60;
RealTimeClock.Second = RealTimeClock.Second % 60;
}
if (RealTimeClock.Minute >= 60)
{
RealTimeClock.Hour += RealTimeClock.Minute / 60;
RealTimeClock.Minute = RealTimeClock.Minute % 60;
}
if (RealTimeClock.Hour >= 24)
{
RealTimeClock.Date += RealTimeClock.Hour / 24;
RealTimeClock.Hour = RealTimeClock.Hour % 24;
}
switch (RealTimeClock.Month)
{
case 1 :
case 3 :
case 5 :
case 7 :
case 8 :
case 10 :
case 12 : if (RealTimeClock.Date > 31)
{
RealTimeClock.Date = 1;
RealTimeClock.Month++;
}
break;
case 4 :
case 6 :
case 9 :
case 11 : if (RealTimeClock.Date > 30)
{
RealTimeClock.Date = 1;
RealTimeClock.Month++;
}
break;
case 2 : if (RealTimeClock.LeapYear)
{
if (RealTimeClock.Date > 29)
{
RealTimeClock.Date = 1;
RealTimeClock.Month++;
}
}
else
{
if (RealTimeClock.Date > 28)
{
RealTimeClock.Date = 1;
RealTimeClock.Month++;
}
}
break;
}
if (RealTimeClock.Month > 12)
{
RealTimeClock.Month = 1;
RealTimeClock.Year++;
RealTimeClock.LeapYear = Determine_Leap_Year(RealTimeClock.Year);
RealTimeClock.BackupYear = RealTimeClock.Year;
}
}
}
INT8U Determine_Leap_Year(INT16U Year)
{
if (Year % 4 == 0)
{
if (Year % 100 != 0)
return 1;
else if (Year % 400 == 0)
return 1;
}
return 0;
}