<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 調(diào)試通過51單片機(jī)的萬年歷

          調(diào)試通過51單片機(jī)的萬年歷

          作者: 時間:2016-11-28 來源:網(wǎng)絡(luò) 收藏

          bit get_moon_day(uchar month_p,uint table_addr)
          {
          unsigned char temp;
          switch (month_p){
          case 1:{if(year_code[table_addr]&0x08 == 0) return(0);
          else return(1);}
          case 2:{if(year_code[table_addr]&0x04 == 0) return(0);
          else return(1);}
          case 3:{if(year_code[table_addr]&0x02 == 0) return(0);
          else return(1);}
          case 4:{if(year_code[table_addr]&0x01 == 0) return(0);
          else return(1);}
          case 5:{if(year_code[table_addr+1]&0x80 == 0) return(0);
          else return(1);}
          case 6:{if(year_code[table_addr+1]&0x40 == 0) return(0);
          else return(1);}
          case 7:{if(year_code[table_addr+1]&0x20 == 0) return(0);
          else return(1);}
          case 8:{if(year_code[table_addr+1]&0x10 == 0) return(0);
          else return(1);}
          case 9:{if(year_code[table_addr+1]&0x08 == 0) return(0);
          else return(1);}
          case 10:{if(year_code[table_addr+1]&0x04 == 0) return(0);
          else return(1);}
          case 11:{if(year_code[table_addr+1]&0x02 == 0) return(0);
          else return(1);}
          case 12:{if(year_code[table_addr+1]&0x01 == 0) return(0);
          else return(1);}
          case 13:{temp=year_code[table_addr+2]&0x80;
          if (temp==0)return(0);else return(1);}
          }
          }
          void Conversion(bit c,uchar year,uchar month,uchar day)
          { //c=0 為21世紀(jì),c=1 為19世紀(jì) 輸入輸出數(shù)據(jù)均為BCD數(shù)據(jù)
          uchar temp1,temp2,temp3,month_p;
          uint temp4,table_addr;
          bit flag2,flag_y;
          temp1=year/16; //BCD->hex 先把數(shù)據(jù)轉(zhuǎn)換為十六進(jìn)制
          temp2=year;
          year=temp1*10+temp2;
          temp1=month/16;
          temp2=month;
          month=temp1*10+temp2;
          temp1=day/16;
          temp2=day;
          day=temp1*10+temp2;
          //定位數(shù)據(jù)表地址
          if(c==0){
          table_addr=(year+0x64-1)*0x3;
          }
          else {
          table_addr=(year-1)*0x3;
          }
          //定位數(shù)據(jù)表地址完成
          //取當(dāng)年春節(jié)所在的公歷月份
          temp1=year_code[table_addr+2]&0x60;
          temp1=_cror_(temp1,5);
          //取當(dāng)年春節(jié)所在的公歷月份完成
          //取當(dāng)年春節(jié)所在的公歷日
          temp2=year_code[table_addr+2]&0x1f;
          //取當(dāng)年春節(jié)所在的公歷日完成
          // 計算當(dāng)年春年離當(dāng)年元旦的天數(shù),春節(jié)只會在公歷1月或2月
          if(temp1==0x1){
          temp3=temp2-1;
          }
          else{
          temp3=temp2+0x1f-1;
          }
          // 計算當(dāng)年春年離當(dāng)年元旦的天數(shù)完成
          //計算公歷日離當(dāng)年元旦的天數(shù),為了減少運(yùn)算,用了兩個表
          //day_code1[9],day_code2[3]
          //如果公歷月在九月或前,天數(shù)會少于0xff,用表day_code1[9],
          //在九月后,天數(shù)大于0xff,用表day_code2[3]
          //如輸入公歷日為8月10日,則公歷日離元旦天數(shù)為day_code1[8-1]+10-1
          //如輸入公歷日為11月10日,則公歷日離元旦天數(shù)為day_code2[11-10]+10-1
          if (month<10){
          temp4=day_code1[month-1]+day-1;
          }
          else{
          temp4=day_code2[month-10]+day-1;
          }
          if ((month>0x2)&&(year%0x4==0)){ //如果公歷月大于2月并且該年的2月為閏月,天數(shù)加1
          temp4+=1;
          }
          //計算公歷日離當(dāng)年元旦的天數(shù)完成
          //判斷公歷日在春節(jié)前還是春節(jié)后
          if (temp4>=temp3){ //公歷日在春節(jié)后或就是春節(jié)當(dāng)日使用下面代碼進(jìn)行運(yùn)算
          temp4-=temp3;
          month=0x1;
          month_p=0x1; //month_p為月份指向,公歷日在春節(jié)前或就是春節(jié)當(dāng)日month_p指向首月
          flag2=get_moon_day(month_p,table_addr); //檢查該農(nóng)歷月為大小還是小月,大月返回1,小月返回0
          flag_y=0;
          if(flag2==0)temp1=0x1d; //小月29天
          else temp1=0x1e; //大小30天
          temp2=year_code[table_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,table_addr);
          if(flag2==0)temp1=0x1d;
          else temp1=0x1e;
          }
          day=temp4+1;
          }
          else{ //公歷日在春節(jié)前使用下面代碼進(jìn)行運(yùn)算
          temp3-=temp4;
          if (year==0x0){year=0x63;c=1;}
          else year-=1;
          table_addr-=0x3;
          month=0xc;
          temp2=year_code[table_addr]&0xf0;
          temp2=_cror_(temp2,4);
          if (temp2==0)month_p=0xc;
          else month_p=0xd; //
          flag_y=0;
          flag2=get_moon_day(month_p,table_addr);
          if(flag2==0)temp1=0x1d;
          else temp1=0x1e;
          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,table_addr);
          if(flag2==0)temp1=0x1d;
          else temp1=0x1e;
          }
          day=temp1-temp3+1;
          }
          c_moon=c; //HEX->BCD ,運(yùn)算結(jié)束后,把數(shù)據(jù)轉(zhuǎn)換為BCD數(shù)據(jù)
          temp1=year/10;
          temp1=_crol_(temp1,4);
          temp2=year;
          year_moon=temp1|temp2;
          temp1=month/10;
          temp1=_crol_(temp1,4);
          temp2=month;
          month_moon=temp1|temp2;
          temp1=day/10;
          temp1=_crol_(temp1,4);
          temp2=day;
          day_moon=temp1|temp2;
          }
          code uchar table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正數(shù)據(jù)表
          void Conver_week(bit c,uchar year,uchar month,uchar day)
          {//c=0 為21世紀(jì),c=1 為19世紀(jì) 輸入輸出數(shù)據(jù)均為BCD數(shù)據(jù)
          uchar temp1,temp2;
          temp1=year/16; //BCD->hex 先把數(shù)據(jù)轉(zhuǎn)換為十六進(jìn)制
          temp2=year;
          year=temp1*10+temp2;
          temp1=month/16;
          temp2=month;
          month=temp1*10+temp2;
          temp1=day/16;
          temp2=day;
          day=temp1*10+temp2;
          if (c==0){year+=0x64;} //如果為21世紀(jì),年份數(shù)加100
          temp1=year/0x4; //所過閏年數(shù)只算1900年之后的
          temp2=year+temp1;
          temp2=temp2%0x7; //為節(jié)省資源,先進(jìn)行一次取余,避免數(shù)大于0xff,避免使用整型數(shù)據(jù)
          temp2=temp2+day+table_week[month-1];
          if (year%0x4==0&&month<3)temp2-=1;
          week=temp2%0x7;
          }
          //test
          uchar c_sun,year_sun,month_sun,day_sun;
          void main(){
          c_sun=1;
          year_sun=0x2;
          month_sun=0x11;
          day_sun=0x3;
          Conver_week(c_sun,year_sun,month_sun,day_sun);
          Conversion(c_sun,year_sun,month_sun,day_sun);
          while(1);
          }

          上一頁 1 2 下一頁

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();