久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1645|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

我用單片機做的萬年歷公歷轉(zhuǎn)農(nóng)歷日期不對,今日應(yīng)該是臘月26,但萬年歷顯示2臘月27...

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1011444 發(fā)表于 2024-2-5 19:20 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
是否程序出問題????????
我用的是網(wǎng)上大老提供的程序,原來一直沒問題。現(xiàn)將轉(zhuǎn)換程序列如下,
請大老們審查:
2000年到2100年數(shù)據(jù)表
uc code year_cod[300]={
                0x0C,0x96,0x45,0x4d,0x4A,0xB8,0x0d,0x4A,0x4C, // 2000-2002
                0x0d,0xA5,0x41,0x25,0xAA,0xB6,0x05,0x6A,0x49, // 2003-2005
                0x7A,0xAd,0xBd,0x02,0x5d,0x52,0x09,0x2d,0x47, // 2006-2008
                0x5C,0x95,0xBA,0x0A,0x95,0x4e,0x0B,0x4A,0x43, // 2009-2011
                0x4B,0x55,0x37,0x0A,0xd5,0x4A,0x95,0x5A,0xBf, // 2012-2014
                0x04,0xBA,0x53,0x0A,0x5B,0x48,0x65,0x2B,0xBC, // 2015-2017
                0x05,0x2B,0x50,0x0A,0x93,0x45,0x47,0x4A,0xB9, // 2018-2020
                0x06,0xAA,0x4C,0x0A,0xd5,0x41,0x24,0xdA,0xB6, // 2021-2023
                0x04,0xB6,0x4A,0x69,0x57,0x3d,0x0A,0x4e,0x51, // 2024-2026
                0x0d,0x26,0x46,0x5e,0x93,0x3A,0x0d,0x53,0x4d, // 2027-2029
                0x05,0xAA,0x43,0x36,0xB5,0x37,0x09,0x6d,0x4B, // 2030-2032
                0xB4,0xAe,0xBf,0x04,0xAd,0x53,0x0A,0x4d,0x48, // 2033-2035
                0x6d,0x25,0xBC,0x0d,0x25,0x4f,0x0d,0x52,0x44, // 2036-2038
                0x5d,0xAA,0x38,0x0B,0x5A,0x4C,0x05,0x6d,0x41, // 2039-2041
                0x24,0xAd,0xB6,0x04,0x9B,0x4A,0x7A,0x4B,0xBe, // 2042-2044
                0x0A,0x4B,0x51,0x0A,0xA5,0x46,0x5B,0x52,0xBA, // 2045-2047
                0x06,0xd2,0x4e,0x0A,0xdA,0x42,0x35,0x5B,0x37, // 2048-2050
                0x09,0x37,0x4B,0x84,0x97,0xC1,0x04,0x97,0x53, // 2051-2053
                0x06,0x4B,0x48,0x66,0xA5,0x3C,0x0e,0xA5,0x4f, // 2054-2056
                0x06,0xB2,0x44,0x4A,0xB6,0x38,0x0A,0xAe,0x4C, // 2057-2059
                0x09,0x2e,0x42,0x3C,0x97,0x35,0x0C,0x96,0x49, // 2060-2062
                0x7d,0x4A,0xBd,0x0d,0x4A,0x51,0x0d,0xA5,0x45, // 2063-2065
                0x55,0xAA,0xBA,0x05,0x6A,0x4e,0x0A,0x6d,0x43, // 2066-2068
                0x45,0x2e,0xB7,0x05,0x2d,0x4B,0x8A,0x95,0xBf, // 2069-2071
                0x0A,0x95,0x53,0x0B,0x4A,0x47,0x6B,0x55,0x3B, // 2072-2074
                0x0A,0xd5,0x4f,0x05,0x5A,0x45,0x4A,0x5d,0x38, // 2075-2077
                0x0A,0x5B,0x4C,0x05,0x2B,0x42,0x3A,0x93,0xB6, // 2078-2080
                0x06,0x93,0x49,0x77,0x29,0xBd,0x06,0xAA,0x51, // 2081-2083
                0x0A,0xd5,0x46,0x54,0xdA,0xBA,0x04,0xB6,0x4e, // 2084-2086
                0x0A,0x57,0x43,0x45,0x27,0x38,0x0d,0x26,0x4A, // 2087-2089
                0x8e,0x93,0x3e,0x0d,0x52,0x52,0x0d,0xAA,0x47, // 2090-2092
                0x66,0xB5,0x3B,0x05,0x6d,0x4f,0x04,0xAe,0x45, // 2093-2095
                0x4A,0x4e,0xB9,0x0A,0x4d,0x4C,0x0d,0x15,0x41, // 2096-2098
                0x2d,0x92,0xB5};                              // 2099               
