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

📄 i2c.lst

📁 用51单片机实现IR解码
💻 LST
字号:
C51 COMPILER V8.02   I2C                                                                   10/16/2006 17:42:28 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN I2C.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE I2C.c OMF2 BROWSE DEBUG

line level    source

   1          /**********************************************************************
   2          *File           Name            :       eeprom.c
   3          *Creat          Time            :       2002/02/11
   4          *Program        Author          :       mqli
   5          *File           Discreption     :
   6          *        
   7          ************************************************************************/
   8          
   9          
  10          #include "common.h"
  11          #include "Var.h"
  12          #include "main.h" 
  13          #include "i2c.h"
  14          #include "lcd.h"
  15          
  16          
  17          
  18          
  19          
  20          #define         I2C_CLK_0       I2C_CLK=0
  21          #define         I2C_CLK_1       I2C_CLK=1       
  22                  
  23          #define         I2C_DATA_0      I2C_DATA=0
  24          #define         I2C_DATA_1      I2C_DATA=1
  25          
  26          BOOL IICWriteWaitAcknowlodge(void);
  27          
  28          unsigned char IICrxbyte(void);
  29          
  30          void IICstart(void);
  31          void IICstop(void);
  32          void IICReadAcknowledge(void);
  33          void IICtxbyte(U8 DateByte);
  34          U8  Comfirm_Var_Validity(U8 *var_address,U8 Max_Value,U8 Min_Value, U8 Normal_Value);
  35          
  36          
  37          
  38          void IICstart(void)
  39          {
  40   1      
  41   1      
  42   1      
  43   1      
  44   1        //  I2C_CLK_0;
  45   1              //Delay_xuS(1);
  46   1              
  47   1              I2C_DATA_1;
  48   1              Delay_xuS(1);
  49   1              I2C_CLK_1;
  50   1              Delay_xuS(1);
  51   1              I2C_DATA_0;
  52   1              Delay_xuS(1);
  53   1              I2C_CLK_0;
  54   1              Delay_xuS(1);
  55   1      
C51 COMPILER V8.02   I2C                                                                   10/16/2006 17:42:28 PAGE 2   

  56   1              
  57   1      }
  58          
  59          void IICstop(void)
  60          {
  61   1      
  62   1              Delay_xuS(1);
  63   1              I2C_CLK_0;
  64   1              Delay_xuS(1);
  65   1              I2C_DATA_0;
  66   1              Delay_xuS(1);
  67   1              I2C_CLK_1;
  68   1              Delay_xuS(1);
  69   1              I2C_DATA_1;
  70   1              Delay_xuS(1);
  71   1              
  72   1      }
  73          void IICReadAcknowledge(void)
  74          {
  75   1              I2C_CLK_0;
  76   1              I2C_DATA_0;
  77   1              Delay_xuS(1);
  78   1              I2C_CLK_1;
  79   1              Delay_xuS(1);
  80   1              I2C_CLK_0;
  81   1              I2C_DATA_1;
  82   1      }
  83          
  84          BOOL IICWriteWaitAcknowlodge(void)
  85          {
  86   1      
  87   1              BOOL WriteSuccessFlag=FALSE;
  88   1      
  89   1              I2C_CLK_1;
  90   1              WriteSuccessFlag=(I2C_DATA)?FALSE:TRUE;
  91   1              I2C_CLK_0;
  92   1              if ( WriteSuccessFlag==FALSE )
  93   1              {
  94   2                      Delay_xuS(1);
  95   2              }
  96   1              return WriteSuccessFlag;
  97   1      
  98   1      }
  99          
 100          void IICtxbyte(U8 DataByte)
 101          {
 102   1      
 103   1         DE_DATA U8 BitMast;
 104   1      
 105   1              
 106   1             for(BitMast=0x80;BitMast>0;BitMast>>=1)
 107   1        
 108   1             
 109   1                 {
 110   2              
 111   2                       if (DataByte&BitMast)
 112   2                              I2C_DATA_1;
 113   2                       else
 114   2                              I2C_DATA_0;
 115   2                      Delay_xuS(1);
 116   2                      Delay_xuS(1);
 117   2                      I2C_CLK_1;
C51 COMPILER V8.02   I2C                                                                   10/16/2006 17:42:28 PAGE 3   

 118   2                      Delay_xuS(1);
 119   2                      Delay_xuS(1);
 120   2                      I2C_CLK_0;
 121   2                 }
 122   1                      I2C_DATA_1;
 123   1      
 124   1      
 125   1      }
 126          
 127          unsigned char IICrxbyte(void)
 128          {
 129   1      DE_DATA U8 ReceiveByte=0,i;
 130   1         I2C_DATA_1;  
 131   1         for(i=0;i<8;i++)
 132   1         {
 133   2                 I2C_CLK_1;
 134   2                      ReceiveByte<<=1;
 135   2            ReceiveByte|=I2C_DATA;
 136   2                I2C_CLK_0;
 137   2           Delay_xuS(1);
 138   2             
 139   2         }
 140   1              return ReceiveByte;
 141   1              
 142   1      
 143   1      }
 144          
 145          
 146          
 147          
 148          /* Read EEPROM content */
 149          U8  I2C_Read_Bytes(U8 device_address,U8* register_adrress, U8 register_address_length,U8 * buffer_pointer,
             - U8 bytes_counter)
 150          {
 151   1              DE_DATA unsigned char errcnt;
 152   1      
 153   1              errcnt=0;
 154   1              while(1)
 155   1              {
 156   2                      IICstart();                                             
 157   2                      IICtxbyte(device_address);      
 158   2                      if (IICWriteWaitAcknowlodge()==TRUE) break;
 159   2                      errcnt++;
 160   2                      if (errcnt>5)
 161   2                      {
 162   3                              IICstop();
 163   3                              return I2C_WRITE_DEVICE_ADDRESS_NO_ACKNOLOGE;
 164   3                      }
 165   2              }
 166   1      
 167   1              do{
 168   2                      IICtxbyte(*register_adrress);
 169   2                      if(IICWriteWaitAcknowlodge()==FALSE)
 170   2                              return I2C_WRITE_REGISTER_ADDRESS_NO_ACKNOLOGE;
 171   2                      register_address_length--;
 172   2                      register_adrress++;
 173   2               }while(register_address_length);       
 174   1              
 175   1      
 176   1              IICstart();                                                     
 177   1              IICtxbyte(device_address|0x01);
 178   1              if(IICWriteWaitAcknowlodge()==FALSE)
C51 COMPILER V8.02   I2C                                                                   10/16/2006 17:42:28 PAGE 4   

 179   1                      return I2C_WRITE_DEVICE_ADDRESS_NO_ACKNOLOGE;                                   
 180   1      
 181   1              while (1)
 182   1              {
 183   2                      *buffer_pointer=0;
 184   2                      *buffer_pointer=IICrxbyte();
 185   2                      bytes_counter--;
 186   2                      if (bytes_counter==0) break;
 187   2                      IICReadAcknowledge();                           
 188   2                      buffer_pointer++;
 189   2              }
 190   1              Delay_xuS(1);
 191   1              IICstop();
 192   1              
 193   1              return I2C_COMMUNICATION_OK;
 194   1              
 195   1      }
 196          
 197          
 198          
 199          
 200          /*******************************************************
 201            for fast write fuction
 202            care that some chip limit the total bytes of one write cycle
 203            1K,2K=8   4K,8K,16K=16
 204          ************************************************************/
 205          
 206          
 207          
 208          
 209          
 210          U8  I2C_Write_Bytes(U8 device_address,U8* register_adrress, U8 register_address_length,U8 * buffer_pointer
             -, U8 bytes_counter)
 211          {
 212   1              DE_DATA  unsigned char errcnt,temp;
 213   1      
 214   1              errcnt=0;
 215   1              while(1)
 216   1              {
 217   2                      IICstart();                                             //  IIC start condition
 218   2                      IICtxbyte(device_address);      
 219   2                      if (IICWriteWaitAcknowlodge()==TRUE) break;
 220   2                      errcnt++;
 221   2                      if (errcnt>5)
 222   2                      {
 223   3                              IICstop();
 224   3                              return I2C_WRITE_DEVICE_ADDRESS_NO_ACKNOLOGE;
 225   3                      }
 226   2              }
 227   1              do{
 228   2                             temp=*register_adrress;
 229   2                                 IICtxbyte(temp);     
 230   2                              //IICtxbyte(*register_adrress);                                         //write the address onchip
 231   2                              if(IICWriteWaitAcknowlodge()==FALSE)
 232   2                              return I2C_WRITE_REGISTER_ADDRESS_NO_ACKNOLOGE;
 233   2                             register_address_length--;
 234   2                                      register_adrress++;
 235   2               }while(register_address_length);       
 236   1              
 237   1              while(bytes_counter)
 238   1              {
 239   2                     temp=*buffer_pointer;
C51 COMPILER V8.02   I2C                                                                   10/16/2006 17:42:28 PAGE 5   

 240   2                      IICtxbyte(temp);                                                                // transmit EEPROM data
 241   2                      if(IICWriteWaitAcknowlodge()==FALSE)
 242   2                              return I2C_WRITE_REGISTER_DATA_NO_ACKNOLOGE;
 243   2                              buffer_pointer++;
 244   2                              bytes_counter--;
 245   2              }       
 246   1              IICstop();                                                                      //  IIC stop condition
 247   1              
 248   1              return I2C_COMMUNICATION_OK;
 249   1      }
 250          
 251          
 252          
 253          
 254          
 255          
 256          /************************************************************
 257          * The followed is the application for IIC bus
 258          *
 259          *****************************************************************/
 260          #define EEPROM_I2C_DEVICE_ADDRESS               0xA0
 261          
 262           
 263          /* Read EEPROM content */
 264          U8  ReadXEEprom(U8 * buffer_pointer, U16 register_address, U8 bytes_counter)
 265          {
 266   1              DE_DATA U8 result,temp_register_address;
 267   1              temp_register_address=(U8)(register_address);
 268   1              
 269   1              result=  I2C_Read_Bytes(EEPROM_I2C_DEVICE_ADDRESS+((U8)(register_address/128)&0x0e), 
 270   1                                              &temp_register_address, 1,buffer_pointer, bytes_counter);
 271   1              Delay_xmS(10);
 272   1               if(result!=I2C_COMMUNICATION_OK)
 273   1                              Scroll_Promote_Information("READ EEP ERR:",result);
 274   1                      return result;
 275   1      }
 276          
 277          
 278          
 279          
 280          
 281          /*******************************************************
 282            for fast write fuction
 283            care that some chip limit the total bytes of one write cycle
 284            1K,2K=8   4K,8K,16K=16
 285          ************************************************************/
 286          
 287          
 288          U8 WriteXEEprom(U8 * bufptr, U16 register_address, U8 bytes_counter) 
 289          {
 290   1              
 291   1              DE_DATA U8 result,temp_register_address;
 292   1              temp_register_address=(U8)(register_address);
 293   1              result= I2C_Write_Bytes(EEPROM_I2C_DEVICE_ADDRESS+((U8)(register_address/128)&0x0e),
 294   1                                                    & temp_register_address,1,bufptr,bytes_counter);
 295   1             if(result!=I2C_COMMUNICATION_OK)
 296   1                      Scroll_Promote_Information("WRITE I'C COMM ERR:", result);
 297   1              Delay_xmS(10);
 298   1              return result;
 299   1      }
 300          
 301          
C51 COMPILER V8.02   I2C                                                                   10/16/2006 17:42:28 PAGE 6   

 302          
 303          void Check_EEProm_Var_Validity(void)
 304          {
 305   1      
 306   1              //Comfirm_Var_Validity
 307   1      }
 308          
 309          
 310          U8 Comfirm_Var_Validity(U8 *var_address,U8 Max_Value,U8 Min_Value, U8 Normal_Value) 
 311          {
 312   1              if( (*var_address>Max_Value)||(*var_address<Min_Value) )
 313   1              {
 314   2              *var_address=Normal_Value; 
 315   2                      return 0; 
 316   2              }
 317   1              else
 318   1                      {
 319   2                      return 1;
 320   2                      }
 321   1      }
 322          
 323          
 324          
 325          
 326          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    656    ----
   CONSTANT SIZE    =     34    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      47
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       1
   EDATA SIZE       =   ----    ----
   HDATA SIZE       =   ----    ----
   XDATA CONST SIZE =   ----    ----
   FAR CONST SIZE   =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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