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

📄 i2c.lst

📁 此程序为twell8806驱动程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 301   1      }
 302          
C51 COMPILER V7.50   I2C                                                                   08/20/2007 10:23:30 PAGE 6   

 303          void ReadI2Cmn(BYTE addr, BYTE wcnt, BYTE rcnt, BYTE *rwdata)
 304          {
 305   1              BYTE i;
 306   1      
 307   1              I2CStart();
 308   1              I2CWriteData(addr);
 309   1              for(i=0; i<wcnt; i++)
 310   1                      I2CWriteData( rwdata[i] );
 311   1      
 312   1              I2CStart();
 313   1              I2CWriteData(addr | 0x01);
 314   1              for(i=0; i<rcnt-1; i++)
 315   1                      rwdata[i] = I2CReadDataWithACK();
 316   1              rwdata[i++] = I2CReadDataWithNAK();
 317   1              I2CStop();
 318   1      }
 319          /*
 320          void ReadI2CStatusn(BYTE addr, BYTE rcnt, BYTE *rwdata)
 321          {
 322                  BYTE i;
 323          
 324          //      I2CStart();
 325          //      I2CWriteData(addr);
 326          //      for(i=0; i<wcnt; i++)
 327          //              I2CWriteData( rwdata[i] );
 328          
 329                  I2CStart();
 330                  I2CWriteData(addr | 0x01);
 331          
 332                  for(i=0; i<rcnt-1; i++)
 333                          rwdata[i] = I2CReadDataWithACK();
 334                  rwdata[i++] = I2CReadDataWithNAK();
 335                  I2CStop();
 336          }
 337          */
 338          #endif // SERIAL
 339          
 340          /*****************************************************************************/
 341          /*                                                                           */
 342          /*****************************************************************************/
 343          BYTE I2CWriteData_Wait(BYTE value)
 344          {
 345   1              WORD i;
 346   1              BYTE ack;
 347   1      
 348   1              for(i=0; i<8; i++, value<<=1) {
 349   2                      if(value & 0x80) I2C_SDA = 1;
 350   2                      else                     I2C_SDA = 0;
 351   2                      I2Cdelay();
 352   2                      I2C_SCL = 1;    I2Cdelay();
 353   2                      I2C_SCL = 0;
 354   2              }
 355   1              I2C_SDA = 1;    I2Cdelay();
 356   1              I2C_SCL = 1;    I2Cdelay();
 357   1              i=0;
 358   1          while(1) {
 359   2                      if( I2C_SCL ) break;
 360   2                      i++;
 361   2              }
 362   1      
 363   1              ack = I2C_SDA;  //I2Cdelay();
 364   1              I2C_SCL = 0;
C51 COMPILER V7.50   I2C                                                                   08/20/2007 10:23:30 PAGE 7   

 365   1              return (1-ack);
 366   1      }
 367          
 368          #ifndef QVGA
 369          void dd(void)
 370          {
 371   1      }
 372          #else
              #define dd()  I2Cdelay()
              #endif
 375          
 376          void I2CStart()
 377          {
 378   1              I2C_SDA = 1;    dd();
 379   1              I2C_SCL = 1;    dd();
 380   1              I2C_SDA = 0;    dd();
 381   1              I2C_SCL = 0;
 382   1      }
 383          
 384          void I2CStop()
 385          {
 386   1              I2C_SDA = 0;    dd();
 387   1              I2C_SCL = 1;    dd();
 388   1              I2C_SDA = 1;
 389   1      }
 390          
 391          void I2CWriteData(BYTE value)
 392          {
 393   1      /*
 394   1              int i;
 395   1      
 396   1              for(i=0; i<8; i++, value<<=1) {
 397   1                      I2C_SCL = 0;
 398   1                      I2Cdelay();     // HHY 2.04 in special case, it was unstable
 399   1                      if(value & 0x80) I2C_SDA = 1;
 400   1                      else                     I2C_SDA = 0;
 401   1                      I2Cdelay();
 402   1                      I2C_SCL = 1;
 403   1              }
 404   1      */
 405   1      
 406   1              I2C_SCL=0;      I2C_SDA=(value & 0x80)? 1:0;    I2C_SCL=1;      dd();
 407   1              I2C_SCL=0;      I2C_SDA=(value & 0x40)? 1:0;    I2C_SCL=1;      dd();
 408   1              I2C_SCL=0;      I2C_SDA=(value & 0x20)? 1:0;    I2C_SCL=1;      dd();
 409   1              I2C_SCL=0;      I2C_SDA=(value & 0x10)? 1:0;    I2C_SCL=1;      dd();
 410   1      
 411   1              I2C_SCL=0;      I2C_SDA=(value & 0x08)? 1:0;    I2C_SCL=1;      dd();
 412   1              I2C_SCL=0;      I2C_SDA=(value & 0x04)? 1:0;    I2C_SCL=1;      dd();
 413   1              I2C_SCL=0;      I2C_SDA=(value & 0x02)? 1:0;    I2C_SCL=1;      dd();
 414   1              I2C_SCL=0;      I2C_SDA=(value & 0x01)? 1:0;    I2C_SCL=1;      dd();
 415   1      
 416   1      
 417   1              I2C_SCL = 0;    // HHY 3.00
 418   1              I2C_SCL = 0;    // HHY 3.00
 419   1              I2C_SCL = 0;    //      I2Cdelay();
 420   1              I2C_SDA = 1;    //      I2Cdelay();
 421   1      
 422   1              I2C_SCL = 1;    // HHY 3.00
 423   1              I2C_SCL = 1;    // HHY 3.00
 424   1              I2C_SCL = 1;    //      I2Cdelay();
 425   1              I2C_SCL = 0;
 426   1      }
