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

📄 i2c.lst

📁 一个带收音的功放程序, VFD显示驱动用一个非常实用的方法, 稍加修改即可换成不同的VFD, 功放芯片用M61538
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.20   I2C                                                                   07/16/2005 13:42:42 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN ..\output\I2C.obj
COMPILER INVOKED BY: C:\Keil51\C51\BIN\C51.EXE ..\source\KERNEL\I2C.c BROWSE DEBUG OBJECTEXTEND CODE PRINT(..\output\I2C
                    -.lst) OBJECT(..\output\I2C.obj)

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  "..\..\inc\globedef.h"
   9          #include  "..\..\inc\i2c.h"   
  10          #include  "..\..\inc\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)
C51 COMPILER V7.20   I2C                                                                   07/16/2005 13:42:42 PAGE 2   

  55          {
  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          void I2C_Ack (void)
  72          {
  73              
  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          
  89          //***************************************************************
  90          //ROUTINE NAME : I2C_nAck
  91          //INPUT/OUTPUT : None.
  92          //DESCRIPTION  : Non acknoledge generation from now.
  93          //COMMENTS     : Transfer sequence = DATA, NACK.
  94          //***************************************************************
  95          void I2C_nAck (void)
  96          {
  97   1              Pin_I2CSCL = 0;
  98   1              Delay5US();
  99   1              Pin_I2CSDA = 1;
 100   1              Delay5US();        
 101   1              Pin_I2CSCL = 1;
 102   1              Delay5US();
 103   1              Delay5US();
 104   1              Delay5US();
 105   1              Pin_I2CSCL = 0;
 106   1              Delay5US();
 107   1              Pin_I2CSDA = 1;
 108   1      }
 109          
 110          //***************************************************************
 111          //      Send a byte to the slave
 112          //      return I2C_ERROR on error
 113          //***************************************************************
 114          void I2C_TxData (BYTE i2c_data)
 115          {
 116   1              BYTE send_i;
C51 COMPILER V7.20   I2C                                                                   07/16/2005 13:42:42 PAGE 3   

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

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

 241                 I2C_TxData(*str);
 242                 I2C_Rack();       
 243                 length--;
 244                 send_cc++;
 245                 if(length > 0)
 246                 str++;
 247                 
 248                 
 249                 if((send_cc % 8 == 0) && (length > 0))
 250                 {
 251                     I2C_Stop();
 252                     DelayX1ms(4);
 253                     
 254                     {
 255                                  I2C_Start ();
 256                                  I2C_SetAddr(DevAddr); 
 257                                  I2C_Rack();
 258                                  I2C_SetAddr(subAddr+send_cc);     
 259                                  I2C_Rack();
 260                             }
 261                     
 262                 }
 263              }
 264              I2C_Stop();
 265          }
 266          
 267          */
 268          
 269          /*
 270          void  I2C_OutString(BYTE DevAddr,BYTE subAddr, BYTE *str, BYTE length)
 271          {
 272              BYTE CCC;
 273              I2C_Start ();
 274              I2C_SetAddr(DevAddr); 
 275              I2C_Rack();
 276              I2C_SetAddr(subAddr);     
 277              I2C_Rack();
 278          
 279              while(length)
 280              {
 281               
 282                 I2C_TxData(*str);
 283                 I2C_Rack();       
 284                 length--;
 285                
 286                 if(length > 0)
 287                 str++;
 288              }
 289              I2C_Stop();
 290              for(CCC = 0; CCC <2;CCC++)
 291              ;
 292              
 293          }
 294          */
 295          //***************************************************************
 296          //     Reads number bytes from the slave, stores them at str 
 297          //     -and acknowledges the transfer
 298          //     return I2C_OK or I2C_ERROR not successfully read
 299          //***************************************************************
 300          
 301          /*
 302          void  I2C_GetString(BYTE DevAddr,BYTE subAddr, BYTE *str, BYTE number)
C51 COMPILER V7.20   I2C                                                                   07/16/2005 13:42:42 PAGE 6   

 303          {

⌨️ 快捷键说明

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