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

📄 iic24c02int.lst

📁 用于eeprom串行处理芯片的I2c总线的读写程序列表。注意时序的处理
💻 LST
字号:
C51 COMPILER V8.02   IIC24C02INT                                                           03/07/2007 21:31:32 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE IIC24C02INT
OBJECT MODULE PLACED IN IIc24c02Int.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\c51.exe IIc24c02Int.c DB OE

line level    source

   1          //参考程序A:AT24C02.C   SMBUS  24C02 读/写  2005.12.25
   2          //程序功能:在AT24C02的地址00---3FH中依次存入连续的数据10H--4FH
   3          //再依次从地址00---3FH中读出数据并通过SAA1064驱动四位数码管显示出来.
   4          //第一,二位数码管显示地址,第三,四位数码管显示存入该地址内的数据.
   5          //显示格式:
   6          //存储器的地址  存储器单元的内容
   7          //00H---3FH     40H---4FH
   8          #include "TestSerial.h"
   9          #define  WRITE       0x00                 //  SMBUS寻址字节的写标志位
  10          #define  READ        0x01                 //  SMBUS寻址字节的读标志位
  11          // Device addresses
  12          #define  CHIP_A        0xA0                //AT24C02器件自身的寻址字节
  13          //   #define  CHIP_B        0x70                //AT24C02器件自身的寻址字节
  14          #define  SMB_BUS_ERROR  0x0  //总线错误                                   SAA1064
  15            //MT为主发送器,MR为主接收器
  16          #define  SMB_START      0x08              // (MT & MR) 发送起始位
  17          #define  SMB_RP_START   0x10              // (MT & MR) 重复起始位
  18          #define  SMB_MTADDACK   0x18              // (MT) 发送从地址 + W 后收到ACK
  19          #define  SMB_MTADDNACK  0x20              // (MT) 发送从地址 + W 后收到NACK
  20          #define  SMB_MTDBACK    0x28              // (MT) 发送数据后收到ACK
  21          #define  SMB_MTDBNACK   0x30              // (MT) 发送数据后收到NACK
  22          #define  SMB_MTARBLOST  0x38              //(MT)竞争失败
  23          #define  SMB_MRADDACK   0x40              // (MR) 发送从地址 + R 后收到 ACK
  24          #define  SMB_MRADDNACK  0x48              // (MR) 发送从地址 + R 后收到 NACK
  25          #define  SMB_MRDACK     0x50              // (MR) 收到数据字节 后已发送ACK                                
             -    
  26          #define  SMB_MRDBNACK   0x58              // (MR) 收到数据字节 后已发送NACK      
  27          char xdata DATA0[6]={0x17,0x3f,0x06,0x5b,0x4f}; 
  28          char xdata DATA2[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  29          char SLAW,DATA1[64];                    // 保存从地址+ WRITE 位
  30          char SLAR;                              // 保存从地址+ WRITE 位
  31          char WORD,WORDADR;                      // 保存被收/发的数据字节
  32          char xdata sendnumber;                  // 保存被收/发的数据字节的数目        
  33          //unsigned char xdata  WORDADR;         //保存被传送的数据在24C02中的首地址.
  34          unsigned char xdata SENDMODE;           //SENDMODE作读/写控制字                       
  35          unsigned char xdata  i,j,k,sla,n,m,p;
  36          bit SM_BUSY;           //忙碌标志位                                        void sleep_ms( unsigned int cou
             -nt);       //延时
  37          //void DISPLAY(void);                       //通过SAA1064驱动四位数码管显示
  38          void SMBUS_ISR (void);                    //中断服务程序
  39          char SLA_READ(char chip,char wordadr,char number);
  40          void SLA_SEND(char chip,char wordadr, char word,char number);
  41          //void sleep_ms(unsigned int count);
  42          void IIC_Int(void)
  43          {
  44   1      //   unsigned char check;              // 测试用的工作变量
  45   1      //   XBR0 = 0x01;                           // 选交叉开关       :P0.0-->SDA,P0.1-->CLK
  46   1      //   XBR2 = 0x40;                           // 交叉开关使能
  47   1         SMB0CN = 0x44;                         // 允许SMBUS, 应答返回AA(低电平
  48   1         SMB0CR = 0xc9;                   // SMBus 速率= 100 kHz,系统时钟为11.0592MHZ
  49   1         EIE1 |= 2;                             // SMBus 中断使能
  50   1      // EA = 1;                                // 开中断
  51   1         SM_BUSY = 0;                           //  SM_BUSY是忙碌标志位
  52   1         SI = 0;                                //SM_BUSY中断标志位
  53   1      //写64个连续的数据到AT24C02中去并依次存放.
C51 COMPILER V8.02   IIC24C02INT                                                           03/07/2007 21:31:32 PAGE 2   

  54   1      //64个连续的数据的存放地址:00H--3fH.第一个数为10H,最后一个数为4FH.
  55   1      /*
  56   1         i=0x10;
  57   1         sla=CHIP_A;
  58   1        for  (j=0;j<0x40;j++)            //向24C02的000地址依次写入64个数据,
  59   1        {                                //64个数据的数值从10H---4FH   
  60   1         SLA_SEND(sla, j, i,0x01);       // 写入AT24C02
  61   1         i++;
  62   1         }
  63   1        for  (j=0;j<0x40;j++)          //从24C02的00地址依次连续读出64个数据,
  64   1        {                              //64个数据的数值应该是从10H---3FH(连续存放)
  65   1         check=SLA_READ(sla, j,0x01);     
  66   1         DATA1[j]=check;               //读出来的数据依次连续存入数组DATA[]中
  67   1         }
  68   1         for  (j=0;j<0x40;j++)     //把要显示的两位地址和两位数据存入DATA2[]中           
  69   1        { i=DATA1[j];              
  70   1          k=i&0x0f;
  71   1              m=DATA2[k];              //j为地址,i=DATA1[j]=check,i地址j中存放的数据
  72   1              DATA0[4]=m;
  73   1              k=i&0xf0;
  74   1              k=k>>4;
  75   1          n=DATA2[k];
  76   1              DATA0[3]=n;
  77   1          k=j&0x0f;
  78   1              m=DATA2[k];
  79   1              DATA0[2]=m;
  80   1              k=j&0xf0;
  81   1              k=k>>4;
  82   1          n=DATA2[k];
  83   1              DATA0[1]=n;
  84   1      //      DISPLAY();
  85   1       for (i=0; i < 256; i++) ; 
  86   1      
  87   1          sleep_ms(1000);
  88   1              } 
  89   1         while(1);*/
  90   1       }
  91          
  92          
  93          /*void  DISPLAY (void)
  94          {
  95            sla=CHIP_B;
  96                  DATA0[0]=0x17;              //0x17是SAA1064的控制字.
  97            for  (p=0;p<0x5;p++)
  98            {i=DATA0[p];                 //向SAA1064写入五个数:SAA1064的控制字一字节,
  99            SLA_SEND(sla, p, i,0x01);     // 地址2字节,数据2字节.共五字节
 100          }
 101          }
 102          
 103          */
 104          
 105          
 106          void SLA_Send_String(unsigned char idata *ch)
 107          {
 108   1        sla=CHIP_A;
 109   1        ch=0;
 110   1        for  (j=0;j<0x20;j++)            //向24C02的000地址依次写入64个数据,
 111   1        {                                //64个数据的数值从10H---4FH   
 112   2         SLA_SEND(sla, j, ch[j],0x01);       // 写入AT24C02
 113   2         i++;
 114   2         }
 115   1      }
