最近看到了很多关于RTC的应用贴,我也跟风发一个 8H/32G系列单片机RTC专用的日期换算星期极简代码:
- unsigned char code weekdata[12]={0,3,3,6,1,4,6,2,5,0,3,5};
- #define WEEK ((6+weekdata[MONTH-1]+YEAR+DAY-(((YEAR % 4) || (MONTH > 2))?0:1) + YEAR/4)%7)
复制代码
代码非常非常简单,只有两行,只定义了一个偏移码表和计算星期的宏定义,这个码表支持2000~2099年之间的星期计算,也可以通过修改码表支持其它年份范围的计算,欢迎各路大佬验证代码和讨论原理,也欢迎交流更精简的版本。
调用方法非常简单,直接把WEEK当成寄存器使用即可:
- printf("%02bu-%02bu-%02bu %02bu:%02bu:%02bu-%03bu %bu\r\n",YEAR,MONTH,DAY,HOUR,MIN,SEC,SSEC,WEEK);
复制代码
带入一个日期,验算过程如下:
比如2024年11月30日
((6+weekdata[11-1]+24+30+24/4)%7) = (6+3+24+30+6)% 7 = 69 % 7 = 6 = 星期六
结果正确!!
|