[P][CODE] #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);
}
[/CODE]
来自:网络 作者:不明
如知情者或作者可以通知我们修改正确这些信息[/P] |