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

📄 生日提醒.lst

📁 单片机驱动32X64点阵资料
💻 LST
📖 第 1 页 / 共 5 页
字号:
 442   1       { //公历日在春节后或就是春节当日使用下面代码进行运算
 443   2              tenp4-=tenp3;
 444   2              yue=0x1;
 445   2              yue_p=0x1;  //yue_p为月份指向,公历日在春节前或就是春节当日yue_p指向首月
 446   2              flag2=get_moon_ri(yue_p,table_addr); 
 447   2      //检查该农历月为大小还是小月,大月返回1,小月返回0
 448   2              flag_y=0;
 449   2              if(flag2==0)tenp1=0x1d; //小月29天
 450   2              else tenp1=0x1e; //大小30天
 451   2              tenp2=nian_code[table_addr]&0xf0;
 452   2              tenp2=_cror_(tenp2,4);  //从数据表中取该年的闰月月份,如为0则该年无闰月
 453   2              while(tenp4>=tenp1)
 454   2        {
 455   3                  tenp4-=tenp1;
 456   3                  yue_p+=1;
 457   3                  if(yue==tenp2)
 458   3         {
 459   4          flag_y=~flag_y;
 460   4          if(flag_y==0)
 461   4           yue+=1;
 462   4                  }
 463   3                  else yue+=1;
 464   3                  flag2=get_moon_ri(yue_p,table_addr);
 465   3                  if(flag2==0)tenp1=0x1d;
 466   3                  else tenp1=0x1e;
 467   3              }
 468   2              ri=tenp4+1;
 469   2          }
 470   1          else
 471   1       {  //公历日在春节前使用下面代码进行运算
 472   2              tenp3-=tenp4;
 473   2              if (nian==0x0)
 474   2        {
 475   3         nian=0x63;c=1;
 476   3        }
 477   2              else nian-=1;
 478   2              table_addr-=0x3;
 479   2              yue=0xc;
 480   2              tenp2=nian_code[table_addr]&0xf0;
 481   2              tenp2=_cror_(tenp2,4);
 482   2              if (tenp2==0)
 483   2         yue_p=0xc; 
 484   2              else 
 485   2         yue_p=0xd; //
C51 COMPILER V8.08   蒧日提醒                                                              10/25/2011 08:42:07 PAGE 9   

 486   2              /*yue_p为月份指向,如果当年有闰月,一年有十三个月,月指向13,无闰月指向12*/
 487   2              flag_y=0;
 488   2              flag2=get_moon_ri(yue_p,table_addr);
 489   2              if(flag2==0)tenp1=0x1d;
 490   2              else tenp1=0x1e;
 491   2              while(tenp3>tenp1)
 492   2        {
 493   3                  tenp3-=tenp1;
 494   3                  yue_p-=1;
 495   3                  if(flag_y==0)yue-=1;
 496   3                  if(yue==tenp2)flag_y=~flag_y;
 497   3                  flag2=get_moon_ri(yue_p,table_addr);
 498   3                  if(flag2==0)tenp1=0x1d;
 499   3                  else tenp1=0x1e;
 500   3               }
 501   2               ri=tenp1-tenp3+1;
 502   2          }
 503   1          c_moon=c;                 //HEX->BCD ,运算结束后,把数据转换为BCD数据
 504   1          tenp1=nian/10;
 505   1          tenp1=_crol_(tenp1,4);
 506   1          tenp2=nian%10;
 507   1          nian_moon=tenp1|tenp2;
 508   1          tenp1=yue/10;
 509   1          tenp1=_crol_(tenp1,4);
 510   1          tenp2=yue%10;
 511   1          yue_moon=tenp1|tenp2;
 512   1          tenp1=ri/10;
 513   1          tenp1=_crol_(tenp1,4);
 514   1          tenp2=ri%10;
 515   1          ri_moon=tenp1|tenp2;
 516   1      }
 517          /*函数功能:输入BCD阳历数据,输出BCD星期数据(只允许1901-2099年)
 518          调用函数示例:Conver_xingqi(c_sun,nian_sun,yue_sun,ri_sun)
 519          如:计算2004年10月16日Conversion(0,0x4,0x10,0x16);
 520          c_sun,nian_sun,yue_sun,ri_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世
 521          纪,c_sun=1为19世纪
 522          调用函数后,原有数据不变,读xingqi得出阴历BCD数据
 523          */
 524          
 525          /*
 526          算法:日期+年份+所过闰年数+月较正数之和除7 的余数就是星期但如果是在
 527          闰年又不到3 月份上述之和要减一天再除7
 528          星期数为0
 529          */
 530          void Conver_xingqi(bit c,uchar nian,uchar yue,uchar ri)
 531          {//c=0 为21世纪,c=1 为19世纪 输入输出数据均为BCD数据
 532   1          uchar tenp1,tenp2;
 533   1          tenp1=nian/16;   //BCD->hex 先把数据转换为十六进制
 534   1          tenp2=nian%16;
 535   1          nian=tenp1*10+tenp2;
 536   1          tenp1=yue/16;
 537   1          tenp2=yue%16;
 538   1          yue=tenp1*10+tenp2;
 539   1          tenp1=ri/16;
 540   1          tenp2=ri%16;
 541   1          ri=tenp1*10+tenp2;
 542   1          if (c==0){nian+=0x64;}  //如果为21世纪,年份数加100
 543   1          tenp1=nian/0x4;  //所过闰年数只算1900年之后的
 544   1          tenp2=nian+tenp1;
 545   1          tenp2=tenp2%0x7;  //为节省资源,先进行一次取余,避免数大于0xff,避免使用整型数据
 546   1          tenp2=tenp2+ri+table_xingqi[yue-1];
 547   1          if (nian%0x4==0&&yue<3)tenp2-=1;
C51 COMPILER V8.08   蒧日提醒                                                              10/25/2011 08:42:07 PAGE 10  

 548   1          xingqi=tenp2%0x7;
 549   1      }
 550          /***************************************************************/
 551          void  Delay_10us(void)
 552                {
 553   1              U8 i;
 554   1            
 555   1          for(i=15;i>0;i--);
 556   1      
 557   1             }
 558                  
 559             void  COM(void)
 560                {
 561   1           
 562   1                      U8 i;
 563   1             for(i=0;i<8;i++)    
 564   1                  {
 565   2                      
 566   2                          U8FLAG=2;
 567   2                      //----------------------
 568   2                       P37=0 ;  //T
 569   2                       P37=1 ;  //T
 570   2                  //---------------------- 
 571   2              
 572   2                      while((!P36)&&U8FLAG++);
 573   2                              Delay_10us();
 574   2                              Delay_10us();
 575   2                              Delay_10us();
 576   2                              U8temp=0;
 577   2                   if(P36)
 578   2                          U8temp=1;
 579   2                          U8FLAG=2;
 580   2                       while((P36)&&U8FLAG++);
 581   2                              
 582   2                  //----------------------
 583   2                        P37=0 ;  //T
 584   2                        P37=1 ;  //T
 585   2                 //----------------------
 586   2                      //超时则跳出for循环               
 587   2                       if(U8FLAG==1)break;
 588   2                      //判断数据位是0还是1     
 589   2                         
 590   2                      // 如果高电平高过预定0高电平值则数据位为 1 
 591   2                       
 592   2                         U8comdata<<=1;
 593   2                         U8comdata|=U8temp;        //0
 594   2                   }//rof
 595   1                 
 596   1              }
 597          
 598                  //--------------------------------
 599                  //-----湿度读取子程序 ------------
 600                  //--------------------------------
 601                  //----以下变量均为全局变量--------
 602                  //----温度高8位== U8T_data_H------
 603                  //----温度低8位== U8T_data_L------
 604                  //----湿度高8位== U8RH_data_H-----
 605                  //----湿度低8位== U8RH_data_L-----
 606                  //----校验 8位 == U8checkdata-----
 607                  //----调用相关子程序如下----------
 608                  //---- Delay();, Delay_10us();,COM(); 
 609                  //--------------------------------
