m41t0drv.lst

来自「C8051ucos源码」· LST 代码 · 共 230 行

LST
230
字号
C51 COMPILER V8.02   M41T0DRV                                                              01/09/2009 16:21:05 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE M41T0DRV
OBJECT MODULE PLACED IN M41T0DRV.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE program\M41T0DRV.c LARGE BROWSE DEBUG OBJECTEXTEND PRINT(.\M41T0DRV.lst) OB
                    -JECT(M41T0DRV.obj)

line level    source

   1          /*=======================================================================================================
   2          
   3          M41T0drv是面向M41T0芯片的驱动程序
   4          
   5          建立于:2005.08.01
   6          编写人:杨术轩
   7          
   8          =======================================================================================================*/
   9          
  10          #include "C8051F020.h"
  11          #include "M41T0DRV.h"
  12          
  13          #define M41T0ClkDelay 10
  14          #define M41T0SCL          P1_5
  15          #define M41T0SDA          P1_4
  16          
  17          //---------------------------------------------------------------------------------
  18          //IIC总线的开始状态
  19          void M41T0I2CStart(void)
  20          {
  21   1      unsigned char wait;
  22   1              for(wait=0;wait<M41T0ClkDelay;wait++);
  23   1              M41T0SDA = 1;
  24   1              M41T0SCL = 1;
  25   1              for(wait=0;wait<M41T0ClkDelay;wait++);
  26   1              M41T0SDA = 0;
  27   1              for(wait=0;wait<M41T0ClkDelay;wait++);
  28   1              M41T0SCL = 0;
  29   1              for(wait=0;wait<M41T0ClkDelay;wait++);
  30   1      }
  31          //----------------------------------------------------------------------------------
  32          //IIC总线的停止状态
  33          void M41T0I2CStop(void)
  34          {
  35   1      unsigned char wait;
  36   1              M41T0SCL  = 0;  
  37   1              M41T0SDA  = 0;
  38   1              for(wait=0;wait<M41T0ClkDelay;wait++);
  39   1              M41T0SCL  = 1;
  40   1              for(wait=0;wait<M41T0ClkDelay;wait++);
  41   1              M41T0SDA  = 1;
  42   1      }
  43          //----------------------------------------------------------------------------------
  44          //向从器件写出一个字节 ch,同时判断ack返回
  45          //返回:ack的状态
  46          unsigned char M41T0I2CByteWr(unsigned char ch)
  47          {
  48   1      unsigned char i,wait;
  49   1              for (i=0; i<8; i++)
  50   1              {
  51   2                      if(ch&0x80) M41T0SDA=1; else  M41T0SDA=0;
  52   2                      ch<<=1;
  53   2                      for(wait=0;wait<M41T0ClkDelay;wait++);  
  54   2                      M41T0SCL = 1;
C51 COMPILER V8.02   M41T0DRV                                                              01/09/2009 16:21:05 PAGE 2   

  55   2                      for(wait=0;wait<M41T0ClkDelay;wait++);
  56   2                      M41T0SCL = 0;
  57   2                      for(wait=0;wait<M41T0ClkDelay;wait++);
  58   2              }
  59   1              M41T0SDA=1; 
  60   1              for(wait=0;wait<M41T0ClkDelay;wait++);
  61   1              M41T0SCL = 1; 
  62   1              if(M41T0SDA)i=1;else i=0;
  63   1              for(wait=0;wait<M41T0ClkDelay;wait++);
  64   1              M41T0SCL = 0;
  65   1              return i;
  66   1      }
  67          //-----------------------------------------------------------------------------------
  68          //从从器件读入一个字节 
  69          //reack:是反给从器件的应答信号
  70          //返回:读入的字节
  71          unsigned char M41T0I2CByteRd(unsigned char reack)
  72          {
  73   1      unsigned char i,val,wait;
  74   1              M41T0SDA = 1;
  75   1              for (i=0; i<8; i++)
  76   1              {
  77   2                      for(wait=0;wait<M41T0ClkDelay;wait++);
  78   2                      M41T0SCL = 1;
  79   2                      val<<=1;
  80   2                      if(M41T0SDA) val|=1;
  81   2                      for(wait=0;wait<M41T0ClkDelay;wait++);
  82   2                      M41T0SCL = 0;
  83   2              } 
  84   1              for(wait=0;wait<M41T0ClkDelay;wait++);
  85   1              if (reack)M41T0SDA = 1;else M41T0SDA = 0;
  86   1              for(wait=0;wait<M41T0ClkDelay;wait++);
  87   1              M41T0SCL = 1;
  88   1              for(wait=0;wait<M41T0ClkDelay;wait++);
  89   1              M41T0SCL = 0;
  90   1      
  91   1      return val;
  92   1      }
  93          //========================================================================================================
             -===
  94          //向m41t0写一组数据
  95          //参数
  96          //      adr:M41T0内部的地址
  97          //      pbuf:写出的数据指针
  98          //      len:写出的数据长度
  99          unsigned char M41T0Write(unsigned char adr,unsigned char *pbuf,unsigned char len)
 100          {
 101   1              M41T0I2CStart();
 102   1              if(M41T0I2CByteWr(0xd0))return 1;
 103   1              if(M41T0I2CByteWr(adr))return 1;
 104   1              while(len--)
 105   1              {
 106   2                      if(M41T0I2CByteWr(*pbuf++))return 1;
 107   2              }
 108   1              M41T0I2CStop();
 109   1              return 0;
 110   1      }
 111          //------------------------------------------------------------------------------------------------------
 112          //从m41t0读一组数据
 113          //参数
 114          //      adr:M41T0内部的地址
 115          //      pbuf:读入的数据指针
