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

📄 24lc256_1.lst

📁 这是一个产品的开发项目(基本程序)。有按键计算
💻 LST
字号:
C51 COMPILER V7.50   24LC256_1                                                             01/03/2009 10:56:05 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE 24LC256_1
OBJECT MODULE PLACED IN 24LC256_1.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE SRC\24LC256_1.c BROWSE DEBUG OBJECTEXTEND PRINT(.\24LC256_1.lst) OBJECT(24L
                    -C256_1.obj)

line level    source

   1          
   2                                                          /*
   3                                                          unsigned char idata v_pag10_=35;
   4          unsigned char idata v_pag11_=90;
   5          unsigned char idata v_pag20_=49;
   6          unsigned char idata v_pag21_=49;
   7          unsigned char idata v_pag22_=30;
   8          unsigned char idata v_pag23_=90;
   9                                                          */
  10                      /* 以下为AT24C01~AT24C256的读写程序,各人可根据自己的需要应用。
  11                      在buf1中填入需要写入的内容,buf2的大小可根据需要定义。
  12                      addr可根据使用的芯片选择,可从任何位置读写,只要在该芯片的范围内。
  13                      enumer=ATxxx,根据使用的芯片赋值。各函数中的形式参数不需改变。
  14                      本程序只要在调用的程序中定义实际参数即可,下述各子程序不必改动。*/
  15                      #include "p89v51rx2.h"
  16                      #include <intrins.h>
  17                      #define  ERROR 10     //允许ERROR的最大次数       
  18                      sbit     SDA=P3^4;
  19                      sbit     SCL=P3^5;
  20                      enum  eepromtype 
  21                      {AT2401,AT2402,AT2404,AT2408,AT2416,AT2432,AT2464,AT24128,AT24256};/*器件的型号*/
  22                      enum  eepromtype enumer;   //定义一个枚举变量
  23                      unsigned char xdata buf1 [10]={35,90,49,49,30,90,11,12,13,15}; /* 发送缓冲区 */
  24                      unsigned char xdata buf2 [10]; /* 接收缓冲区 */
  25                      /* 一个通用的24C01-24C256共9种EEPROM的字节读写操作程序,
  26                      此程序有五个入口条件,分别为读写数据缓冲区指针,
  27                      进行读写的字节数,EEPROM首址,EEPROM控制字节,
  28                      以及EEPROM类型。此程序结构性良好,具有极好的容错性,程序机器码也不多:
  29                      DataBuff为读写数据输入/输出缓冲区的首址
  30                      Length 为要读写数据的字节数量
  31                      Addr 为EEPROM的片内地址 AT24256为0~32767
  32                      Control 为EEPROM的控制字节,具体形式为(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1,
  33                      表示读操作,R/W=0为写操作,A2,A1,A0为EEPROM的页选或片选地址;
  34                      enumer为枚举变量,需为AT2401至AT24256中的一种,分别对应AT24C01至AT24C256;
  35                      函数返回值为一个位变量,若返回1表示此次操作失效,0表示操作成功;
  36                      ERROR为允许最大次数,若出现ERRORCOUNT次操作失效后,则函数中止操作,并返回1
  37                      SDA和SCL由用户自定义,这里暂定义为P3^0和P3^1; */
  38                      /*对于1K位,2K位,4K位,8K位,16K位芯片采用一个8位长的字节地址码,对于32K位以上
  39                      的采用2个8位长的字节地址码直接寻址,而4K位,8K位,16K位配合页面地址来寻址*/
  40          
  41                      /* -----  AT24C01~AT24C256 的读写程序 ------ */
  42                      bit   RW24xx(unsigned char *DataBuff,
  43                                                                                                           unsigned char Length,
  44                                                                                                           unsigned int Addr,
  45                                   unsigned char Control,
  46                                                                                                           enum eepromtype enumer)
  47                      {
  48   1                                                        void Delay(unsigned char DelayCount);  /*   延时   */
  49   1                    void Start(void);  /*   启动总线   */
  50   1                    void Stop(void);   /*   停止IIC总线   */
  51   1                    bit  RecAck(void); /*   检查应答位   */
  52   1                    void NoAck(void);  /*   不对IIC总线产生应答   */
  53   1                    void Ack(void);    /*   对IIC总线产生应答   */
  54   1                    unsigned char Receive(void); /*   从IIC总线上读数据子程序  */
C51 COMPILER V7.50   24LC256_1                                                             01/03/2009 10:56:05 PAGE 2   

  55   1                    void Send(unsigned char sendbyte); /*   向IIC总线写数据   */
  56   1      
  57   1                    unsigned char data j,i=ERROR;
  58   1                    bit errorflag=1;                                          /*   出错标志   */
  59   1                    while(i--)
  60   1                    { 
  61   2                                                                      Start();                                                                /*   启动总线   */
  62   2                      Send(Control & 0xfe);           /*   向IIC总线写数据,器件地址 */
  63   2                      if(RecAck()) continue;  /*   如写不正确结束本次循环   */
  64   2                      if(enumer > AT2416)
  65   2                              { 
  66   3                                                                                      Send((unsigned char)(Addr >> 8));
  67   3                                //把整型数据转换为字符型数据:弃高取低,只取低8位.
  68   3                                //如果容量大于32K位,使用16位地址寻址,写入高八位地址
  69   3                                if(RecAck())  continue;
  70   3                              }
  71   2                      Send((unsigned char)Addr); /*   向IIC总线写数据   */
  72   2                      if(RecAck())  continue; /*   如写正确结束本次循环   */
  73   2                      if(!(Control & 0x01))   //判断是读器件还是写器件
  74   2                              {       j=Length;
  75   3                                errorflag=0;         /* 清错误特征位 */
  76   3                                while(j--)
  77   3                                {     Send(*DataBuff++); /*   向IIC总线写数据   */
  78   4                                  if(!RecAck()) continue; /*   如写正确结束本次循环   */
  79   4                                  errorflag=1;
  80   4                                  break;
  81   4                                }
  82   3                                if(errorflag==1) continue;
  83   3                                break;
  84   3                              }
  85   2                      else
  86   2                      { Start();  /*   启动总线   */
  87   3                        Send(Control); /*   向IIC总线写数据   */
  88   3                        if(RecAck()) continue;//器件没应答结束本次本层循环
  89   3                        while(--Length)  /*   字节长为0结束   */
  90   3                        { *DataBuff ++= Receive();
  91   4                          Ack();   /*   对IIC总线产生应答   */
  92   4                        }
  93   3                        *DataBuff=Receive(); /* 读最后一个字节 */
  94   3                        NoAck();  /*   不对IIC总线产生应答   */
  95   3                        errorflag=0;
  96   3                        break;
  97   3                      }
  98   2                    }
  99   1                    Stop();  /*   停止IIC总线   */
 100   1                    if(!(Control & 0x01))
 101   1                    { Delay(255); Delay(255); Delay(255); Delay(255);
 102   2                    }
 103   1                    return(errorflag);
 104   1                  }
 105          
 106                      /* * * * * 以下是对IIC总线的操作子程序 * * * * */
 107                      /* * * * * * 启动总线 * * * * */
 108                      void Start(void)
 109                      { SCL=0; /* SCL处于高电平时,SDA从高电平转向低电平表示 */
 110   1                    SDA=1; /* 一个"开始"状态,该状态必须在其他命令之前执行 */
 111   1                    SCL=1;
 112   1                    _nop_(); _nop_(); _nop_();
 113   1                    SDA=0;
 114   1                    _nop_(); _nop_(); _nop_(); _nop_();
 115   1                    SCL=0;
 116   1                    SDA=1;     
C51 COMPILER V7.50   24LC256_1                                                             01/03/2009 10:56:05 PAGE 3   

 117   1                  }
 118                      /* * * * * 停止IIC总线 * * * * */
 119                      void Stop(void)
 120                      { SCL=0; /*SCL处于高电平时,SDA从低电平转向高电平 */
 121   1                    SDA=0; /*表示一个"停止"状态,该状态终止所有通讯 */
 122   1                    SCL=1;
 123   1                    _nop_(); _nop_(); _nop_(); /* 空操作 */
 124   1                    SDA=1;
 125   1                    _nop_(); _nop_(); _nop_();
 126   1                    SCL=0;
 127   1                  }
 128          
 129                      /* * * * * 检查应答位 * * * * */
 130                      bit RecAck(void)
 131                      { SCL=0;
 132   1                    SDA=1;
 133   1                    SCL=1;
 134   1                    _nop_(); _nop_(); _nop_(); _nop_();
 135   1                    CY=SDA;     /* 因为返回值总是放在CY中的 */
 136   1                    SCL=0;
 137   1                    return(CY);
 138   1                  }
 139          
 140                      /* * * * *对IIC总线产生应答 * * * * */
 141                      void Ack(void)
 142                      { SDA=0; /* EEPROM通过在收到每个地址或数据之后, */
 143   1                    SCL=1; /* 置SDA低电平的方式确认表示收到读SDA口状态 */
 144   1                    _nop_(); _nop_(); _nop_(); _nop_();
 145   1                    SCL=0;
 146   1                    _nop_();
 147   1                    SDA=1;
 148   1                  }
 149          
 150                      /* * * * * * * * * 不对IIC总线产生应答 * * * * */
 151                      void NoAck(void)
 152                      { SDA=1;
 153   1                    SCL=1;
 154   1                    _nop_(); _nop_(); _nop_(); _nop_();
 155   1                    SCL=0;
 156   1                  }
 157                      /* * * * * * * * * 向IIC总线写数据 * * * * */
 158                      void Send(unsigned char sendbyte)
 159                      { unsigned char data j=8;
 160   1                    for(;j>0;j--)
 161   1                    { SCL=0;
 162   2                      sendbyte <<= 1; /* 使CY=sendbyte^7; */
 163   2                      SDA=CY; /* CY 进位标志位 */
 164   2                      SCL=1;
 165   2                    }
 166   1                    SCL=0;
 167   1                  }
 168                      /* * * * * * * * * 从IIC总线上读数据子程序 * * * * */
 169                      unsigned char Receive(void)
 170                      { register receivebyte,i=8;
 171   1                    SCL=0;
 172   1                    while(i--)
 173   1                    { SCL=1;
 174   2                      receivebyte = (receivebyte <<1 ) | SDA;
 175   2                      SCL=0;
 176   2                    }
 177   1                    return(receivebyte);
 178   1                  }
C51 COMPILER V7.50   24LC256_1                                                             01/03/2009 10:56:05 PAGE 4   

 179                      /* * * * * * * * 一个简单延时程序 * * * * * * * * * * * * */
 180                      void Delay(unsigned char DelayCount)
 181                      { while(DelayCount--);
 182   1                  }
 183                      /* -----  AT24C01~AT24C256 的读写程序 ------ 
 184                      void main2(void)
 185                      { unsigned char Control,*p1,*p2;
 186                        unsigned char Length;
 187                        unsigned int addr ; //24Cxx片内地址
 188                        p1=buf1;p2=buf2;
 189                        addr=0; //片内地址 AT24C256为0~32767
 190                        Length=8; //读写长度
 191                        enumer=AT24256; //读写AT24C256
 192                        Control=0xa0; //写操作
 193                        RW24xx(p1,Length,addr,Control,enumer);//写
 194          
 195                        Control=0xa1; //读操作
 196                        RW24xx(p2,Length,addr,Control,enumer); //读
 197                      }
 198          
 199                                  */


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    359    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =     20    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      1      12
   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 + -