C51 COMPILER V8.08   蒧日提醒                                                              10/25/2011 08:42:07 PAGE 11  

 610          
 611                  void RH(void)
 612                  { 
 613   1                if(rr==1)
 614   1                 {rr=0; 
 615   2                 //主机拉低18ms 
 616   2             P36=0;   
 617   2                 TR2=1; }
 618   1                // Delay2(180);
 619   1              else  if(zz==1)
 620   1                {  
 621   2                   RCAP2H = 0x7D;
 622   2               RCAP2L = 0x0CB;
 623   2                      rr=1;///////
 624   2                P36=1;
 625   2               //总线由上拉电阻拉高 主机延时20us
 626   2                 Delay_10us();
 627   2                 Delay_10us();
 628   2                 Delay_10us();
 629   2                // Delay_10us();
 630   2               //主机设为输入 判断从机响应信号 
 631   2                 P36=1;
 632   2               //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行    
 633   2                 if(!P36)              //T !    
 634   2                 {
 635   3                 U8FLAG=2;
 636   3               //判断从机是否发出 80us 的低电平响应信号是否结束        
 637   3                 while((!P36)&&U8FLAG++);
 638   3                 U8FLAG=2;
 639   3               //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
 640   3                 while((P36)&&U8FLAG++);
 641   3               //数据接收状态          
 642   3                 COM();
 643   3                 U8RH_data_H_temp=U8comdata;
 644   3                 COM();
 645   3                 U8RH_data_L_temp=U8comdata;
 646   3                 COM();
 647   3                 U8T_data_H_temp=U8comdata;
 648   3                 COM();
 649   3                 U8T_data_L_temp=U8comdata;
 650   3                 COM();
 651   3                 U8checkdata_temp=U8comdata;
 652   3                 P36=1;
 653   3                
 654   3                  temp_data[0] = U8RH_data_L_temp ;   //湿度低8位
 655   3           temp_data[1] = U8RH_data_H_temp ;   //湿度高8位 
 656   3               //数据校验 
 657   3               
 658   3                 U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
 659   3                 if(U8temp==U8checkdata_temp)
 660   3                 {
 661   4                        U8RH_data_H=U8RH_data_H_temp;
 662   4                        U8RH_data_L=U8RH_data_L_temp;
 663   4                        U8T_data_H=U8T_data_H_temp;
 664   4                        U8T_data_L=U8T_data_L_temp;
 665   4                        U8checkdata=U8checkdata_temp;
 666   4                        nn=0;
 667   4                        mm=0;
 668   4                 }
 669   3                 }

⌨️ 快捷键说明

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