uc year_moon,month_moon,day_moon;
uc code day_cod1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};//月份天數(shù)數(shù)據(jù)表
ui code day_cod2[3]={0x111,0x130,0x14e};//月修正數(shù)據(jù)表

/*讀取數(shù)據(jù)表中農(nóng)歷月的大月或小月,如果該月大返回1,小返回0*/
bit get_moon_day(uc month_p,ui code_addr)
{
        uc temp,temp1;
        temp1=(month_p+3)/8;
        temp=0x80>>((month_p+3)%8);
        temp=year_cod[code_addr+temp1]&temp;
        if(temp==0){return(0);}
        else{return(1);}
}
/*==轉(zhuǎn)換當(dāng)前農(nóng)歷信息====================================*/
void SunToMoon(uc year,uc month,uc day)  //輸入公歷十進制輸出農(nóng)歷十進制
{   
    uc temp1,temp2,temp3,month_p;
    ui temp4,code_addr;
    bit flag2,flag_y;
//        year=year/16*10+year%16;
//        month=month/16*10+month%16;
//        day=day/16*10+day%16;
    code_addr=year*3;   //定位數(shù)據(jù)表地址
    temp1=year_cod[code_addr+2]&0x60;   //取當(dāng)年春節(jié)所在的公歷月份
    temp1=_cror_(temp1,5);  
    temp2=year_cod[code_addr+2]&0x1f;   //取當(dāng)年春節(jié)所在的公歷日   
    temp3=temp2-1;       //計算當(dāng)年春節(jié)離當(dāng)年元旦的天數(shù),春節(jié)只會在公歷1月或2月
    if(temp1!=1)
                temp3+=0x1f;
    if(month<10)
                temp4=day_cod1[month-1]+day;
    else
                temp4=day_cod2[month-10]+day;
    if((month<2)||(year%0x04!=0)) temp4-=1; //如果公歷月小于2月或者該年的2月非閏月,天數(shù)減1  
    if (temp4>=temp3)        //判斷公歷日在春節(jié)前還是春節(jié)后
    {
        //公歷日在春節(jié)后或就是春節(jié)當(dāng)日使用下面代碼進行運算
        temp4 -=temp3;
        month  = 1;        
        flag_y = 0;
        month_p= 1;  //month_p為月份指向,公歷日在春節(jié)前或就是春節(jié)當(dāng)日month_p指向首月
        flag2=get_moon_day(month_p,code_addr); //檢查該農(nóng)歷月為大小還是小月,大月返回1,小月返回0
        if(flag2==0) temp1=29;
                    else temp1=30; //小月29天、大月30天   
        temp2=year_cod[code_addr]&0xf0;
        temp2=_cror_(temp2,4);  //從數(shù)據(jù)表中取該年的閏月月份,如為0則該年無閏月
        while(temp4>=temp1)
        {
            temp4-=temp1;
            month_p+=1;
            if(month==temp2)
            {
                flag_y=~flag_y;
                if(flag_y==0)month+=1;
            }
            else month+=1;
            flag2=get_moon_day(month_p,code_addr);
            if(flag2==0)temp1=0x1d;
            else temp1=0x1e;
        }
        day=temp4+1;
    }
    else//公歷日在春節(jié)前使用下面代碼進行運算
    {      
        temp3-=temp4;
        if(year==0) year=0xe3;
                    else year-=1;
        code_addr-=3;
        month  = 0xc;
        temp2  = year_cod[code_addr]&0xf0;
        temp2  = _cror_(temp2,4);
        flag_y = 0;
        if(temp2==0) month_p=12;
                    else month_p=13; //如果當(dāng)年有閏月,一年有十三個月,月指向13,無閏月指向12  
        flag2=get_moon_day(month_p,code_addr);
        if(flag2==0) temp1=29;
                    else temp1=30;
        while(temp3>temp1)
        {
            temp3-=temp1;
            month_p-=1;
            if(flag_y==0) month-=1;
            if(month==temp2) flag_y=~flag_y;
            flag2=get_moon_day(month_p,code_addr);
            if(flag2==0) temp1=0x1d;
                              else temp1=0x1e;
        }
        day=temp1-temp3+1;
    }
        year_moon = year;    //將農(nóng)歷信息寫進指定變量
        month_moon = month;
        day_moon = day;
}
/*************************************************************************
        函數(shù)功能:輸入陽歷數(shù)據(jù),輸出星期數(shù)據(jù)(只允許2000-2099年)
        調(diào)用函數(shù)示例:Conver_WEEK(year_sun,month_sun,day_sun)
        如:計算2015年10月16日Conversion(15,10,16);
*****************************************************************************/

