发现了正点RTC程序的一个错误,你们看看我找的对不对

2019-10-15 20:48发布


u8 RTC_Get(void)
{
    static u16 daycnt=0;
    u32 timecount=0;
    u32 temp=0;
    u16 temp1=0;          
    timecount=RTC_GetCounter();         
    temp=timecount/86400;
    if(daycnt!=temp)
    {          
        daycnt=temp;
        temp1=1970;
        while(temp>=365)
        {                                 
            if(Is_Leap_Year(temp1))
            {
               if(temp>=366)temp-=366;
               else {/*temp1++;*/break;}    //就是这里不应该有temp1++  
            }
            else temp-=365;          //ƽÄê
            temp1++;  
        }   
        calendar.w_year=temp1;//μÃμ½Äê·Y
        temp1=0;
        while(temp>=28)//3¬1yáËò»¸öÔÂ
        {
             if(Is_Leap_Year(calendar.w_year)&&temp1==1)
             {
                  if(temp>=29)temp-=29;
                  else break;
             }
             else
             {
                 if(temp>=mon_table[temp1])temp-=mon_table[temp1];
                 else break;
             }
             temp1++;  
        }
        calendar.w_month=temp1+1;
        calendar.w_date=temp+1;
    }
    temp=timecount%86400;
    calendar.hour=temp/3600;
    calendar.min=(temp%3600)/60;
    calendar.sec=(temp%3600)%60;
    calendar.week=RTC_Get_WeekDay(calendar.w_year,calendar.w_month,calendar.w_date);
    return 0;
}         


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
德道
1楼-- · 2019-10-15 21:33
是不是在设置闰年的12月31日会变成下一年的13月1日呢?例如设置2020年12月31日,会变成2021年13月1日。我找了一下午才找到原因,把while(temp>=365)改成while(temp>365)就可以了。或者按你的改也行。我想原子哥原先应该是想写成while(temp>=365)
        {                                 
            if(Is_Leap_Year(temp1))
            {
               if(temp>=366)temp-=366;
               else {temp1++;break;}    //就是这里不应该有temp1++  
            }
            else           {  
            temp-=365;          //ƽÄê
            temp1++;  
           }
        }

正点原子
2楼-- · 2019-10-16 02:16
确实是bug,不过你这代码还是好多年前的了,最新的代码早就更新了。。。
terry
3楼-- · 2019-10-16 06:28
 精彩回答 2  元偷偷看……
慕名兰
4楼-- · 2019-10-16 06:44
楼主还在吗???这里有点不懂:
while(temp>=28)//3¬1yáËò»¸öÔÂ
        {
             if(Is_Leap_Year(calendar.w_year)&&temp1==1)
             {
                  if(temp>=29)temp-=29;
                  else break;
             }
shichuang
5楼-- · 2019-10-16 08:52
慕名兰 发表于 2016-10-18 12:19
楼主还在吗???这里有点不懂:
while(temp>=28)//3¬1yáËò»¸öÔÂ
...

这个while(){}的作用是计算当前年份中完整月份的个数(即temp1的大小);while后面括号里的temp一定符合这个条件1<=temp<=364;而在while中还要考虑闰年平年的因素,所以出现if括号中的限制条件,其中temp1==1这个条件主要是限制闰年中非二月的月份进入if体中。写的不是太好,希望你再仔细理解一下。
慕名兰
6楼-- · 2019-10-16 11:13
shichuang 发表于 2016-11-2 17:18
这个while(){}的作用是计算当前年份中完整月份的个数(即temp1的大小);while后面括号里的temp一定符 ...

谢谢

一周热门 更多>