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

📄 eeprom.lst

📁 中颖单片机的基础驱动程序源代码eeprom
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.50   EEPROM                                                                06/20/2008 15:40:18 PAGE 4   

 179          bit     IICWriteByte(Byte zI2CByteData)
 180          {
 181   1                      Byte zI2CBit;
 182   1                      bit  zI2CAck=0;
 183   1                      SDA_PINCR |= SDA;                                               //SDA output to write bit 1~8 to slave                  
 184   1                      for( zI2CBit =8;zI2CBit>0;zI2CBit-- )
 185   1                      {
 186   2                              zI2CByteData *=2;
 187   2                              if(CY)          
 188   2                              {       
 189   3                                      SDA_PIN =1;             //send Bit1     
 190   3                              }       
 191   2                              else
 192   2                              {
 193   3                                      SDA_PIN =0;             //send Bit0
 194   3                              }                       
 195   2                              IICDelay();
 196   2                              SCL_PIN=1;
 197   2                              IICDelay();
 198   2                              SCL_PIN=0;
 199   2                      }                                                                                                       
 200   1                      SDA_PIN=1;                              //SDA input to read ACK from slave      
 201   1                      SDA_PINCR &= ~SDA;                      
 202   1                      IICDelay();
 203   1                      SCL_PIN=1;
 204   1                      zI2CAck =  ~SDA_PIN;    
 205   1                      IICDelay();
 206   1                      SCL_PIN =0;             
 207   1                      return zI2CAck; 
 208   1      }       
 209          /*------------------------------------------------------------------------------------------
 210          ;                                                               IICCheckBusBusy
 211          ;return 1 if idle,return 0 if busy
 212          ;-----------------------------------------------------------------------------------------*/
 213          bit IICCheckBusBusy(void)
 214          {
 215   1              SDA_PINCR &= ~SDA;
 216   1              SCL_PINCR &= ~SCL;
 217   1              SDA_PIN=1;
 218   1              SCL_PIN=1;      
 219   1              if(SDA_PIN && SCL_PIN)
 220   1              {
 221   2                      return 1;
 222   2              }
 223   1              return 0;
 224   1      }
 225          /*------------------------------------------------------------------------------------------
 226          ;                                                               EEPROMWrite
 227          ;return 1 if communication success,return 0 if failure
 228          ;-----------------------------------------------------------------------------------------*/
 229          bit     EEPROMWrite(Byte *zI2Cptr,Word zI2CByteAddr,Byte zI2CCounter)
 230          {
 231   1              bit      zI2CError=0;
 232   1              Byte zI2CDevAddrH = (((zI2CByteAddr>>8)*2)&0x0f) | Bin(10100000);
 233   1              Byte zI2CDevAddrL = zI2CByteAddr & 0xff;
 234   1              Byte zI2CRepeat  = I2CFAILTIMES;        
 235   1      
 236   1              while(zI2CCounter!=0)
 237   1              {
 238   2                      if(_testbit_(zI2CError))                                                        //comunication error and retry
 239   2                      {
 240   3                              IICStop();
C51 COMPILER V7.50   EEPROM                                                                06/20/2008 15:40:18 PAGE 5   

 241   3                              IICDelayStop(); 
 242   3                              zI2CRepeat--;                   
 243   3                              if( zI2CRepeat==0 )
 244   3                              {
 245   4                                      return 0;
 246   4                              }
 247   3                      }
 248   2                      if( ! IICCheckBusBusy())                                                        //1.check bus stable
 249   2                      {
 250   3                              zI2CError = 1;                  //mark error flag
 251   3                              continue;
 252   3                      }                                       
 253   2                      IICInit();              
 254   2                      IICStart();                                                                                     //2.start
 255   2                      if(! IICWriteByte(zI2CDevAddrH) )                                       //3.command to write    
 256   2                      {
 257   3                              zI2CError = 1;                  //mark error flag
 258   3                              continue;       
 259   3                      }               
 260   2                      if(! IICWriteByte(zI2CDevAddrL))                                        //4.write address
 261   2                      {
 262   3                              zI2CError = 1;                  //mark error flag
 263   3                              continue;               
 264   3                      }                                                                       
 265   2                      do                                                                                                      //5.write serial bytes
 266   2                      {
 267   3                              if( ! IICWriteByte(*zI2Cptr) )
 268   3                              {
 269   4                                      zI2CError = 1;          //mark error flag
 270   4                                      break;          
 271   4                              }                       
 272   3                              zI2CCounter--;                  //prepare to write next byte                                            
 273   3                              zI2Cptr++;
 274   3                              zI2CDevAddrL ++;
 275   3                              if(zI2CCounter == 0)
 276   3                              {
 277   4                                      IICStop();                      //finished all bytes written
 278   4                                      IICDelayStop();                 
 279   4                                      return 1;       
 280   4                              }
 281   3                              if(!(zI2CDevAddrL&PAGE_OVER_ROLL))      
 282   3                              {
 283   4                                      IICStop();                      //switch to next page and continue to write rest bytes
 284   4                                      IICDelayStop(); 
 285   4                                      break;
 286   4                              }
 287   3                      }while(zI2CCounter>0);          
 288   2              }
 289   1      }
 290          /*------------------------------------------------------------------------------------------
 291          ;                                                               EEPROMRead
 292          ;return 1 if communication success,return 0 if failure
 293          ;-----------------------------------------------------------------------------------------*/
 294          bit     EEPROMRead(Byte *zI2Cptr,Word zI2CByteAddr,Byte zI2CCounter)
 295          {
 296   1              bit      zI2CError=0;
 297   1              Byte zI2CDevAddrH = (((zI2CByteAddr>>8)*2)&0x0f) | Bin(10100000);
 298   1              Byte zI2CDevAddrL = zI2CByteAddr & 0xff;
 299   1              Byte zI2CRepeat  = I2CFAILTIMES;        
 300   1              while(zI2CCounter!=0)
 301   1              {
 302   2                      if(_testbit_(zI2CError))                                                        //comunication error and retry
C51 COMPILER V7.50   EEPROM                                                                06/20/2008 15:40:18 PAGE 6   

 303   2                      {
 304   3                              IICStop();
 305   3                              IICDelayStop(); 
 306   3                              zI2CRepeat--;                   
 307   3                              if( zI2CRepeat==0 )
 308   3                              {
 309   4                                      return 0;
 310   4                              }
 311   3                      }
 312   2                      if( ! IICCheckBusBusy())                                                        //1.check bus stable
 313   2                      {
 314   3                              zI2CError = 1;                  //mark error flag
 315   3                              continue;
 316   3                      }       
 317   2                      IICInit();                                      
 318   2                      IICStart();                                                                                     //2.start
 319   2                      if(! IICWriteByte(zI2CDevAddrH) )                                       //3.command to write    
 320   2                      {
 321   3                              zI2CError = 1;                  //mark error flag
 322   3                              continue;       
 323   3                      }               
 324   2                      if(! IICWriteByte(zI2CDevAddrL))                                        //4.write address
 325   2                      {
 326   3                              zI2CError = 1;                  //mark error flag
 327   3                              continue;               
 328   3                      }               
 329   2                      IICInit();                                                      
 330   2                      IICStart();                                                                                     //5.command to read
 331   2                      if(! IICWriteByte(zI2CDevAddrH | Bin(00000001)))
 332   2                      {
 333   3                              zI2CError = 1;                  //mark error flag
 334   3                              continue;       
 335   3                      }               
 336   2                      do                                                                                                      //6.read serial bytes                                   
 337   2                      {
 338   3                              zI2CCounter--;                                                                  
 339   3                              *zI2Cptr = IICReadByte(zI2CCounter);                    
 340   3                              zI2Cptr++;
 341   3                              zI2CDevAddrL ++;                
 342   3                      }while(zI2CCounter>0);          
 343   2                      IICStop();
 344   2                      IICDelayStop();                 
 345   2                      return 1;
 346   2              }
 347   1      }
 348          
 349          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    523    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      15
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       3
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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