星期几功能在Atmega8中无法正常工作

时间:2014-08-10 09:33:08

标签: c gcc avr-gcc atmega

如果给出完整的日期,我有一个C函数可以找到星期几。当我使用gcc在笔记本电脑上编译它时,此功能非常有效。

但是当我使用avr-gcc编译Atmega8的函数时,它给出了错误的答案。任何人都可以帮我找出原因吗?

这是C函数

unsigned char *getDay(int year, int month, int day) {
static unsigned char *weekdayname[] = {"MON", "TUE",
    "WED", "THU", "FRI", "SAT", "SUN"};
size_t JND =                                                     \
      day                                                      \
    + ((153 * (month + 12 * ((14 - month) / 12) - 3) + 2) / 5) \
    + (365 * (year + 4800 - ((14 - month) / 12)))              \
    + ((year + 4800 - ((14 - month) / 12)) / 4)                \
    - ((year + 4800 - ((14 - month) / 12)) / 100)              \
    + ((year + 4800 - ((14 - month) / 12)) / 400)              \
    - 32045;
return weekdayname[JND % 7];
}

例如,当我在笔记本电脑上的函数中输入日期01/01/2015时,该函数会给我正确的星期几(星期四),但在atmega8上它会给我星期一。

更新: 函数sujithvm给了作品! :D

但我仍然不知道为什么原始函数不能在avr上运行。我试过了uint32_t和int32_t。然而,看起来这一天总是关闭3.向JND添加三个给出正确的一天。这有点奇怪。

1 个答案:

答案 0 :(得分:0)

尝试使用此代码

unsigned char *getDay(int y, int m, int d) {
    static unsigned char *weekdayname[] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};

    int weekday  = (d += m < 3 ? y-- : y - 2 , 23 * m / 9 + d + 4 + y / 4 - y / 100 + y / 400) % 7;
    return weekdayname[weekday];
}