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

📄 i2c.lst

📁 单片机C语言程序设计.日历时钟用液晶显示
💻 LST
字号:
C51 COMPILER V8.05a   I2C                                                                  08/04/2007 17:18:56 PAGE 1   


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

line level    source

   1          #include <c8051f020.h>
   2          //------------------------------------------------------------------------------------
   3          // Global CONSTANTS
   4          //------------------------------------------------------------------------------------
   5          
   6          #define         WRITE   0x00                                            // SMBus WRITE command
   7          #define         READ    0x01                                            // SMBus READ command
   8          
   9          //SMBus状态:MT=主发送器;MR=主接受器
  10          #define SMB_BUS_ERROR   0x00                    // (所以模式)总线错
  11          #define SMB_START               0x08                    // (主发送器和主接受器)开始条件已发送
  12          #define SMB_RP_START    0x10                    // (主发送器和主接受器)重复开始条件已发送
  13          #define SMB_MTADDACK    0x18                    // (主发送器)从地址+W 已发送,收到ACK                                                                 
  14          #define SMB_MTADDNACK   0x20                    // (主发送器)从地址+W 已发送,收到NACK                                                                
  15          #define SMB_MTDBACK             0x28                    // (主发送器)数据字节已发送,收到ACK
  16          #define SMB_MTDBNACK    0x30                    // (主发送器)数据字节已发送,收到NACK
  17          #define SMB_MTARBLOST   0x38                    // (主发送器)竞争失败
  18          #define SMB_MRADDACK    0x40                    // (主接受器)从地址+R已发送,收到ACK                                                                  
  19          #define SMB_MRADDNACK   0x48                    //      (主接受器)从地址+R已发送,收到NACK                                                                            
  20          #define SMB_MRDBACK             0x50                    //       (主接受器)数据字节已收到,ACK已发出
  21          #define SMB_MRDBNACK    0x58                    //       (主接受器)数据字节已收到,NACK已发出
  22          
  23          //--------------------------------------------------------------------
  24          //全局变量
  25          //--------------------------------------------------------------------
  26          unsigned char COMMAND;                  // 在SMBus 中断服务程序中用于
  27                                                                          // 保存从地址+ R/W 位。
  28          unsigned char *I2CDataBuff;             // 保持SMBus 要发送的数据字节                           
  29                                                                          // 或刚收到的数据
  30          unsigned char NByte;                    // 数据字节数
  31                                                                          // 高地址字节、低地址字节或数据字节
  32          unsigned char HIGH_ADD, LOW_ADD;// EEPROM 存储器地址的高、低字节
  33          bit SM_BUSY;                                    // 该位在发送或接收开始时被置1,
  34                                                                          // 操作结束后由中断服务程序清0
  35          bit Attrib;                                             // 地址字节数 1为双字节,0为单字节
  36          
  37          //------------------------------------------------------------------------------------
  38          // Function PROTOTYPES
  39          //------------------------------------------------------------------------------------
  40          
  41          void SMBus0_Init(void)
  42          {
  43   1              SMB0CN = 0x44;                          // 允许SMBus 在应答周期发送ACK
  44   1              SMB0CR = -80;                           // SMBus 时钟频率= 100kHz.
  45   1              EIE1 |= 2;                                      // SMBus 中断允许
  46   1              EA = 1;                                         // 全局中断允许
  47   1              SM_BUSY = 0;                            // 为第一次传输释放SMBus。
  48   1      }
  49          
  50          // SMBus 中断服务程序
  51          void SMBUS_ISR (void) interrupt 7
  52          {
  53   1                                     // SMBus 状态码(SMB0STA 寄存器)
  54   1              switch (SMB0STA)
  55   1              {       
C51 COMPILER V8.05a   I2C                                                                  08/04/2007 17:18:56 PAGE 2   

  56   2                                   // 主发送器/接收器:起始条件已发送
  57   2                                   // 在该状态发送的COMMAND 字的R/W 位总是为0(W),
  58   2                                   // 因为对于读和写操作来说都必须先写存储器地址。
  59   2                      case SMB_START:
  60   2                              SMB0DAT = (COMMAND & 0xFE); // 装入要访问的从器件的地址
  61   2                              STA = 0;                                        // 手动清除START 位
  62   2                              break;
  63   2                                  // 主发送器/接收器:重复起始条件已发送。
  64   2                                  // 该状态只应在读操作期间出现,在存储器地址已发送并得到确认之后
  65   2                      case SMB_RP_START:
  66   2                              SMB0DAT = (COMMAND | 0x01);     // COMMAND 中应保持从地址 + R.
  67   2                              STA = 0;
  68   2                              break;
  69   2                                  // 主发送器: 从地址+ WRITE 已发送,收到ACK。
  70   2                      case SMB_MTADDACK:
  71   2                              SMB0DAT = HIGH_ADD;
  72   2                              break;  
  73   2                                 // 主发送器: 数据字节已发送         收到ACK
  74   2                      case SMB_MTDBACK:
  75   2                              if( Attrib )                      // 如果为 2 字节地址
  76   2                              {
  77   3                                      Attrib  = 0;              // 清标志位
  78   3                                      SMB0DAT = LOW_ADD;        // 发低字节地址
  79   3                                      break;
  80   3                              }
  81   2                              else if( COMMAND & 0x01 ) // 如果为读操作
  82   2                              {
  83   3                                      STA = 1;                          // 重复起始条件
  84   3                                      break;
  85   3                              }
  86   2                              else if( NByte )                  // 如果未写完数据,继续写直到NByte=0;
  87   2                              {
  88   3                                      SMB0DAT = *I2CDataBuff;
  89   3                                      I2CDataBuff++;
  90   3                                      NByte--;                        
  91   3                                      break;
  92   3                              }
  93   2                              else
  94   2                              {
  95   3                                      STO = 1;        
  96   3                                      SM_BUSY = 0;              
  97   3                              }
  98   2                              break;
  99   2                                            // 主发送器 从地址 + WRITE 已发送 收到NACK
 100   2                                            // 从器件不应答发送STOP + START 重试
 101   2                      case SMB_MTADDNACK:
 102   2                                            // 主发送器 数据字节已发送        收到NACK
 103   2                                            // 从器件不应答发送STOP + START 重试
 104   2                      case SMB_MTDBNACK:
 105   2                                            // 主发送器竞争失败
 106   2                                            // 不应出现如果出现重新开始传输过程
 107   2                      case SMB_MTARBLOST:
 108   2                              STO = 1;                        
 109   2                              STA = 1;
 110   2                              break;
 111   2                                           // 主接收器从地址 + READ 已发送,收到ACK
 112   2                      case SMB_MRADDACK:
 113   2                              AA = 1;                      // 在应答周期ACK
 114   2                              if (!NByte)
 115   2                              {       
 116   3                                      STO = 1;        
 117   3                                      SM_BUSY = 0;                     // 释放SMBus
C51 COMPILER V8.05a   I2C                                                                  08/04/2007 17:18:56 PAGE 3   

 118   3                              }
 119   2                              break;
 120   2                                             // 主接收器从地址 + READ 已发送收到NACK
 121   2                                             // 从器件不应答发送重复起始条件重试
 122   2                      case SMB_MRADDNACK:
 123   2                              STA = 1;
 124   2                              break;                             
 125   2                                              // 收到数据字节ACK 已发送
 126   2                                              // 该状态不应出现因为AA 已在前一状态被清0 如果出现发送停止条件
 127   2                      case SMB_MRDBACK:
 128   2                              if ( NByte )
 129   2                              {
 130   3                                      *I2CDataBuff = SMB0DAT;         
 131   3                                      I2CDataBuff++;
 132   3                                      NByte--;                        
 133   3                              }
 134   2                              if (!NByte)     
 135   2                                      AA= 0;
 136   2                              break;
 137   2                                              // 收到数据字节 NACK 已发送
 138   2                                              // 读操作已完成读数据寄存器后发送停止条件
 139   2                      case SMB_MRDBNACK:
 140   2                              STO = 1;
 141   2                              SM_BUSY = 0;               // 释放SMBus
 142   2                              break;
 143   2      // 在本应用中所有其它状态码没有意义通信复位
 144   2                      default:
 145   2                              STO = 1;                   // 通信复位
 146   2                              SM_BUSY = 0; 
 147   2                              break;
 148   2                      }
 149   1              SI=0;                              // 清除中断标志
 150   1      }
 151          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    227    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      7    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      2    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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