C51 COMPILER V8.02   IIC24C02INT                                                           03/07/2007 21:31:32 PAGE 3   

 116          void SLA_SEND(unsigned char idata chip, unsigned char idata wordadr, unsigned char idata word,unsigned cha
             -r idata number)
 117          {
 118   1        SENDMODE=0x01;
 119   1         sendnumber=number+1;
 120   1         while(SM_BUSY);               // 若SMBUS忙碌就等待
 121   1         SM_BUSY = 1;                  // 置SM_BUSY位(忙碌标志位)为1                
 122   1         SLAW = (chip| WRITE);         // COMMAND = 7 个地址位 + 一位WRITE.
 123   1         WORD = word;                  // WORD中存放要送到24C02中去的数据(8位)
 124   1         WORDADR = wordadr;            // OP_CODE 中存放被传送数据送入24C02的首地址.
 125   1         STO = 0;
 126   1         STA = 1;                         // 启动数据传输
 127   1         while(SM_BUSY);                  // 等待传输完成
 128   1      }
 129          char SLA_READ(unsigned char idata chip, unsigned char idata wordadr,unsigned char idata number){
 130   1         sendnumber=number;
 131   1        SENDMODE=0;
 132   1         while(SM_BUSY);                  // 若SMBUS忙碌就等待
 133   1         SM_BUSY = 1;                     // 置SM_BUSY位(忙碌标志位)为1 
 134   1         SLAR = (chip| READ);             // COMMAND = 7 个地址位 + 一位READ
 135   1         WORDADR = wordadr;                // OP_CODE 中存放从24C02读出数据的的首地址.
 136   1         STO = 0;
 137   1         STA = 1;                          // 启动传输
 138   1         while(SM_BUSY);                   // 等待传输完成 
 139   1         return WORD;                      //返回读出来的数据(一个字节)
 140   1      }
 141          void SMBUS_ISR (void) interrupt 7    //中断服务程序
 142          {
 143   1         switch (SMB0STA){                 // 根据中断状态码跳转
 144   2                                           //(SMB0STA 是中断状态寄存器)
 145   2             case SMB_START:               //0x08, (MT & MR) 发送起始位
 146   2               SMB0DAT = SLAW ;            // 装入被访问的从芯片的写地址
 147   2               STA = 0;                    // 人工清除 STA 位
 148   2               SI = 0;                     // 清除中断标志位
 149   2               break;
 150   2             case SMB_RP_START:                //0x10,(MT & MR) 重复发送起始位
 151   2               SMB0DAT = SLAR;             // 装入被访问的从芯片的读地址
 152   2               STA = 0;                    // 人工清除 STA 位
 153   2               SI = 0;                     // 清除中断标志位
 154   2               break;
 155   2             case SMB_MTADDACK:            //0x18 ,(MT) 发送从地址 + W 后收到ACK
 156   2               SMB0DAT = WORDADR;
 157   2               SI = 0;                     // 清除中断标志位
 158   2               break;
 159   2             case SMB_MTADDNACK:          //0x20,(MT) 发送从地址 + W 后收到NACK
 160   2               STO = 1;
 161   2               STA = 1;
 162   2               SI = 0;                    // 清除中断标志位
 163   2               break;
 164   2            case SMB_MTDBACK:                 //0x28,(MT) 发送数据后收到ACK
 165   2               switch (SENDMODE){         // 检查低1位
 166   3             case 1:
 167   3                                 sendnumber--;
 168   3                                 if(sendnumber)
 169   3                                 SMB0DAT = WORD;
 170   3                                 else{
 171   4                                              STO=1;
 172   4                                              SM_BUSY=0;
 173   4                                      }
 174   3                    break;             
 175   3             case 0:
 176   3                                   STO = 0;
C51 COMPILER V8.02   IIC24C02INT                                                           03/07/2007 21:31:32 PAGE 4   

 177   3                     STA = 1;
 178   3                     break;            
 179   3             default:              
 180   3                     STO = 1;
 181   3                     SM_BUSY = 0;
 182   3                     break;
 183   3               }
 184   2               SI = 0;
 185   2               break;
 186   2            case SMB_MTDBNACK:        //0x30
 187   2               STO = 1;
 188   2               STA = 1;
 189   2               SI = 0;                          // 清除中断标志
 190   2               break;
 191   2            case SMB_MRADDACK:        //0x40
 192   2               AA = 0;                        
 193   2               SI = 0;
 194   2               break;
 195   2                case SMB_MRADDNACK:   //0x48
 196   2               STO = 0;
 197   2               STA = 1;
 198   2               SI = 0;
 199   2               break;
 200   2           case SMB_MRDBNACK:     //0x58
 201   2               WORD = SMB0DAT;
 202   2               STO = 1;
 203   2               SM_BUSY = 0;
 204   2               AA = 1;                          
 205   2               SI = 0;
 206   2               break;
 207   2            default:
 208   2               STO = 1;
 209   2               SM_BUSY = 0;
 210   2               break;
 211   2            }
 212   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    291    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =     31    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     68       5
   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 + -