C51 COMPILER V7.50   I2C                                                                   08/20/2007 10:23:30 PAGE 8   

 427          
 428          BYTE I2CReadData()
 429          {
 430   1              int i;
 431   1              BYTE value=0;
 432   1      
 433   1              I2C_SDA = 1;    dd();
 434   1              I2C_SCL = 0;
 435   1              
 436   1              for(i=0; i<8; i++) {
 437   2                      I2C_SCL = 1;
 438   2                      value <<= 1;
 439   2                      if(I2C_SDA) value |= 1;
 440   2                      I2C_SCL = 0;
 441   2              }
 442   1              dd();
 443   1              
 444   1              I2C_SCL = 1;    // HHY 3.00
 445   1              I2C_SCL = 1;    // HHY 3.00
 446   1              I2C_SCL = 1;
 447   1              I2C_SCL = 0;
 448   1      
 449   1              return value;
 450   1      
 451   1      }
 452          
 453          BYTE I2CReadDataWithACK()
 454          {
 455   1              int i;
 456   1              BYTE value=0;
 457   1      
 458   1              I2C_SDA = 1;    I2Cdelay();
 459   1              I2C_SCL = 0;
 460   1      
 461   1              for(i=0; i<8; i++) {
 462   2                      I2C_SCL = 1;
 463   2                      value <<= 1;
 464   2                      if(I2C_SDA) value |= 1;
 465   2                      I2C_SCL = 0;
 466   2              }
 467   1              I2C_SDA = 0;    I2Cdelay();             //ack
 468   1              I2C_SCL = 1;    I2Cdelay();
 469   1              I2C_SCL = 0;
 470   1      
 471   1              return value;
 472   1      }
 473          
 474          //=============================================================================
 475          //                      Slow I2C routine for Teletext Chip
 476          //=============================================================================
 477          #ifdef SUPPORT_TELETEXT
              
              void I2Cdelay4(void)
              {
                      BYTE i;
                      for(i=0; i < 5; i++)
                              I2Cdelay();
              }
              
              void I2CStartLong(void)
              {
                      I2C_SDA = 1;    I2Cdelay4();
C51 COMPILER V7.50   I2C                                                                   08/20/2007 10:23:30 PAGE 9   

                      I2C_SCL = 1;    I2Cdelay4();
                      I2C_SDA = 0;    I2Cdelay4();
                      I2C_SCL = 0;    I2Cdelay4();
              }
              
              void I2CStopLong(void)
              {
                      I2C_SDA = 0;    I2Cdelay4();
                      I2C_SCL = 1;    I2Cdelay4();
                      I2C_SDA = 1;    I2Cdelay4();
              }
              
              void I2CWriteData_(BYTE SendData)  // Write SendData
              {
                      BYTE SendCnt;
              
                      for( SendCnt=0; SendCnt<8; SendCnt++, SendData<<=1 ) {
                              I2C_SCL = 0;
                              I2Cdelay4();
                              if(SendData & 0x80)     I2C_SDA = 1;
                              else                        I2C_SDA = 0;
                              I2Cdelay4();
                              I2C_SCL = 1;
                              I2Cdelay4();
                      }
                      I2C_SCL = 0;    I2Cdelay4();
                      I2C_SDA = 1;    I2Cdelay4();
                      I2C_SCL = 1;    
              
                      I2C_SCL = 0;    I2Cdelay4();
                                                      I2Cdelay4();
                      delay(1);
              }
              
              void WriteI2CnLong(BYTE addr, BYTE *val, BYTE cnt)
              {
                      BYTE i;//rd=1, i;
              
                      I2Cdelay4();
                      I2Cdelay4();
                      I2CStartLong();
              
                      I2CWriteData_(addr);
                      for(i=0; i<cnt; i++)
                              I2CWriteData_(*(val+i));
              
                      I2CStopLong();
              }
              #ifdef DEBUG_TELETEXT
              BYTE I2CReadDatatt(BYTE SelNack)
              {
                      int i;
                      BYTE value=0;
              
                      I2C_SDA = 1;    I2Cdelay4();
                      I2C_SCL = 0;    I2Cdelay4();
                      
                      for(i=0; i<8; i++) {
                              I2C_SCL = 1;    I2Cdelay4();
                              value <<= 1;
                              if(I2C_SDA) 
                                      value |= 1;     
C51 COMPILER V7.50   I2C                                                                   08/20/2007 10:23:30 PAGE 10  

                              I2C_SCL = 0;    I2Cdelay4();
                      }
              
                      if(SelNack == 0x01){
                              I2C_SDA = 1;    
                              I2Cdelay4();    // nack
                      }
                      else{
                              I2C_SDA = 0;    
                              I2Cdelay4();    // ack
                      }
              
                      I2C_SCL = 1;    I2Cdelay4();    
                      I2C_SCL = 0;
              
                      return value;
              }
              
              void ReadI2Ctt(BYTE addr, BYTE *ReData, BYTE cnt)
              {
                      BYTE i;
              
                      I2CStartLong();
                      I2CWriteData_(addr | 0x01);
                      
                      if(cnt != 0) {
                              for(i=0 ; i < cnt ; i++) 
                                      ReData[i] =  I2CReadDatatt(0x00);
                              ReData[i] =  I2CReadDatatt(0x01);
                      }
                      else
                              ReData[0] =  I2CReadDatatt(0x01);
              
                      I2CStopLong();
              
                      delay(1);
              
              }
              #endif
              #endif  //SUPPORT_TELETEXT
 591          
 592          


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