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

📄 i2c.lst

📁 c8051单片机程序包,keil C编写
💻 LST
📖 第 1 页 / 共 3 页
字号:
 436   3                                      break;
 437   3                              default:
 438   3                                      break;
 439   3                      }
 440   2                      WaitKeyOff();
 441   2                      GetRealClock();
 442   2                      LCD_DispChar(0,2,RealTime.RT.Hour/16); //128*64  取值x=0-128 y=0-8
 443   2                      LCD_DispChar(8,2,RealTime.RT.Hour%16);
 444   2                      LCD_DispChar(24,2,RealTime.RT.Minute/16);
 445   2                      LCD_DispChar(32,2,RealTime.RT.Minute%16);
 446   2                      LCD_DispChar(48,2,RealTime.RT.Second/16);
 447   2                      LCD_DispChar(56,2,RealTime.RT.Second%16);
 448   2                      //在0,4处显示02/01/01
 449   2                      LCD_DispChar(0,4,RealTime.RT.Year/16); 
 450   2                      LCD_DispChar(8,4,RealTime.RT.Year%16);
 451   2                      LCD_DispChar(24,4,RealTime.RT.Month/16);
 452   2                      LCD_DispChar(32,4,RealTime.RT.Month%16);
 453   2                      LCD_DispChar(48,4,RealTime.RT.Day/16);
 454   2                      LCD_DispChar(56,4,RealTime.RT.Day%16);
 455   2                      Delay1ms(100);  
 456   2              }
 457   1      }
 458          
 459          //------------------------------------------------------------------------------------
 460          // Interrupt Service Routine
 461          //------------------------------------------------------------------------------------
 462          void SMBUS_ISR (void) interrupt 7
 463          {
 464   1              switch (SMB0STA)
 465   1                      {       // SMBus 状态码SMB0STA 寄存器
 466   2                              // 主发送器/接收器起始条件已发送
 467   2                      case SMB_START:
 468   2                              SMB0DAT = COMMAND ; // 装入要访问的从器件的地址
 469   2                              STA = 0;                        // 手动清除START 位
 470   2                              break;
 471   2                              //主发送器/接收器重复起始条件已发送
 472   2                              // 该状态只应在读操作期间出现在存储器地址已发送并得到确认之后 ?
 473   2                      case SMB_RP_START:
 474   2                              SMB0DAT = COMMAND; // COMMAND 中应保持从地址 + R.
 475   2                              STA = 0;
 476   2                              break;
 477   2                              // 主发送器从地址 + WRITE 已发送收到ACK
 478   2                      case SMB_MTADDACK:
 479   2                              // 主发送器数据字节已发送收到ACK
 480   2                      case SMB_MTDBACK:
 481   2                              if (BYTE_NUMBER)
 482   2                              {
 483   3                                              SMB0DAT = revolve(*I2CDataBuff);                                        // If R/W=WRITE, load byte to write.
 484   3                                              I2CDataBuff++;
 485   3                                              BYTE_NUMBER--;                  
 486   3                              }
 487   2                              else
 488   2                              {
 489   3                                      STO = 1;        SM_BUSY = 0;                                            // Free SMBus
C51 COMPILER V7.02b   I2C                                                                  12/21/2002 22:32:37 PAGE 9   

 490   3                              }
 491   2                              break;
 492   2                              // 主发送器从地址 + WRITE 已发送收到NACK
 493   2                              // 从器件不应答发送STOP + START 重试
 494   2                      case SMB_MTADDNACK:
 495   2                              STO = 1;                        STA = 1;
 496   2                      break;
 497   2                              // 主发送器数据字节已发送收到NACK
 498   2                              // 从器件不应答发送STOP + START 重试
 499   2                      case SMB_MTDBNACK:
 500   2                              STO = 1;                        STA = 1;
 501   2                      break;
 502   2                              // 主发送器竞争失败
 503   2                              // 不应出现如果出现重新开始传输过程
 504   2                      case SMB_MTARBLOST:
 505   2                              STO = 1;                        STA = 1;
 506   2                      break;
 507   2      
 508   2                              // 主接收器从地址 + READ 已发送,收到ACK
 509   2                      case SMB_MRADDACK:
 510   2                              AA = 1; // 在应答周期ACK
 511   2                              if (!BYTE_NUMBER)
 512   2                              {       
 513   3                                      STO = 1;        SM_BUSY = 0; // 释放SMBus
 514   3                              }
 515   2                      break;
 516   2                              // 主接收器从地址 + READ 已发送收到NACK
 517   2                              // 从器件不应答发送重复起始条件重试
 518   2                      case SMB_MRADDNACK:
 519   2                              STA = 1;
 520   2                      break;
 521   2                              // 收到数据字节ACK 已发送
 522   2                              // 该状态不应出现因为AA 已在前一状态被清0 如果出现发送停止条件
 523   2                      case SMB_MRDBACK:
 524   2                              if (BYTE_NUMBER)
 525   2                              {
 526   3                                      *I2CDataBuff=revolve(SMB0DAT);          
 527   3                                      I2CDataBuff++;
 528   3                                      BYTE_NUMBER--;                  
 529   3                              }
 530   2                              if (!BYTE_NUMBER)       AA= 0;
 531   2                      break;
 532   2                              // 收到数据字节NACK 已发送
 533   2                              // 读操作已完成读数据寄存器后发送停止条件
 534   2                      case SMB_MRDBNACK:
 535   2                              STO = 1;
 536   2                              SM_BUSY = 0; // 释放SMBus
 537   2                      break;
 538   2                              // 在本应用中所有其它状态码没有意义通信复位
 539   2                      default:
 540   2                              STO = 1; // 通信复位
 541   2                              SM_BUSY = 0; 
 542   2                      break;
 543   2                      }
 544   1              SI=0; // 清除中断标志
 545   1      }
 546          /*
 547          {
 548                  switch (SMB0STA){                       // Status code for the SMBus (SMB0STA register)
 549                          case SMB_START:                                 
 550                                  SMB0DAT = COMMAND;                                      // COMMAND should hold slave address + R.
 551                                  break;
C51 COMPILER V7.02b   I2C                                                                  12/21/2002 22:32:37 PAGE 10  

 552                          case SMB_MTADDNACK:
 553                                  STO = 1;
 554                                  STA = 1;
 555                                  break;
 556                          case SMB_RP_START:
 557          //                      SMB0DAT = COMMAND;                                      // COMMAND should hold slave address + R.
 558          //                      STA = 0;                                                                                        
 559          //                      break;
 560                          case SMB_MTADDACK:
 561                          case SMB_MTDBACK:
 562                                  if (BYTE_NUMBER)
 563                                  {
 564                                                  if (COMMAND & 0x01)                                     // If R/W=READ, 
 565                                                  {
 566                                                          STA = 1;
 567                                                  }
 568                                                  else
 569                                                  {
 570                                                          SMB0DAT = *I2CDataBuff;                                 // If R/W=WRITE, load byte to write.
 571                                                          I2CDataBuff++;
 572                                                          BYTE_NUMBER--;                  
 573                                                  }
 574                                  }
 575                                  else
 576                                  {
 577                                          STO = 1;
 578                                          SM_BUSY = 0;                                            // Free SMBus
 579                                  }
 580                                  break;
 581                          
 582                          // Master Transmitter: Data byte transmitted.  NACK received.
 583                          // Slave not responding.  Send STOP followed by START to try again.
 584                          case SMB_MTDBNACK:
 585                                  STO = 1;
 586                                  STA = 1;
 587                                  break;
 588                          
 589                          // Master Transmitter: Arbitration lost.
 590                          // Should not occur.  If so, restart transfer.
 591                          case SMB_MTARBLOST:
 592                                  STO = 1;
 593                                  STA = 1;
 594                                  break;
 595          
 596                          // Master Receiver: Slave address + READ transmitted.  NACK received.
 597                          // Slave not responding.  Send repeated start to try again.
 598                          case SMB_MRADDNACK:
 599                                  STA = 1;
 600                                  break;
 601          
 602                          // Data byte received.  ACK transmitted.
 603                          // State should not occur because AA is set to zero in previous state.
 604                          // Send STOP if state does occur.
 605                          case SMB_MRDBACK:
 606                                  STO = 1;
 607                                  SM_BUSY = 0;
 608                                  break;
 609          
 610                          // Master Receiver: Slave address + READ transmitted.  ACK received.
 611                          // Set to transmit NACK after next transfer since it will be the last (only) byte.
 612                          case SMB_MRADDACK:
 613          //                      AA = 0;                                                                         // NACK sent on acknowledge cycle.
C51 COMPILER V7.02b   I2C                                                                  12/21/2002 22:32:37 PAGE 11  

 614          //                      break;
 615          
 616                          // Data byte received.  NACK transmitted.
 617                          // Read operation has completed.  Read data register and send STOP.
 618                          case SMB_MRDBNACK:
 619                                  if (BYTE_NUMBER)
 620                                  {
 621                                                  if (COMMAND & 0x01)                                     // If R/W=READ, 
 622                                                  {
 623                                                          *I2CDataBuff=SMB0DAT;           
 624                                                          I2CDataBuff++;
 625                                                  }
 626                                                  BYTE_NUMBER--;                  
 627                                  }
 628                                  else
 629                                  {
 630                                          STO = 1;
 631                                          SM_BUSY = 0;                                            // Free SMBus
 632                                  }
 633                                  break;
 634                          // All other status codes meaningless in this application. Reset communication.
 635                          default:
 636                                  STO = 1;                                                                                // Reset communication.
 637                                  SM_BUSY = 0;
 638                                  break;
 639                          }
 640                  
 641                  SI=0;                                                                                                   // clear interrupt flag
 642          }
 643          */


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1639    ----
   CONSTANT SIZE    =    160    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     32    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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