//使用基姆拉爾森計算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 改裝
/*****uc Conver_WEEK(uc year,uc month,uc day)
{       
    uc iWeek;
        if(month<3)          //3月為公式月頭
        {
                month+=12;
        if( year> 0 )
            year--;
        else
            year = 4;
        }
        iWeek=(day+2*month+3*(month+1)/5+year+year/4)%7 +1;
        return         iWeek;
}
*********************************************/


#endif


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:1064915 發(fā)表于 2024-2-6 08:20 | 只看該作者
手工計算驗證一下
回復(fù)

使用道具 舉報

板凳
ID:57657 發(fā)表于 2024-2-6 15:42 | 只看該作者
問題與單片機無關(guān),而是算法有問題,你要解決算法沒有問題才可以移植到單片機上。
回復(fù)

使用道具 舉報

地板
ID:624476 發(fā)表于 2024-2-6 16:10 | 只看該作者
本帖最后由 fhl323225577 于 2024-2-6 16:23 編輯

錯在這里 if((month<2)||(year%0x04!=0))
                        temp4-=1; //如果公歷月小于2月或者該年的2月非閏月,天數(shù)減1  

正常是要減一天的,這里判斷為2月為閏月就沒有減一天了,到了3月一號就可以正常用了。
這個故障 每次閏年的二月農(nóng)歷都會快一天。
回復(fù)

使用道具 舉報

5#
ID:739610 發(fā)表于 2024-2-7 16:04 | 只看該作者
差一天 估計2月份閏月的問題 看看這兒分析一下
回復(fù)

使用道具 舉報

6#
ID:1011444 發(fā)表于 2024-2-21 12:32 | 只看該作者

能在程序上做如何修改,請不吝賜教!
回復(fù)

使用道具 舉報

7#
ID:1096212 發(fā)表于 2024-2-22 08:38 | 只看該作者
// 如果公歷月大于2月并且該年的2月為閏月,天數(shù)加1  
        if ((month>2)&&(yearL%4==0))         temp4++;
改這個試試呢
回復(fù)

使用道具 舉報

8#
ID:90212 發(fā)表于 2024-2-26 13:17 | 只看該作者
貌似我當(dāng)年玩萬年歷用過的查詢
回復(fù)

使用道具 舉報

9#
ID:16255 發(fā)表于 2024-2-27 22:08 | 只看該作者
以下是我正在使用的代碼,正常運行一年多了,沒發(fā)現(xiàn)錯誤。
[code]/*---------------------農(nóng)歷轉(zhuǎn)換程序---------------------*/
//月份數(shù)據(jù)表
code uint day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};
code uint day_code2[3]={0x111,0x130,0x14e};
bit c_moon,c;
data uchar YLunar,MLunar,DLunar,RLunar,week;  //用于查詢

