⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ctime.lst

📁 用NXP公司P89LPC9401单片机开发液晶显示,包括开发资料,各功能驱动程序.
💻 LST
📖 第 1 页 / 共 2 页
字号:
 138          {
 139   1              bit runmonth;                                           //闰月标志
 140   1              uchar buf1,buf2,buf3;
 141   1              if(Year==0)                                                     //如果当前是2000年
 142   1                      Cyear=99;                                               //则把农历置为1999年
 143   1              else
 144   1                      Cyear=Year-1;                                   //否则农历年比公历少一天
 145   1              Cmonth=12;                                                      //农历月=12月
 146   1              runmonth=0;                                                     //闰月标志设为0
 147   1              buf1=CyearTab[Year][0];                         //读取闰月状态
 148   1              buf1&=0xf0;                                                     //取高位闰月信息
 149   1              buf1>>=4;                                                       //取得闰月
 150   1              buf2=CyearTab[Year][1];                         //读后8个月的大小月信息
 151   1              if(buf1!=0)                                                     //如果有闰月
 152   1              {
 153   2                      buf3=CyearTab[Year][2];                 //读取第三个字节
 154   2                      buf2<<=1;               
 155   2                      if((buf3&0x80)!=0)
 156   2                              buf2|=0x01;                                     //将第13个月的信息加到buf2的最低位
 157   2      
 158   2                      buf3=((buf2&0x01)==0)?29:30;    //取12月的天数
 159   2                      while(xdays>buf3)                               //如果xdays大于此月的天数
 160   2              {                                               
 161   3                              xdays=xdays-buf3;                       //则减去此月的天数
 162   3                              if(runmonth!=1)                         //如果当前不是闰月
 163   3                                      Cmonth--;                               //则将月减1
 164   3                              if(Cmonth==buf1)                        //如果此月是闰月,则将标志取反
 165   3                                      runmonth=!runmonth;     
 166   3                              buf2>>=1;                                       //将下个月的大小月信息移到bit0
 167   3                              buf3=((buf2&0x01)==0)?29:30;//取得需处理的月的天数
 168   3                  }
 169   2              }
 170   1              else                                                            //今年没有闰月
 171   1              {
 172   2                      buf3=((buf2&0x01)==0)?29:30;    //取12月的天数
 173   2                      while(xdays>buf3)                               //如果xdays>本月天数
 174   2              {
 175   3                              xdays=xdays-buf3;                       //减去本月天数
 176   3                              Cmonth--;                                       //农历月减一
 177   3                              buf2>>=1;                                       //取下一个月的状态
 178   3                              buf3=((buf2&0x01)==0)?29:30;//取下个月的天数    
 179   3                  }
C51 COMPILER V7.06   CTIME                                                                 11/09/2004 16:39:45 PAGE 4   

 180   2              }
 181   1              Cday=buf3-(uchar)xdays+1;                       //计算农历日
 182   1      }
 183          //***********************************************************************
 184          void  DayAfterNewYear(uint xdays)               //公历日在春节后的处理  
 185          {       
 186   1              bit runmonth;                                           //闰月标志
 187   1              uchar buf1,buf2,buf3;
 188   1              uint  buf4;
 189   1              Cyear=Year;                                                     //农历年=公历年
 190   1              Cmonth=1;                                                       //农历月=1月
 191   1              runmonth=0;                                                     //闰月标志设为0,1月不会是闰月
 192   1              buf1=CyearTab[Year+1][0];                       //读取闰月状态
 193   1              buf3=CyearTab[Year+1][1];                       //读取5到12月的月信息
 194   1              buf2=buf1&0x0f;                                                 
 195   1              buf2<<=4;                               
 196   1              buf2+=(buf3>>4);                                        
 197   1              buf3<<=4;                                                       //将12个月的信息存
 198   1              buf4=((uint)buf2)*256+buf3;                     //于一个整型数据方便处理
 199   1              buf1&=0xf0;                                                     //取高位闰月信息
 200   1              buf1>>=4;                                                       //取得闰月
 201   1              if(buf1!=0)                                                     //如果有闰月
 202   1              {       
 203   2                      buf2=CyearTab[Year+1][2];               //读取第三个字节
 204   2                      if((buf2&0x80)!=0)
 205   2                              buf4|=0x08;                                     //将第13个月的信息加到整型buf4中
 206   2                      buf2=((buf4&0x8000)==0)?29:30;  //取1月的天数
 207   2                      while(xdays>=buf2)                              //如果xdays大于此月的天数
 208   2              {                                               
 209   3                              xdays=xdays-buf2;                       //则减去此月的天数
 210   3                              if(runmonth!=1)                         //如果当前不是闰月
 211   3                                      Cmonth++;                               //则将月加1
 212   3                              if(Cmonth==buf1)                        //如果此月是闰月,则将标志取反
 213   3                                      runmonth=!runmonth;     
 214   3                              buf4<<=1;                                       //将下个月的大小月信息移到bit0
 215   3                              buf2=((buf4&0x8000)==0)?29:30;//取得需处理的月的天数
 216   3                  }
 217   2              }
 218   1              else                                                            //如果没有闰月
 219   1              {       
 220   2                      buf2=((buf4&0x8000)==0)?29:30;  //取得1月的信息
 221   2                      while(xdays>=buf2)                              //如果xdays大于等于此月田鼠
 222   2              {
 223   3                              xdays=xdays-buf2;                       //xdays-=本月天数
 224   3                              Cmonth++;                                       //月加1
 225   3                              buf4<<=1;                                       //取下一个月信息
 226   3                              buf2=((buf4&0x8000)==0)?29:30;//取下一个月的天数
 227   3                  }
 228   2              }
 229   1              Cday=(uchar)xdays+1;                            //求得农历日
 230   1      }
 231          
 232          //***********************************************************************
 233          void  ConvertDate()                                             //公历转农历函数
 234          {
 235   1              uchar buf1,buf2;
 236   1              uint  buf3,buf4;                                        //下面取得此年的农历春节信息
 237   1              buf1=CyearTab[Year+1][2];                       //注意YEAR+1,由于开始从1999年
 238   1              buf1&=0x7f;                                                                     
 239   1              buf2=buf1/32;                                           //春节对应公历日
 240   1              buf1=buf1%32;                                           //春节对应公历月
 241   1              if((Year&0x03)==0)                                      //如果是闰年,对应闰年表
C51 COMPILER V7.06   CTIME                                                                 11/09/2004 16:39:45 PAGE 5   

 242   1              {
 243   2                      buf4=RunDays[Month-1]+Day-1;    //则取得此月以前过了多少天
 244   2                      buf3=RunDays[buf2-1]+buf1-1;    //春节月以前过了多少天
 245   2              }
 246   1              else                                                            
 247   1              {
 248   2                      buf4=PingDays[Month-1]+Day-1;   //同上,但是对应平年表
 249   2                      buf3=PingDays[buf2-1]+buf1-1;
 250   2              }
 251   1              if(Month<buf2)                                          
 252   1                      DayBeforeNewYear(buf3-buf4);    //公历日在春节前,调用对应函数
 253   1              else if(Month==buf2&&Day<buf1)          
 254   1                      DayBeforeNewYear(buf1-Day);             
 255   1              else                                                            //公历日在春节后,调用对应函数
 256   1                      DayAfterNewYear(buf4-buf3);
 257   1      }
 258          //***********************************************************************       
 259          void  GetWeek()                                                 //公历日转星期函数
 260          {
 261   1              uchar buf;
 262   1              if((Year&0x03)==0)
 263   1                      buf=RunWeekTab[Month-1];                //取闰年星期表
 264   1              else
 265   1                      buf=PingWeekTab[Month-1];               //取平年星期表
 266   1              Weekday=(Year+Year/4+buf+Day+2)%7;      //计算星期
 267   1      }
 268          //********************************END************************************       


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    716    ----
   CONSTANT SIZE    =    375    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      4       8
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       2
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -