请教原子老师 《RTC例程》 秒转换成日历好像有疑惑 希望大家帮忙解惑

2019-07-21 08:28发布

老师您好。在学习您的例程是遇到困惑,特来论坛向大家请教,先在此向坛子里的各位兄弟表示感谢。 一下是例程中的把秒转换为日月年的函数,其中红 {MOD}部分不理解,在是闰年,且天数为365的时候为什么年数还要加1,且天数没有减少。   //得到当前的时间
//返回值:0,成功;其他:错误代码.
u8 RTC_Get(void) {
static u16 daycnt=0;
u32 timecount=0;
u32 temp=0;
u16 temp1=0;

timecount=RTC->CNTH;//得到计数器中的值(秒钟数)
timecount<<=16;
timecount+=RTC->CNTL;

temp=timecount/86400; //得到天数(秒钟数对应的)
if(daycnt!=temp)//超过一天了
{
daycnt=temp;
temp1=1970; //从1970年开始
while(temp>=365)
{
if(Is_Leap_Year(temp1))//是闰年
{
if(temp>=366)temp-=366;//闰年的秒钟数
else {temp1++;break;}
}
else temp-=365; //平年
temp1++;
}
timer.w_year=temp1;//得到年份
temp1=0;
while(temp>=28)//超过了一个月
{
if(Is_Leap_Year(timer.w_year)&&temp1==1)//当年是不是闰年/2月份
{
if(temp>=29)temp-=29;//闰年的秒钟数
else break;
}
else
{
if(temp>=mon_table[temp1])temp-=mon_table[temp1];//平年
else break;
}
temp1++;
}
timer.w_month=temp1+1;//得到月份
timer.w_date=temp+1; //得到日期
}
temp=timecount%86400; //得到秒钟数
timer.hour=temp/3600; //小时
timer.min=(temp%3600)/60; //分钟
timer.sec=(temp%3600)%60; //秒钟
timer.week=RTC_Get_Week(timer.w_year,timer.w_month,timer.w_date);//获取星期
return 0;
}   这里 if(temp>=366)temp-=366;//闰年的秒钟数
else {temp1++;break;} 恰好是闰年而其是365天,那么年会多加1,然后继续后面的计算月份的操作。这样不是多加了一年吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
12条回答
jacksee
2019-07-22 17:59
楼主看的真仔细,请教一下星期是怎么算的
u8 RTC_Get_Week(u16 year,u8 month,u8 day)
{
u16 temp2;
u8 yearH,yearL;

yearH=year/100; yearL=year%100; 
// 如果为21世纪,年份数加100  
if (yearH>19)yearL+=100;
// 所过闰年数只算1900年之后的  
temp2=yearL+yearL/4;
temp2=temp2%7; 
temp2=temp2+day+table_week[month-1];
if (yearL%4==0&&month<3)temp2--;
return(temp2%7);
}

一周热门 更多>