/*子函數(shù),用于讀取數(shù)據(jù)表中農(nóng)歷月的大月或小月,如果該月為大返回1,為小返回0*/
bit get_moon_day(uchar month_p,uint table_addr){
uchar temp;
    switch (month_p){
        case 1:{temp=year_code[table_addr]&0x08;
               if (temp==0)return(0);else return(1);}
        case 2:{temp=year_code[table_addr]&0x04;
               if (temp==0)return(0);else return(1);}
        case 3:{temp=year_code[table_addr]&0x02;
               if (temp==0)return(0);else return(1);}
        case 4:{temp=year_code[table_addr]&0x01;
               if (temp==0)return(0);else return(1);}
        case 5:{temp=year_code[table_addr+1]&0x80;
               if (temp==0) return(0);else return(1);}
        case 6:{temp=year_code[table_addr+1]&0x40;
               if (temp==0)return(0);else return(1);}
        case 7:{temp=year_code[table_addr+1]&0x20;
               if (temp==0)return(0);else return(1);}
        case 8:{temp=year_code[table_addr+1]&0x10;
               if (temp==0)return(0);else return(1);}
        case 9:{temp=year_code[table_addr+1]&0x08;
               if (temp==0)return(0);else return(1);}
        case 10:{temp=year_code[table_addr+1]&0x04;
               if (temp==0)return(0);else return(1);}
        case 11:{temp=year_code[table_addr+1]&0x02;
               if (temp==0)return(0);else return(1);}
        case 12:{temp=year_code[table_addr+1]&0x01;
               if (temp==0)return(0);else return(1);}
        case 13:{temp=year_code[table_addr+2]&0x80;
               if (temp==0)return(0);else return(1);}
      }
}
/*函數(shù)功能:輸入BCD陽歷數(shù)據(jù),輸出BCD陰歷數(shù)據(jù)(只允許1901-2099年)*/
void GetLunar(uchar yy,uchar mo,uchar dd){    //c=0 為21世紀(jì),c=1 為19世紀(jì) 輸入輸出數(shù)據(jù)均為BCD數(shù)據(jù)
回復(fù)

使用道具 舉報

10#
ID:1011444 發(fā)表于 2024-2-28 15:53 | 只看該作者

if((month<2)||(year%0x04!=0))
                        temp4-=1; //如果公歷月小于2月或者該年的2月非閏月,天數(shù)減1
改為if((month<3)||(year%0x04!=0))
        temp4-=1;
農(nóng)歷顯示正常了。不知以后會不會出問題
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 91视频进入| 成人性视频免费网站 | 91成人精品视频 | 午夜影院黄 | 久操伊人 | 亚洲一区二区视频在线播放 | 黑人精品欧美一区二区蜜桃 | 伊人性伊人情综合网 | 99久久精品免费看国产四区 | 天天综合网天天综合色 | 欧美αv | 精品视频久久久久久 | 艹逼网| 狠狠干夜夜草 | 韩日一区二区 | 亚洲视频一区在线播放 | 完全免费av在线 | 亚洲欧洲日韩 | 午夜国产一级 | 青青草国产在线观看 | 欧美三区在线观看 | 亚洲国产精品久久久久 | 成人在线视频一区 | 国产精品久久精品 | 成人av免费| 国产精品久久久久国产a级 欧美日韩国产免费 | 伊人性伊人情综合网 | www天天操 | 天天干天天玩天天操 | 亚洲欧美日韩精品久久亚洲区 | 日韩色视频| 一级黄色绿像片 | 夜夜骚 | 91资源在线 | 亚洲视频在线观看 | 亚洲综合色视频在线观看 | 精品欧美一区二区三区 | 久热电影 | 日韩国产精品一区二区三区 | 久久av一区二区三区 | 成人国产精品久久久 |