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

📄 i2c.lst

📁 I2C slaver 的8051源码
💻 LST
字号:
C51 COMPILER V7.50   I2C                                                                   06/16/2005 21:32:11 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN I2C.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE I2C.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          //***************************************************************
   2          //      I2C functions for ST72321 - master mode only
   3          //  Function    : Delay10us
   4          //  Description : delay 10us each time is called
   5          //                can be modified for different CPU speed
   6          // **************************************************************
   7          #include  "reg52.h"
   8          #include  "globedef.h"
   9          #include  "i2c.h"   
  10          #include  "delay.h"
  11          
  12          
  13          //***************************************************************
  14          //      Send start condition
  15          //      ensure data is high then issue a start condition
  16          //      see also i2c_Start() macro
  17          //***************************************************************
  18          void I2C_Start (void)
  19          {
  20   1              Pin_I2CSDA = 1;
  21   1                      Delay5US();
  22   1                      Delay5US();
  23   1              Pin_I2CSCL = 1; 
  24   1                      Delay5US();
  25   1              Delay5US();
  26   1              Pin_I2CSDA = 0; 
  27   1              Delay5US();     
  28   1              Delay5US();
  29   1              Delay5US();
  30   1              Pin_I2CSCL = 0;         
  31   1      }
  32          
  33          //***************************************************************
  34          //      Send stop condition
  35          //      data low-high while clock high
  36          //***************************************************************
  37          void I2C_Stop (void)
  38          {
  39   1              Pin_I2CSDA = 0;         
  40   1              Delay5US();
  41   1              Pin_I2CSCL = 1;         
  42   1              Delay5US();
  43   1              Delay5US();
  44   1              Pin_I2CSDA = 1;         
  45   1      }
  46          
  47          //***************************************************************
  48          //ROUTINE NAME : I2C_Ack
  49          //INPUT/OUTPUT : None.
  50          //DESCRIPTION  : Acknoledge generation from now.
  51          //COMMENTS     : Transfer sequence = DATA, ACK.
  52          //***************************************************************
  53          
  54          void I2C_Rack(void)
  55          {
C51 COMPILER V7.50   I2C                                                                   06/16/2005 21:32:11 PAGE 2   

  56   1              
  57   1                      Pin_I2CSCL = 0;
  58   1                      Pin_I2CSDA = 1;
  59   1              Delay5US();       
  60   1              Delay5US();        
  61   1              Pin_I2CSCL = 1;
  62   1              Delay5US();      
  63   1              Delay5US(); 
  64   1              Delay5US(); 
  65   1              Pin_I2CSDA = 0;
  66   1              Pin_I2CSCL = 0;          
  67   1              Delay5US();             
  68   1              
  69   1      }
  70          
  71          
  72          /*
  73          void I2C_Ack (void)
  74          {       
  75                  Pin_I2CSCL = 0;
  76                  Delay5US();             
  77                  Pin_I2CSDA = 0;
  78                  Delay5US();   
  79                  Pin_I2CSCL = 1;
  80                  Delay5US();
  81                  Pin_I2CSCL = 0;
  82                  Delay5US();
  83                  Pin_I2CSDA = 1;    
  84          }
  85          
  86          */
  87          //***************************************************************
  88          //ROUTINE NAME : I2C_nAck
  89          //INPUT/OUTPUT : None.
  90          //DESCRIPTION  : Non acknoledge generation from now.
  91          //COMMENTS     : Transfer sequence = DATA, NACK.
  92          //***************************************************************
  93          void I2C_nAck (void)
  94          {
  95   1              Pin_I2CSCL = 0;
  96   1              Delay5US();
  97   1              Pin_I2CSDA = 1;
  98   1              Delay5US();        
  99   1              Pin_I2CSCL = 1;
 100   1              Delay5US();
 101   1              Delay5US();
 102   1              Delay5US();
 103   1              Pin_I2CSCL = 0;
 104   1              Delay5US();
 105   1              Pin_I2CSDA = 1;
 106   1      }
 107          
 108          //***************************************************************
 109          //      Send a byte to the slave
 110          //      return I2C_ERROR on error
 111          //***************************************************************
 112          void I2C_TxData (BYTE i2c_data)
 113          {
 114   1              BYTE send_i;
 115   1      
 116   1              for(send_i=0; send_i<8; send_i++)
 117   1              {
C51 COMPILER V7.50   I2C                                                                   06/16/2005 21:32:11 PAGE 3   

 118   2                      Pin_I2CSCL = 0;         
 119   2                      Delay5US();             
 120   2                      if(i2c_data & 0x80)
 121   2                              Pin_I2CSDA = 1;
 122   2                      else
 123   2                              Pin_I2CSDA = 0;
 124   2                      Delay5US();     
 125   2                      Pin_I2CSCL = 1;         
 126   2                      Delay5US();                     
 127   2                      i2c_data <<= 1;
 128   2              }
 129   1              
 130   1      }
 131          
 132          //***************************************************************
 133          //ROUTINE NAME : I2Cm_RxData
 134          //INPUT/OUTPUT : Last byte to receive flag (active high)/Received data byte.
 135          //DESCRIPTION  : Receive a data byte.
 136          //COMMENTS     : Transfer sequence = DATA, ACK, EV7...
 137          //***************************************************************
 138          BYTE I2C_RxData (void)
 139          {   
 140   1          BYTE read_i;
 141   1          BYTE readbyte=0; 
 142   1          Pin_I2CSCL = 0;             
 143   1              Pin_I2CSDA = 1; 
 144   1              Delay5US();
 145   1      
 146   1              for(read_i=0; read_i<8; read_i++)
 147   1              {
 148   2                      Pin_I2CSCL = 1; 
 149   2                      readbyte <<= 1;
 150   2                      Delay5US();
 151   2                      if(Pin_I2CSDA)
 152   2                              readbyte |= 0x01;
 153   2                      
 154   2                      Pin_I2CSCL = 0;         
 155   2                      Delay5US();             
 156   2                      
 157   2              }  
 158   1              return readbyte;
 159   1      
 160   1      } 
 161          //***************************************************************
 162          //ROUTINE NAME : I2Cm_SetAddr
 163          //INPUT/OUTPUT : external I2C device address / None.
 164          //DESCRIPTION  : Generates Start-bit and transmits the address byte.
 165          //COMMENTS     : Transfer sequence = START, EV5, ADD, ACK...
 166          //***************************************************************
 167          void I2C_SetAddr(char i2c_addr)
 168          {
 169   1          I2C_TxData (i2c_addr);
 170   1      }
 171          
 172          
 173          
 174          //***************************************************************
 175          //    Send a byte to the slave and acknowledges the transfer
 176          //    return I2C_ERROR, or I2C_OK
 177          //***************************************************************
 178          
 179          
