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

📄 clock.lst

📁 本程序是通过软件模拟I2C协议对8563进行读写函数
💻 LST
字号:
C51 COMPILER V7.50   CLOCK                                                                 04/25/2007 20:35:54 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE CLOCK
OBJECT MODULE PLACED IN .\CLOCK.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\Src\CLOCK.C BROWSE DEFINE(DEVICE_TYPE_ICIDSERVER,USE_DEVICE_PCF8563) DEB
                    -UG OBJECTEXTEND PRINT(.\CLOCK.lst) OBJECT(.\CLOCK.obj)

line level    source

   1          /*
   2                  8563寄存器数据存储结构说明
   3          
   4                  02h 秒                  00~59  BCD 码格式数
   5                  03h 分钟                00~59  BCD 码格式数
   6                  04h 小时                00~59  BCD 码格式数
   7                  05h 日                  01~31  BCD 码格式数
   8                  06h 星期            0~6
   9                  07h 月/世纪             01~12  BCD 码格式数
  10                  08h 年                  00~99  BCD 码格式数    
  11          */
  12          #include        <reg52.h>
  13          #include        "..\Include\ClockDEF.h"
  14          #include        "..\..\I2C\Include\I2C.h"
  15          
  16          #define         Clock_OK                0
  17          #define         Clock_ERR               1
  18          /***************************************************************************
  19          参数:读取命令类型clock_rmd(包含0x01,0x02,0x03,0x04), 接收数据区clock_rdate(最大7个字节)
  20          0x01:读取日期     返回日期格式为:yymmdd
  21          0x02:读取时间     返回时间格式为:hhmmss
  22          0x03:读取星期     返回0--6之间的数值
  23          0x04:读取日期时间 返回日期时间格式为:yymmdd hhmmss
  24          注意:
  25          1、     有定义EN_CLOCK_FIRSTLOWBYTE,"日期"、"时间"、"日期时间"的返回格式分别为:"ddmmyy"、"ssmmhh"、"ssmmhhddm
             -myy"
  26          2、     若要调用读取日期/读取时间需定义EN_CLOCK_READWRITEDATEORTIME                   
  27              若要调用读取星期需定义EN_CLOCK_READWRITEWEEK                                        
  28              若要调用读取日期时间需定义EN_CLOCK_READWRITELONGDATETIME       
  29          3、返回值0x00:成功;0x01:失败
  30          ***************************************************************************/
  31          
  32          unsigned char Clock_Get(unsigned char clock_rcmd,unsigned char * clock_rdate)
  33          {
  34   1      #ifndef EN_CLOCK_FIRSTLOWBYTE
  35   1              unsigned char tmp;
  36   1      #endif
  37   1              switch(clock_rcmd)
  38   1              { 
  39   2      #ifdef EN_CLOCK_READWRITEDATEORTIME
  40   2                      case 0x01:
  41   2                              I2C_Read(clock_rdate,CLOCK_REG+3,4,CLOCK_DEVNO);
  42   2                              clock_rdate[1] = ( clock_rdate[2] & 0x1f );     //月
  43   2              #ifdef EN_CLOCK_FIRSTLOWBYTE    //返回日月年格式                           
                                      clock_rdate[0] &= 0x3f; //日
                                      clock_rdate[2] = clock_rdate[3];        //年
                                      if( clock_rdate[0] <= 0x31 )                    //位5为1时日期超过31天  
                                               return Clock_OK;
                      #else                         //返回年月日格式
  49   2                              clock_rdate[2] = ( clock_rdate[0] & 0x3f );     //日
  50   2                              clock_rdate[0] = clock_rdate[3];        //年
  51   2                              if( clock_rdate[2] <= 0x31)                     //位5为1时日期超过31天  
  52   2                                       return Clock_OK;
  53   2              #endif
C51 COMPILER V7.50   CLOCK                                                                 04/25/2007 20:35:54 PAGE 2   

  54   2                              break;
  55   2                      case 0x02:
  56   2                              I2C_Read(clock_rdate,CLOCK_REG,3,CLOCK_DEVNO);
  57   2                              clock_rdate[1] &= 0x7f;                                         //分
  58   2              #ifdef EN_CLOCK_FIRSTLOWBYTE       //返回秒分时
                                      clock_rdate[0] &= 0x7f; //秒    
                                      clock_rdate[2] &= 0x3f; //时
                                      if( (clock_rdate[2]<0x24) &&
                                          (clock_rdate[1]<0x60) &&
                                              (clock_rdate[0]<0x60)   
                                      )
                                               return Clock_OK;
                      #else                            //返回时分秒
  67   2                              tmp = clock_rdate[0];
  68   2                              clock_rdate[0] = ( clock_rdate[2] & 0x3f);      //时
  69   2                              clock_rdate[2] = ( tmp & 0x7f );                        //秒
  70   2                              if( (clock_rdate[0]<24) &&
  71   2                                  (clock_rdate[1]<60) &&
  72   2                                      (clock_rdate[2]<60)   
  73   2                              )
  74   2                                       return Clock_OK;
  75   2              #endif
  76   2                              break;
  77   2      #endif
  78   2      #ifdef EN_CLOCK_READWRITEWEEK
  79   2                      case 0x03:
  80   2                              I2C_Read(clock_rdate,CLOCK_REG+4,1,CLOCK_DEVNO); 
  81   2                              clock_rdate[0] &=0x07;                                          //星期
  82   2      
  83   2                              if( clock_rdate[0] < 0x07 )
  84   2                              return Clock_OK;    
  85   2                      break;
  86   2      #endif
  87   2      #ifdef EN_CLOCK_READWRITELONGDATETIME
  88   2                      case 0x04:
  89   2                              I2C_Read(clock_rdate,CLOCK_REG,7,CLOCK_DEVNO); 
  90   2              #ifdef EN_CLOCK_FIRSTLOWBYTE            //返回秒分时日月年
                                      clock_rdate[0] &= 0x7f;//秒
                              clock_rdate[1] &= 0x7f;//分
                                      clock_rdate[2] &= 0x3f;//时
                                      clock_rdate[3] &= 0x3f;//日
                                      clock_rdate[4] = ( clock_rdate[5] & 0x1f);//月                                  clock_
                                      clock_rdate[5] =  clock_rdate[6];//年   
                                      if( clock_rdate[3] <= 0x31 )                    //位5为1时日期超过31天  
                                               return Clock_OK;
                      #else                                //返回年月日时分秒
 100   2                      clock_rdate[4]=( clock_rdate[1] & 0x7f );//分
 101   2                              clock_rdate[1]=( clock_rdate[5] & 0x1f );//月
 102   2                              clock_rdate[5]=( clock_rdate[0] & 0x7f );//秒
 103   2                              clock_rdate[0]= clock_rdate[6];//年
 104   2                      tmp=clock_rdate[2];//暂存时
 105   2                              clock_rdate[2]=( clock_rdate[3] & 0x3f );//日
 106   2                              clock_rdate[3]=( tmp & 0x3f );//时
 107   2                              if( clock_rdate[2] <= 0x31 )                    //位5为1时日期超过31天  
 108   2                                       return Clock_OK;
 109   2              #endif
 110   2                              break;  
 111   2      #endif
 112   2              }                                
 113   1          return Clock_ERR;    
 114   1      }
 115          
