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

📄 at24c02.lst

📁 一个采用C8051F020芯片实现的流量计控制系统源代码
💻 LST
字号:
C51 COMPILER V8.08   AT24C02                                                               01/30/2008 22:54:20 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE AT24C02
OBJECT MODULE PLACED IN AT24C02.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.exe AT24C02.C DB OE

line level    source

   1          //参考程序A:AT24C02.C   SMBUS  24C02 读/写  2005.12.25
   2          
   3          #include <c8051f020.h>                      // SFR declarations
   4          #include <intrins.h>    
   5          #include "AT24C02.h"
   6          #include "GlobeDef.h"
   7          
   8          INT8  data  SLAW;                           // 保存从地址+ WRITE 位
   9          INT8  data  SLAR;                           // 保存从地址+ WRITE 位
  10          INT8  data  WORD,WORDADR;                   // 保存被收/发的数据字节
  11          INT8  data  nSendNums;                      // 保存被收/发的数据字节的数目        
  12          INT8U data  SENDMODE;                       // SENDMODE作读/写控制字                       
  13          bit SM_BUSY=0;                              // 忙碌标志位
  14          
  15          extern void SMBUS_ISR(void);                // 中断服务程序
  16          extern char SLA_READ(char nWordAddr, char nNumber);
  17          extern void SLA_SEND(char nWordAddr, char nWord, char nNumber);
  18          
  19          void SLA_SEND(char nWordAddr, char nWord, char nNumber)
  20          {
  21   1        SENDMODE = 0x01;
  22   1        nSendNums = nNumber + 1;
  23   1        while (SM_BUSY);                          // 若SMBUS忙碌就等待
  24   1        SM_BUSY = 1;                              // 置SM_BUSY位(忙碌标志位)为1                
  25   1        SLAW = SMB_ADDRESS | SMB_WRITE;           // COMMAND = 7 个地址位 + 一位WRITE.
  26   1        WORD = nWord;                             // WORD中存放要送到24C02中去的数据(8位)
  27   1        WORDADR = nWordAddr;                      // OP_CODE 中存放被传送数据送入24C02的首地址.
  28   1        STO = 0;
  29   1        STA = 1;                                  // 启动数据传输
  30   1        while (SM_BUSY);                          // 等待传输完成
  31   1      }
  32          
  33          char SLA_READ(char nWordAddr, char nNumber)
  34          {
  35   1        nSendNums = nNumber;
  36   1        SENDMODE = 0x00;
  37   1        while (SM_BUSY);                          // 若SMBUS忙碌就等待
  38   1        SM_BUSY = 1;                              // 置SM_BUSY位(忙碌标志位)为1 
  39   1        SLAR = SMB_ADDRESS | SMB_READ;            // COMMAND = 7 个地址位 + 一位READ
  40   1        WORDADR = nWordAddr;                      // OP_CODE 中存放从24C02读出数据的的首地址.
  41   1        STO = 0;
  42   1        STA = 1;                                  // 启动传输
  43   1        while (SM_BUSY);                          // 等待传输完成 
  44   1        return WORD;                              // 返回读出来的数据(一个字节)
  45   1      }
  46          
  47          void SMBUS_ISR (void) interrupt INT_I2C     // 中断服务程序
  48          {
  49   1        switch (SMB0STA)                          // 根据中断状态码跳转,SMB0STA 是中断状态寄存器
  50   1        {
  51   2          case SMB_START:                             // 0x08, (MT & MR) 发送起始位
  52   2            SMB0DAT = SLAW ;                      // 装入被访问的从芯片的写地址
  53   2            STA = 0;                              // 人工清除 STA 位
  54   2            SI = 0;                               // 清除中断标志位
  55   2            break;
C51 COMPILER V8.08   AT24C02                                                               01/30/2008 22:54:20 PAGE 2   

  56   2          case SMB_RP_START:                      // 0x10,(MT & MR) 重复发送起始位
  57   2            SMB0DAT = SLAR;                       // 装入被访问的从芯片的读地址
  58   2            STA = 0;                              // 人工清除 STA 位
  59   2            SI = 0;                               // 清除中断标志位
  60   2            break;
  61   2          case SMB_MTADDACK:                      // 0x18 ,(MT) 发送从地址 + W 后收到ACK
  62   2            SMB0DAT = WORDADR;
  63   2            SI = 0;                               // 清除中断标志位
  64   2            break;
  65   2          case SMB_MTADDNACK:                     // 0x20,(MT) 发送从地址 + W 后收到NACK
  66   2            STO = 1;
  67   2            STA = 1;
  68   2            SI = 0;                               // 清除中断标志位
  69   2            break;
  70   2          case SMB_MTDBACK:                           // 0x28,(MT) 发送数据后收到ACK
  71   2            switch (SENDMODE)                     // 检查低1位
  72   2            {
  73   3              case 1:
  74   3                        nSendNums--;
  75   3                        if (nSendNums)
  76   3                              SMB0DAT = WORD;
  77   3                        else
  78   3                {
  79   4                              STO = 1;
  80   4                          SM_BUSY = 0;
  81   4                    }
  82   3                break;             
  83   3              case 0:
  84   3                        STO = 0;
  85   3                STA = 1;
  86   3                break;            
  87   3              default:              
  88   3                STO = 1;
  89   3                SM_BUSY = 0;
  90   3                break;
  91   3            }
  92   2            SI = 0;
  93   2            break;
  94   2          case SMB_MTDBNACK:                      // 0x30
  95   2            STO = 1;
  96   2            STA = 1;
  97   2            SI = 0;                               // 清除中断标志
  98   2            break;
  99   2          case SMB_MRADDACK:                      // 0x40
 100   2            AA = 0;                        
 101   2            SI = 0;
 102   2            break;
 103   2              case SMB_MRADDNACK:                         // 0x48
 104   2            STO = 0;
 105   2            STA = 1;
 106   2            SI = 0;
 107   2            break;
 108   2          case SMB_MRDBNACK:                      // 0x58
 109   2            WORD = SMB0DAT;
 110   2            STO = 1;
 111   2            SM_BUSY = 0;
 112   2            AA = 1;                          
 113   2            SI = 0;
 114   2            break;
 115   2          default:
 116   2            STO = 1;
 117   2            SM_BUSY = 0;
C51 COMPILER V8.08   AT24C02                                                               01/30/2008 22:54:20 PAGE 3   

 118   2            break;
 119   2        }
 120   1      }


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