本人初学单片机,想写个万年历,但不知星期的算法,网上的算法看不明白,思前想后自己开发了一个算法。如要植入单片机还可以优化,请自己优化!我下面只是给大家一个思路好理解。
从2000/1/1------2099/12/31测试通过。
#include <reg52.h>
unsigned char week(unsigned int,unsigned char,unsigned char);
unsigned char week(unsigned int year,unsigned char month,unsigned char day)
{
unsigned char m,d,temp,week;
unsigned int y;
m=1,d=1,week=6;y=2000; //初始化2000/01/01是星期六
while(y!=year) //處理年(2000開始++)
{
week++; //是上一年的星期的下一天 公式:365%7=1
if(week>6) //如是星期六
week=0; //回到0(星期日)
if(y%4==0) //判斷是否是閏年,閏年2月是29天 公式:366%7=2
//如真是是要計算萬年用if(((y%4==0)&&(y%100!=0))||(y%400==0))) 這是減少編譯代碼長度
{
week++; //星期多加一天
if(week>6) //如是星期六
week=0; //回到0(星期日)
}
y++; //下一年的1月1日
}
while(m!=month) //處理月(1月開始++)
{
switch(m)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: temp=31%7;break; //大月天數
case 2:{ //閏月天數
if(y%4==0) //判斷是否是閏年,閏年2月是29天 公式:366%7=2
//如真是是要計算萬年用if(((y%4==0)&&(y%100!=0))||(y%400==0))) 這是減少編譯代碼長度
temp=29%7;
else temp=28%7;
break;
}
case 4:
case 6:
case 9:
case 11:temp=30%7;break; //小月天數
}
while(temp) //處理月
{
week++;
if(week>6) //如是星期六
week=0; //回到0(星期日)
temp--;
}
m++; //處理月
}
while(d!=day) //處理日(從1日開始++)
{
week++;
if(week>6) //如是星期六
week=0; //回到0(星期日)
d++;
}
return week; //返回星期
}
void main()
{
unsigned char temp;
temp=week(2099,12,31);
while(1);
}