C51 COMPILER V7.50   CLOCK                                                                 04/25/2007 20:35:54 PAGE 3   

 116          /***************************************************************************
 117          描述:Clock_Set(unsigned char clock_wcmd,unsigned char *clock_date)设置时间函数
 118          参数:设置命令类型clock_wcmd(包含0x01,0x02,0x03,0x04), 写入数据存储区clock_date(最大7个字节)
 119          0x01:设置日期     返回日期格式为:yymmdd
 120          0x02:设置时间     返回时间格式为:hhmmss
 121          0x03:设置星期     返回0--6之间的数值
 122          0x04:设置日期时间 返回日期时间格式为:yymmdd hhmmss
 123          注意:
 124          1、     若有定义EN_CLOCK_FIRSTLOWBYTE,"日期"、"时间"、"日期时间"的写入格式分别为:"ddmmyy"、"ssmmhh"、"ssmmhhd
             -dmmyy"
 125          2、     若要调用设置日期/读取时间需定义EN_CLOCK_READWRITEDATEORTIME                   
 126              若要调用设置星期需定义EN_CLOCK_READWRITEWEEK                                        
 127              若要调用设置日期时间需定义EN_CLOCK_READWRITELONGDATETIME       
 128          3、返回值0x00:成功;0x01:失败
 129          ***************************************************************************/
 130          unsigned char Clock_Set(unsigned char clock_wcmd,unsigned char *clock_date)
 131          {   
 132   1              unsigned char tmp;
 133   1      
 134   1              switch(clock_wcmd)
 135   1              { 
 136   2      #ifdef EN_CLOCK_READWRITEDATEORTIME
 137   2                      case 0x01:
 138   2              #ifdef EN_CLOCK_FIRSTLOWBYTE            //输入格式为日月年   
                                      clock_date[3] = clock_date[2];  //年
                                      clock_date[2] = clock_date[1];  //月
                      #else
 142   2                              clock_date[3] = clock_date[0];  //年
 143   2                              clock_date[0] = clock_date[2];  //日
 144   2                              clock_date[2] = clock_date[1];  //月
 145   2              #endif                                  //输入格式为年月日
 146   2                              clock_date[1] = 0x01;                           //星期
 147   2                              I2C_Write(clock_date,CLOCK_REG+3,4,CLOCK_DEVNO); 
 148   2                              I2C_Read(&tmp,CLOCK_REG+6,1,CLOCK_DEVNO);       //检验年份
 149   2                              if( tmp == clock_date[3] )
 150   2                                      return Clock_OK;
 151   2                              break;
 152   2                      case 0x02:
 153   2              #ifndef EN_CLOCK_FIRSTLOWBYTE
 154   2                              tmp=clock_date[0];              //小时暂存
 155   2                              clock_date[0]= clock_date[2];
 156   2                              clock_date[2]= tmp;
 157   2              #endif
 158   2                              I2C_Write(clock_date,CLOCK_REG,3,CLOCK_DEVNO); 
 159   2                              I2C_Read(&tmp,CLOCK_REG+2,1,CLOCK_DEVNO);                       //存放校验时间
 160   2                              if( tmp == clock_date[2] )                                      ////测试
 161   2                                      return Clock_OK;
 162   2                              break;
 163   2      #endif
 164   2      #ifdef EN_CLOCK_READWRITEWEEK
 165   2                      case 0x03:
 166   2                              I2C_Write(clock_date,CLOCK_REG+4,1,CLOCK_DEVNO);        //星期 
 167   2                              I2C_Read(&tmp,CLOCK_REG+4,1,CLOCK_DEVNO);                       //存放校验星期
 168   2                              if(tmp==clock_date[0])
 169   2                                      return Clock_OK;
 170   2                              break;
 171   2      #endif
 172   2      #ifdef EN_CLOCK_READWRITELONGDATETIME
 173   2                      case 0x04:
 174   2              #ifdef EN_CLOCK_FIRSTLOWBYTE
                                      clock_date[6] = clock_date[5];  //年
                                      clock_date[5] = clock_date[4];  //月
C51 COMPILER V7.50   CLOCK                                                                 04/25/2007 20:35:54 PAGE 4   

                      #else
 178   2                              clock_date[6] = clock_date[0];  //年
 179   2                              clock_date[0] = clock_date[5];  //秒
 180   2                              clock_date[5] = clock_date[1];  //月
 181   2                              clock_date[1] = clock_date[4];  //分
 182   2                              tmp                       = clock_date[2];      //暂存日
 183   2                              clock_date[2] = clock_date[3];  //时
 184   2                              clock_date[3] = tmp;                    //日
 185   2              #endif
 186   2                              clock_date[4] = 0x01;                   //星期
 187   2                              
 188   2                              I2C_Write(clock_date,CLOCK_REG,7,CLOCK_DEVNO); 
 189   2                              I2C_Read(&tmp,CLOCK_REG+2,1,CLOCK_DEVNO);  //存放校验时
 190   2                              if( tmp==clock_date[2] )                                        ////测试
 191   2                                      return Clock_OK;
 192   2                              break;
 193   2      #endif
 194   2              }
 195   1              return Clock_ERR;
 196   1      }
 197          
 198          #ifdef EN_CLOCK_INITFUNC
              unsigned char Clock_Init(unsigned char *temp) //初始化
              {
              #ifdef EN_CLOCK_FIRSTLOWBYTE
                  unsigned char code DATA[]={0x00,0x30,0x12};
              #else
                  unsigned char code DATA[]={0x12,0x30,0x00};
              #endif
                      if( Clock_Get(2,temp) )
                              return Clock_Set(2,DATA);
              }
              #endif


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    836    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----       8
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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