C51 COMPILER V7.50   I2C                                                                   06/16/2005 21:32:11 PAGE 4   

 180          void  I2C_PutByte(BYTE DevAddr,BYTE subAddr, BYTE ucData)
 181          {
 182   1          I2C_Start();
 183   1          I2C_SetAddr(DevAddr); 
 184   1          I2C_Rack();
 185   1          I2C_SetAddr(subAddr);     
 186   1          I2C_Rack();    
 187   1          I2C_TxData(ucData);
 188   1          I2C_Rack();    
 189   1          I2C_Stop();
 190   1      }
 191          
 192          void  I2C_ChangeVol(BYTE DevAddr,BYTE ucData)
 193          {
 194   1          I2C_Start();
 195   1          I2C_SetAddr(DevAddr); 
 196   1          I2C_Rack();
 197   1          I2C_SetAddr(ucData);     
 198   1          I2C_Rack();       
 199   1          I2C_Stop();
 200   1      }
 201          
 202          //***************************************************************
 203          //    Get a byte from the slave and acknowledges the transfer
 204          //    return I2C_OK or I2C_ERROR
 205          //***************************************************************
 206          
 207          
 208          BYTE  I2C_GetByte(BYTE DevAddr,BYTE subAddr)
 209          {
 210   1          BYTE  ucData;
 211   1              
 212   1          I2C_Start ();
 213   1          I2C_SetAddr(DevAddr); 
 214   1          I2C_Rack();
 215   1          I2C_SetAddr(subAddr);     
 216   1          I2C_Rack();
 217   1      
 218   1          I2C_Start ();
 219   1          I2C_SetAddr(DevAddr+1);  
 220   1          I2C_Rack();
 221   1          ucData = I2C_RxData();                                               
 222   1          
 223   1          I2C_nAck();               
 224   1      
 225   1          I2C_Stop();
 226   1          return(ucData);
 227   1      }
 228          
 229          //***************************************************************
 230          //     Send an array of bytes to the slave 
 231          //     -and acknowledges the transfer
 232          //     return I2C_OK or I2C_ERROR
 233          //***************************************************************
 234          
 235          /*
 236          void  I2C_PutString(BYTE DevAddr,BYTE subAddr, BYTE *str, BYTE length)
 237          {
 238              BYTE send_cc;
 239              send_cc = 0;
 240              I2C_Start ();
 241              I2C_SetAddr(DevAddr); 
C51 COMPILER V7.50   I2C                                                                   06/16/2005 21:32:11 PAGE 5   

 242              I2C_Rack();
 243              I2C_SetAddr(subAddr);     
 244              I2C_Rack();
 245          
 246              while(length)
 247              {
 248                 I2C_TxData(*str);
 249                 I2C_Rack();       
 250                 length--;
 251                 send_cc++;
 252                 if(length > 0)
 253                 str++;
 254                 
 255                 
 256                 if((send_cc % 8 == 0) && (length > 0))
 257                 {
 258                     I2C_Stop();
 259                     DelayX1ms(4);
 260                     
 261                     {
 262                                  I2C_Start ();
 263                                  I2C_SetAddr(DevAddr); 
 264                                  I2C_Rack();
 265                                  I2C_SetAddr(subAddr+send_cc);     
 266                                  I2C_Rack();
 267                             }
 268                     
 269                 }
 270              }
 271              I2C_Stop();
 272          }
 273          
 274          */
 275          
 276          /*
 277          void  I2C_OutString(BYTE DevAddr,BYTE subAddr, BYTE *str, BYTE length)
 278          {
 279              BYTE CCC;
 280              I2C_Start ();
 281              I2C_SetAddr(DevAddr); 
 282              I2C_Rack();
 283              I2C_SetAddr(subAddr);     
 284              I2C_Rack();
 285          
 286              while(length)
 287              {
 288               
 289                 I2C_TxData(*str);
 290                 I2C_Rack();       
 291                 length--;
 292                
 293                 if(length > 0)
 294                 str++;
 295              }
 296              I2C_Stop();
 297              for(CCC = 0; CCC <2;CCC++)
 298              ;
 299              
 300          }
 301          */
 302          
 303          //***************************************************************
C51 COMPILER V7.50   I2C                                                                   06/16/2005 21:32:11 PAGE 6   

 304          //     Reads number bytes from the slave, stores them at str 
 305          //     -and acknowledges the transfer
 306          //     return I2C_OK or I2C_ERROR not successfully read
 307          //***************************************************************
 308          
 309          /*
 310          void  I2C_GetString(BYTE DevAddr,BYTE subAddr, BYTE *str, BYTE number)
 311          {
 312              I2C_Start ();
 313              I2C_SetAddr(DevAddr); 
 314              I2C_Rack();
 315              I2C_SetAddr(subAddr);     
 316              I2C_Rack();
 317          
 318              I2C_Start ();
 319              I2C_SetAddr(DevAddr+1);  
 320              I2C_Rack();
 321              
 322              while(number)
 323              {
 324                          *str = I2C_RxData();
 325                          if (number==1)        
 326                                  I2C_nAck();      
 327                          else
 328                                  I2C_Ack();       
 329                          str++;
 330                          number -= 1;
 331              }
 332              I2C_Stop();
 333          }
 334          */


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    310    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      12
   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 + -