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

📄 timer.lst

📁 pcf8563万年历程序
💻 LST
字号:
C51 COMPILER V8.01   TIMER                                                                 04/13/2007 08:11:14 PAGE 1   


C51 COMPILER V8.01, COMPILATION OF MODULE TIMER
OBJECT MODULE PLACED IN TIMER.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE TIMER.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include        "reg52.h"
   2          #include        "VIiC_C51.H"    //包含VI2C软件包
   3          #define uchar unsigned char
   4          #define uint  unsigned int
   5          
   6          #define PCF8563 0xA2            //定义器件地址
   7          #define WRADDR  0x00            //定义写单元首地址
   8          #define RDADDR  0x02            //定义读单元首地址
   9          
  10          sbit  key_add=P3^7;
  11          sbit  key_move=P3^6;
  12          sbit  P1_2=P1^2;  
  13          sbit  P1_3=P1^3;
  14          sbit  P3_4=P3^4;
  15          sbit  P0_7=P0^7;
  16          bit   gettime_fg;
  17          
  18          unsigned char disp_buf[8]={0,0,0,0,0,0,0,0};//显示缓存
  19          unsigned int back_daycount;
  20          unsigned char day_old;
  21          unsigned char group0[8],group1[8],group2[8];
  22          //unsigned char code Tab1[]={0xc0,0xed,0xb0,0xa8,0x8d,0x8a,0x82,0xec,0x80,0x88};
  23            unsigned char code Tab1[10]={
  24                          0x81,/*0*/
  25                  0xED,/*1*/
  26                  0x43,/*2*/
  27                  0x49,/*3*/
  28                  0x2D,/*4*/
  29                  0x19,/*5*/
  30                  0x11,/*6*/
  31                  0xCD,/*7*/
  32                  0x01,/*8*/
  33                  0x09,/*9*/
  34          
  35                          };
  36            unsigned char code Tab2[10]={
  37                  0x18,/*0*/
  38                  0x7B,/*1*/
  39                  0x2C,/*2*/
  40                  0x29,/*3*/
  41                  0x4B,/*4*/
  42                  0x89,/*5*/
  43                  0x88,/*6*/
  44                  0x3B,/*7*/
  45                  0x08,/*8*/
  46                  0x09,/*9*/
  47                          };
  48          
  49          uchar RtcTime[7];
  50          
  51          void systeminit(void)
  52          {
  53   1         EA=1;
  54   1         ET0=1;
  55   1         TMOD=0x01;
C51 COMPILER V8.01   TIMER                                                                 04/13/2007 08:11:14 PAGE 2   

  56   1         TH0=-50000/256;
  57   1         TL0=-50000%256;
  58   1         TR0=1;
  59   1         SCON=0x00;
  60   1       }
  61          
  62          void time0() interrupt 1 using 2  //定时器0中断处理程序
  63           { 
  64   1         uchar t0int_count;              //定时器0中断次数变量
  65   1      
  66   1         TH0=-50000/256;
  67   1         TL0=-50000%256;
  68   1         t0int_count++;
  69   1         if(t0int_count==10)
  70   1           {
  71   2         //   P1_2=!P1_2;
  72   2                P1_3=!P1_3; 
  73   2                t0int_count=0;
  74   2      //        gettime_fg=~gettime_fg;
  75   2           }
  76   1       }
  77          
  78          void DelayMs(unsigned char no)             //延时毫秒程序
  79          {
  80   1              unsigned char i,j;
  81   1              for(i=0;i<no;i++)
  82   1              {
  83   2                for(j=0;j<164;j++);
  84   2                for(j=0;j<164;j++);
  85   2               }
  86   1      }
  87          
  88          void display(void)                       //数码管显示
  89          {
  90   1         uchar i,segsel;
  91   1      
  92   1                segsel=0x7f;
  93   1       for(i=0;i<8;i++)
  94   1               {
  95   2               P0=0xff;
  96   2         if(i==0|i==2|i==4|i==6)
  97   2                {
  98   3                SBUF=Tab2[group2[i]];
  99   3                while(TI==0) ;
 100   3                TI=0;
 101   3                TI=0;
 102   3                SBUF=Tab2[group0[i]];
 103   3                while(TI==0) ;
 104   3                TI=0;
 105   3                SBUF=Tab2[group1[i]];
 106   3                while(TI==0) ;
 107   3                TI=0;
 108   3      
 109   3                }             
 110   2           else       
 111   2               {
 112   3               SBUF=Tab1[group2[i]];
 113   3                while(TI==0) ;
 114   3                TI=0;
 115   3               SBUF=Tab1[group0[i]];  
 116   3                while(TI==0) ;
 117   3                TI=0;
C51 COMPILER V8.01   TIMER                                                                 04/13/2007 08:11:14 PAGE 3   

 118   3                SBUF=Tab1[group1[i]];
 119   3                while(TI==0) ;
 120   3                TI=0;
 121   3         
 122   3               }
 123   2                P0=segsel     ;
 124   2                DelayMs(1);
 125   2                segsel=(segsel>>1)+0x80;                              
 126   2         }    
 127   1         P0=0xff;                      
 128   1      
 129   1      
 130   1      }
 131          
 132          
 133          unsigned char displayall(unsigned char  *sd)    //显示时间
 134          { 
 135   1              sd[0]=sd[0]&0x7f;//秒屏蔽保留位
 136   1              sd[1]=sd[1]&0x7f;//分屏蔽保留位
 137   1              sd[2]=sd[2]&0x3f;//时屏蔽保留位
 138   1              sd[3]=sd[3]&0x3f;//日屏蔽保留位
 139   1              
 140   1              sd[4]=sd[4]&0x07;//星期屏蔽保留位
 141   1      
 142   1              sd[5]=sd[5]&0x1f;//月屏蔽保留位
 143   1               sd[6]=sd[6]&0x7f;//年屏蔽保留位
 144   1      
 145   1              group1[0]= (sd[3]%16);    //日个位
 146   1          group1[1] =(sd[3]/16);       //日十位
 147   1              group1[2]= (sd[5]%16);  //月个位
 148   1          group1[3] =(sd[5]/16);       //月十位
 149   1              group1[4]= (sd[6]%16);   //年个位
 150   1          group1[5] =(sd[6]/16);       //年十位
 151   1              group1[6]= 0x00;                //年百位
 152   1          group1[7] =0x02;             //年千位
 153   1      
 154   1          if(day_old!=sd[3])
 155   1              {
 156   2               if(back_daycount!=0x00)
 157   2                 back_daycount--;
 158   2               day_old=sd[3];
 159   2               }
 160   1      
 161   1              group0[0]= 0xff;        
 162   1        //  group0[1] =sd[4];          //星期
 163   1          if(sd[4]==0x00)
 164   1                group0[1]=0x08;
 165   1              else
 166   1                group0[1]=sd[4];
 167   1      //      group0[1] =sd[4];                //星期
 168   1              group0[2]= (sd[0]%16);  
 169   1          group0[3] =(sd[0]/16);
 170   1              group0[4]= (sd[1]%16);  
 171   1          group0[5] =(sd[1]/16);
 172   1              group0[6]= (sd[2]%16);  
 173   1          group0[7] =(sd[2]/16);
 174   1      
 175   1      
 176   1          group2[3]=back_daycount/100;
 177   1              group2[2]=back_daycount%100/10;
 178   1              group2[1]=back_daycount%10;
 179   1      
C51 COMPILER V8.01   TIMER                                                                 04/13/2007 08:11:14 PAGE 4   

 180   1          display();
 181   1          display();
 182   1      
 183   1              return 0;
 184   1      }
 185          
 186          unsigned char DelayNS(unsigned char  no)
 187          { 
 188   1              unsigned char  i,j;                                     //延时参数
 189   1      
 190   1              for(; no>0; no--)
 191   1                      for(i=0; i<100; i++)
 192   1                      for(j=0; j<100; j++);
 193   1              return 0; 
 194   1      }
 195          
 196          
 197          
 198           void TimeBCDadd(uchar i)          //时间BCD码加1
 199           {
 200   1         RtcTime[i] += 1;
 201   1         if( (RtcTime[i] & 0x0f) == 0x0a )
 202   1         RtcTime[i] += 6;
 203   1        }
 204          
 205          
 206          
 207          void timeadd( uchar i )                     //时间加1
 208          {
 209   1       switch (i)
 210   1       {
 211   2        case 0: if(RtcTime[0] == 0x59) RtcTime[0] = 0;
 212   2          else TimeBCDadd(0);
 213   2          break;
 214   2        case 1: if(RtcTime[1] ==0x59)  RtcTime[1] = 0;
 215   2          else TimeBCDadd(1);
 216   2          break;
 217   2        case 2: if(RtcTime[2] == 0x23) RtcTime[2] = 0;
 218   2          else TimeBCDadd(2);
 219   2          break;
 220   2        case 3: if(RtcTime[3] == 0x31) RtcTime[3] = 0;
 221   2          else TimeBCDadd(3);
 222   2          break;
 223   2        case 4: if(RtcTime[4] == 0x06) RtcTime[4] = 0;
 224   2          else RtcTime[4]++;
 225   2          break;
 226   2        case 5: if(RtcTime[5] == 0x12) RtcTime[5] = 0;
 227   2          else TimeBCDadd(5);
 228   2          break;
 229   2        case 6: if(RtcTime[6] == 0x99) RtcTime[6] = 0;
 230   2          else TimeBCDadd(6);
 231   2          break;
 232   2         }
 233   1      }
 234          
 235          
 236          void    main()
 237          {
 238   1              unsigned char  td[9]={0x00,0x12,0x00,0x00,0x12,0x12,0x04,0x04,0x07};    //定义初始化字
 239   1      //      unsigned char rd[7],tc; //定义接收缓冲区
 240   1          unsigned char code control_unit[2]={0x00,0x12};
 241   1              uchar led_num,i;
C51 COMPILER V8.01   TIMER                                                                 04/13/2007 08:11:14 PAGE 5   

 242   1              bit settime_fg;
 243   1              systeminit();
 244   1      
 245   1              back_daycount=0x32;
 246   1          day_old=0x00;
 247   1      
 248   1          for(i=0;i<8;i++)
 249   1                group2[i]=8-i;
 250   1      
 251   1              led_num=0;
 252   1              settime_fg=0;
 253   1              P1_2=1;
 254   1      
 255   1              ISendStr(PCF8563,WRADDR,td,0x5);        //初始化PCF8563,如果需要的话可以不去掉
 256   1              DelayNS(1);
 257   1              ISendStr(PCF8563,WRADDR+5,&td[5],0x4);//初始化PCF8563,如果需要的话可以不去掉
 258   1      
 259   1              IRcvStr(PCF8563,RDADDR,RtcTime,0x7);    //读现在的时、分、秒
 260   1          day_old=RtcTime[3]&0x3f;
 261   1      
 262   1      
 263   1              while(1)
 264   1              {
 265   2              if(settime_fg==0)
 266   2                        IRcvStr(PCF8563,RDADDR,RtcTime,0x7);  //读现在的时、分、秒
 267   2      
 268   2      
 269   2                         displayall(RtcTime); //调显示时间子程序
 270   2      
 271   2                      if(key_move==0)
 272   2                {
 273   3                         settime_fg=1;
 274   3                         P1_2=0;
 275   3                         led_num++;
 276   3                          if(led_num==8)
 277   3                              {
 278   4                                 led_num=0;
 279   4                                 settime_fg=0;
 280   4                                 P1_2=1;
 281   4      
 282   4                             ISendStr(PCF8563,WRADDR,control_unit,0x2);
 283   4                         DelayNS(1);
 284   4                         ISendStr(PCF8563,WRADDR+2,RtcTime,0x07);//初始化PCF8563,如果需要的话可以不去掉
 285   4                      
 286   4                               }
 287   3                               while(key_move==0)        //等待按键释放
 288   3                               {
 289   4                              
 290   4                            displayall(RtcTime);
 291   4                      
 292   4                               }
 293   3                              }
 294   2      
 295   2                       if(led_num)
 296   2                       {
 297   3                         if(key_add==0)
 298   3                         {
 299   4                          timeadd(led_num-1);
 300   4                              while(key_add==0)          //等待按键释放
 301   4                               {
 302   5                                 displayall(RtcTime); //调显示时间子程序
 303   5              
C51 COMPILER V8.01   TIMER                                                                 04/13/2007 08:11:14 PAGE 6   

 304   5                               }
 305   4                              }
 306   3                }
 307   2              
 308   2                      
 309   2              }
 310   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    995    ----
   CONSTANT SIZE    =     31    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     42      14
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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