#include
<stdio.h>
code unsigned char WeekTab[] =
{//闰年月星期表 (3 << 5) +
31,//1月 (6 << 5) +
29,//2月 (0 << 5) +
31,//3月 (3 << 5) +
30,//4月 (5 << 5) +
31,//5月 (1 << 5) +
30,//6月 (3 << 5) +
31,//7月 (6 << 5) +
31,//8月 (1 << 5) +
30,//9月 (4 << 5) +
31,//10月 (0 << 5) +
30,//11月 (2 << 5) + 31
//12月 };
/*------------------------------------------------------------------------------ ---------- 2000年~2099年星期算法 -------------------------------------------------------------------------------- ---------*/ unsigned
char WeekDay20(unsigned char y, unsigned char m, unsigned char
d) { unsigned char week, day; day =
WeekTab[m - 1];//月表 week = day >>
5;//月星期数 day &=
0x1f;//月天数 if ((m < 3) && (y &
0x03)){//平年 if (m == 2)
day--;//平年月天数 week++;//平年月表+1 } y
= y + (y >> 2);//年+年/4 week = (week
+ y + d + 2) %
7;//(星期=年+年/4+月表+2日)%7 return (week << 5)
|
day;//返回星期和月天数 }
/*------------------------------------------------------------------------------ ---------- 0000年~9999年星期算法 -------------------------------------------------------------------------------- ---------*/ unsigned
char WeekDay(unsigned char c, unsigned char y, unsigned char
m, unsigned char d) { unsigned char week,
day; c &= 0x03;//百年%4 c = c
| (c << 2);//百年%4*5 day = WeekTab[m -
1];//月表 week = day >>
5;//月星期数 day &=
0x1f;//月天数 if ((m < 3) && !((c == 0)
| (y & ((y & 0x03) ==
0)))){//平年 if (m == 2)
day--;//平年月天数 week++;//平年月表+1 } y
= y + (y >> 2);//年+年/4 week = (week + c +
y + d + 2) %
7;//(星期=百年%4*5+年+年/4+月表+日+2)%7 return (week
<< 5) | day;//返回星期和月天数 }
unsigned char
BcdToBin(unsigned char val) { val = (val
>> 4) * 10 + (val &
0x0f);//将BCD码转换为10进制数 return
val;//返回10进制数 }
void main(void) { unsigned
char c, y, m, d; unsigned char cx, yx, mx,
dx; unsigned char WDay, Week,
Day; /*--------------------------------------------------------- 0001年1月1日
星期天 ---------------------------------------------------------*/ c =
0x00; y =
0x01; m =
0x01; d =
0x01; cx =
BcdToBin(c);//百年 yx =
BcdToBin(y);//年 mx =
BcdToBin(m);//月 dx =
BcdToBin(d);//日 WDay = WeekDay(cx, yx, mx,
dx);//取星期和月天数 Week = WDay >>
5;//得到星期 Day = WDay &
0x1f;//得到最大月天数 /*--------------------------------------------------------- 1918年1月21日
星期一 ---------------------------------------------------------*/ c =
0x19; y =
0x18; m =
0x01; d =
0x21; cx =
BcdToBin(c);//百年 yx =
BcdToBin(y);//年 mx =
BcdToBin(m);//月 dx =
BcdToBin(d);//日 WDay = WeekDay(cx, yx, mx,
dx);//取星期和月天数 Week = WDay >>
5;//得到星期 Day = WDay &
0x1f;//得到最大月天数 /*--------------------------------------------------------- 9999年12月31日
星期天 ---------------------------------------------------------*/ c =
0x00; y =
0x01; m =
0x01; d =
0x01; cx =
BcdToBin(c);//百年 yx =
BcdToBin(y);//年 mx =
BcdToBin(m);//月 dx =
BcdToBin(d);//日 WDay = WeekDay(cx, yx, mx,
dx);//取星期和月天数 Week = WDay >>
5;//得到星期 Day = WDay &
0x1f;//得到最大月天数 /*--------------------------------------------------------- 2004年6月18日
星期五 ---------------------------------------------------------*/ c =
0x20; y =
0x04; m =
0x06; d =
0x18; cx =
BcdToBin(c);//百年 yx =
BcdToBin(y);//年 mx =
BcdToBin(m);//月 dx =
BcdToBin(d);//日 WDay = WeekDay20(yx, mx,
dx);//取星期和月天数 Week = WDay >>
5;//得到星期 Day = WDay &
0x1f;//得到最大月天数 /*--------------------------------------------------------- 2018年3月8日
星期四 ---------------------------------------------------------*/ c =
0x20; y =
0x18; m =
0x03; d =
0x08; cx =
BcdToBin(c);//百年 yx =
BcdToBin(y);//年 mx =
BcdToBin(m);//月 dx =
BcdToBin(d);//日 WDay = WeekDay20(yx, mx,
dx);//取星期和月天数 Week = WDay >>
5;//得到星期 Day = WDay &
0x1f;//得到最大月天数 while(1); }
|