C51 COMPILER V8.02   M41T0DRV                                                              01/09/2009 16:21:05 PAGE 3   

 116          //      len:读入的数据长度
 117          unsigned char M41T0Read(unsigned char adr,unsigned char *pbuf,unsigned char len)
 118          {
 119   1              if(len==0)return 0;
 120   1              M41T0I2CStart();
 121   1              M41T0I2CByteWr(0xd0);
 122   1              M41T0I2CByteWr(adr);
 123   1              M41T0I2CStop(); 
 124   1              M41T0I2CStart();
 125   1              M41T0I2CByteWr(0xd1);
 126   1      
 127   1              while(len--)
 128   1              {
 129   2                      if(len!=0)*pbuf++ = M41T0I2CByteRd(0);
 130   2                      else *pbuf++ = M41T0I2CByteRd(1);//读取最后一个字节后ACK的值必须是1
 131   2              }
 132   1      
 133   1              M41T0I2CStop(); 
 134   1              return 0;
 135   1      }
 136          //========================================================================================================
             -===
 137          //获取日期时间
 138          unsigned char GetM41T0Time(DateTimeTYP *datetime)
 139          {
 140   1      unsigned char buf[8];
 141   1      unsigned char *ptr = (unsigned char *) datetime;
 142   1      unsigned char i;
 143   1              for(i=0;i<5;i++)
 144   1              {
 145   2                      M41T0Read(0,buf,8);
 146   2                      if((buf[0]>>4)>6||(buf[0]&0x0f)>9)continue;
 147   2                      if((buf[1]>>4)>6||(buf[1]&0x0f)>9)continue;
 148   2                      if((buf[2]>>4)>2||(buf[2]&0x0f)>9)continue;
 149   2                      if((buf[4]>>4)>3||(buf[4]&0x0f)>9)continue;
 150   2                      if((buf[5]>>4)>1||(buf[5]&0x0f)>9)continue;
 151   2                      if((buf[6]>>4)>9||(buf[6]&0x0f)>9)continue;
 152   2                      *ptr++ = buf[0];
 153   2                      *ptr++ = buf[1];
 154   2                      *ptr++ = buf[2];
 155   2                      *ptr++ = buf[4];
 156   2                      *ptr++ = buf[5];
 157   2                      *ptr++ = buf[6];
 158   2              return 0;       
 159   2              }       
 160   1              return 1;
 161   1      }
 162          //------------------------------------------------------------------------------------------------------
 163          //设置日期时间
 164          //返回:非零数正确
 165          unsigned char SetM41T0Time(DateTimeTYP *datetime)
 166          {
 167   1      idata unsigned char buf[7];
 168   1      idata unsigned char *ptr = (unsigned char *) datetime;
 169   1              M41T0Write(1,"\x80",1);
 170   1              buf[0] = datetime->sec;
 171   1              buf[1] = datetime->min;
 172   1              buf[2] = datetime->hour;
 173   1              buf[3] = 0x01;
 174   1              buf[4] = datetime->date;
 175   1              buf[5] = datetime->month;
 176   1              buf[6] = datetime->year;
C51 COMPILER V8.02   M41T0DRV                                                              01/09/2009 16:21:05 PAGE 4   

 177   1      
 178   1                      if((buf[0]>>4)>6||(buf[0]&0x0f)>9)return 0;
 179   1                      if((buf[1]>>4)>6||(buf[1]&0x0f)>9)return 0;
 180   1                      if((buf[2]>>4)>2||(buf[2]&0x0f)>9)return 0;
 181   1                      if((buf[4]>>4)>3||(buf[4]&0x0f)>9)return 0;
 182   1                      if((buf[5]>>4)>1||(buf[5]&0x0f)>9)return 0;
 183   1                      if((buf[6]>>4)>9||(buf[6]&0x0f)>9)return 0;
 184   1              
 185   1              M41T0Write(6,&buf[6],1);
 186   1              M41T0Write(5,&buf[5],1);
 187   1              M41T0Write(4,&buf[4],1);
 188   1              M41T0Write(3,&buf[3],1);
 189   1              M41T0Write(2,&buf[2],1);
 190   1              M41T0Write(1,&buf[1],1);
 191   1              M41T0Write(0,&buf[0],1);
 192   1      return 1;
 193   1      }
 194          
 195          //=======================================================================================================
 196          
 197          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1105    ----
   CONSTANT SIZE    =      2    ----
   XDATA SIZE       =   ----      25
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----      10
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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