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

📄 54rdeeprom.lst

📁 stc单片机读写内部eeprom程序,可以直接使用
💻 LST
字号:
C51 COMPILER V8.01   54RDEEPROM                                                            12/16/2005 22:10:43 PAGE 1   


C51 COMPILER V8.01, COMPILATION OF MODULE 54RDEEPROM
OBJECT MODULE PLACED IN 54rdEeprom.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 54rdEeprom.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*=======================================================================================
   2          STC89C54RD+ eeprom读写模块,读出部分由于需要从中搜索出有效数据所以采取整个扇区读出,便于
   3          调用方从中分析。其他常用的字节、字、字节数组都编写了读写函数,方便各种应用场合。
   4           ----------------- 调用方必须作如下说明和定义:
   5          uchar xdata     data_buffer[512];       // 片内xdata RAM内定义一个扇区缓存
   6          
   7          // 外部函数列表:
   8          extern void SectorErase(uint sector_addr);      // 扇区擦除
   9          extern uchar byte_read(uint byte_addr);         // byte读
  10          extern void byte_write(uint byte_addr, uchar original_data);    // byte写
  11          extern uchar byte_write_verify(uint byte_addr, uchar original_data);// byte写并校验
  12          extern uchar ArrayWrite(uint begin_addr, uint len, uchar code *array);  // byte数组写并校验
  13          extern void ArrayRead(uint begin_addr, uchar len);              // 读出, 保存在Ttotal[]中
  14          
  15          晓奇工作室 http://www.xiao-qi.com/
  16                                                                                                          --- 晓奇 info@xiao-qi.com 12.15.2005
  17           ====================================================================================== */
  18          #include "src51rd.h"
  19          #include <intrins.h>
  20          
  21          #define uchar   unsigned char
  22          #define uint    unsigned int
  23          
  24          /* --------------- 命令定义 --------------- */
  25          #define RdCommand               0x01    /* 字节读       */
  26          #define PrgCommand              0x02    /* 字节写       */
  27          #define EraseCommand    0x03    /* 扇区擦除 */
  28          
  29          /* 定义常量 */
  30          #define Error   1
  31          #define Ok      0
  32          
  33          /* 定义Flash对应于20MHz晶振系统的操作等待时间 */
  34          #define WaitTime        0x01
  35          
  36          /* ------------- 定义扇区大小 ------------- */
  37          #define PerSector               512
  38          
  39          /* STC89C54RD+的flash空间从0x4000~0xf3ff 共90个扇区,每扇区512字节      */
  40                  #define BaseAddr                0x4000
  41                  #define EndSectoraddr   0xf200
  42                  #define EndAddr                 0xf3ff
  43          
  44          //extern uchar xdata    data_buffer[512];
  45          extern uchar Ttotal[16];
  46          
  47          /* ================ 打开 ISP,IAP 功能 ================= */
  48          void ISP_IAP_enable(void)
  49          {
  50   1              EA      =       0;                                                      /* 关中断               */
  51   1              ISP_CONTR =     ISP_CONTR & 0x18;       /* 0001,1000    */
  52   1              ISP_CONTR =     ISP_CONTR | WaitTime;   /* 写入硬件延时 */
  53   1              ISP_CONTR =     ISP_CONTR | 0x80;       /* ISPEN=1              */
  54   1      }
  55          
C51 COMPILER V8.01   54RDEEPROM                                                            12/16/2005 22:10:43 PAGE 2   

  56          /* =============== 关闭 ISP,IAP 功能 ================== */
  57          void ISP_IAP_disable(void)
  58          {
  59   1              ISP_CONTR       =       ISP_CONTR & 0x7f;       /* ISPEN = 0 */
  60   1              ISP_TRIG        =       0x00;
  61   1              EA                      =   1;                  /* 开中断 */
  62   1      }
  63          /* ================ 公用的触发代码 ==================== */
  64          void ISPgoon(void)
  65          {
  66   1              ISP_IAP_enable();                       /* 打开 ISP,IAP 功能    */
  67   1              ISP_TRIG        =       0x46;           /* 触发ISP_IAP命令字节1 */
  68   1              ISP_TRIG        =       0xb9;           /* 触发ISP_IAP命令字节2 */
  69   1              _nop_();
  70   1      }
  71          
  72          /* ==================== 字节读 ======================== */
  73          uchar byte_read(uint byte_addr)
  74          {
  75   1              ISP_ADDRH = (uchar)(byte_addr >> 8);    /* 地址赋值     */
  76   1              ISP_ADDRL = (uchar)(byte_addr & 0x00ff);
  77   1      
  78   1              ISP_CMD   = ISP_CMD     & 0xf8;                 /* 清除低3位    */
  79   1              ISP_CMD   = ISP_CMD     | RdCommand;    /* 写入读命令   */
  80   1      
  81   1              ISPgoon();                                                      /* 触发执行             */
  82   1              ISP_IAP_disable();                              /* 关闭ISP,IAP功能      */
  83   1      
  84   1              return (ISP_DATA);                              /* 返回读到的数据       */
  85   1      }
  86          
  87          /* ================== 扇区擦除 ======================== */
  88          void SectorErase(uint sector_addr)
  89          {
  90   1              uint iSectorAddr;
  91   1              iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址 */
  92   1              ISP_ADDRH = (uchar)(iSectorAddr >> 8);
  93   1              ISP_ADDRL = 0x00;
  94   1      
  95   1              ISP_CMD = ISP_CMD & 0xf8;                       /* 清空低3位    */
  96   1              ISP_CMD = ISP_CMD | EraseCommand;       /* 擦除命令3    */
  97   1      
  98   1              ISPgoon();                                                      /* 触发执行             */
  99   1              ISP_IAP_disable();                              /* 关闭ISP,IAP功能      */
 100   1      
 101   1      }
 102          
 103          /* ==================== 字节写 ======================== */
 104          void byte_write(uint byte_addr, uchar original_data)
 105          {
 106   1              ISP_ADDRH =     (uchar)(byte_addr >> 8);        /* 取地址       */
 107   1              ISP_ADDRL =     (uchar)(byte_addr & 0x00ff);
 108   1      
 109   1              ISP_CMD  = ISP_CMD & 0xf8;                              /* 清低3位      */
 110   1              ISP_CMD  = ISP_CMD | PrgCommand;                /* 写命令2      */
 111   1              ISP_DATA = original_data;                       /* 写入数据准备 */
 112   1      
 113   1              ISPgoon();                                                      /* 触发执行             */
 114   1              ISP_IAP_disable();                                      /* 关闭IAP功能  */
 115   1      }
 116          
 117          /* =================== 字节写并校验 =================== */
C51 COMPILER V8.01   54RDEEPROM                                                            12/16/2005 22:10:43 PAGE 3   

 118          uchar byte_write_verify(uint byte_addr, uchar original_data)
 119          {
 120   1              ISP_ADDRH = (uchar)(byte_addr >> 8);    /* 取地址       */
 121   1              ISP_ADDRL = (uchar)(byte_addr & 0xff);
 122   1      
 123   1              ISP_CMD  = ISP_CMD & 0xf8;                              /* 清低3位      */
 124   1              ISP_CMD  = ISP_CMD | PrgCommand;                /* 写命令2      */
 125   1              ISP_DATA = original_data;
 126   1      
 127   1              ISPgoon();                                                      /* 触发执行             */
 128   1      
 129   1              /* 开始读,没有在此重复给地址,地址不会被自动改变       */
 130   1              ISP_DATA = 0x00;                                /* 清数据传递寄存器     */
 131   1      
 132   1              ISP_CMD = ISP_CMD & 0xf8;                               /* 清低3位      */
 133   1              ISP_CMD = ISP_CMD | RdCommand;                  /* 读命令1      */
 134   1      
 135   1              ISP_TRIG        =       0x46;           /* 触发ISP_IAP命令字节1 */
 136   1              ISP_TRIG        =       0xb9;           /* 触发ISP_IAP命令字节2 */
 137   1              _nop_();                                        /* 延时 */
 138   1      
 139   1              ISP_IAP_disable();                                      /* 关闭IAP功能  */
 140   1      
 141   1              if(ISP_DATA     == original_data)               /* 读写数据校验 */
 142   1                      return  Ok;                                             /* 返回校验结果 */
 143   1              else
 144   1                      return  Error;
 145   1      }
 146          
 147          
 148          /* ===================== 数组写入 ===================== */
 149          uchar ArrayWrite(uint begin_addr, uint len, uchar *array)
 150          {
 151   1              uint    i;
 152   1              uint    in_addr;
 153   1      
 154   1              /* 判是否是有效范围,此函数不允许跨扇区操作 */
 155   1              if(len > PerSector)
 156   1                      return Error;
 157   1              in_addr = begin_addr & 0x01ff;          /* 扇区内偏移量 */
 158   1              if((in_addr + len) > PerSector)
 159   1                      return Error;
 160   1      
 161   1              in_addr = begin_addr;
 162   1              /* 逐个写入并校对 */
 163   1              ISP_IAP_enable();                                       /* 打开IAP功能  */
 164   1              for(i = 0; i< len; i++)
 165   1              {
 166   2                      /* 写一个字节 */
 167   2                      ISP_ADDRH = (uchar)(in_addr >> 8);
 168   2                      ISP_ADDRL = (uchar)(in_addr & 0x00ff);
 169   2                      ISP_DATA  = array[i];                           /* 取数据       */
 170   2                      ISP_CMD   = ISP_CMD & 0xf8;                     /* 清低3位      */
 171   2                      ISP_CMD   = ISP_CMD | PrgCommand;       /* 写命令2      */
 172   2      
 173   2                      ISP_TRIG  = 0x46;               /* 触发ISP_IAP命令字节1 */
 174   2                      ISP_TRIG  = 0xb9;               /* 触发ISP_IAP命令字节2 */
 175   2                      _nop_();
 176   2      
 177   2                      /* 读回来 */
 178   2                      ISP_DATA        =       0x00;
 179   2      
C51 COMPILER V8.01   54RDEEPROM                                                            12/16/2005 22:10:43 PAGE 4   

 180   2                      ISP_CMD  = ISP_CMD & 0xf8;                      /* 清低3位      */
 181   2                      ISP_CMD  = ISP_CMD | RdCommand;         /* 读命令1      */
 182   2      
 183   2                      ISP_TRIG = 0x46;                /* 触发ISP_IAP命令字节1 */
 184   2                      ISP_TRIG = 0xb9;                /* 触发ISP_IAP命令字节2 */
 185   2                      _nop_();
 186   2      
 187   2                      /*  比较对错 */
 188   2                      if(ISP_DATA != array[i])
 189   2                      {
 190   3                              ISP_IAP_disable();
 191   3                              return Error;
 192   3                      }
 193   2                      in_addr++;                                      /* 指向下一个字节       */
 194   2              }
 195   1              ISP_IAP_disable();
 196   1              return  Ok;
 197   1      }
 198          
 199          /* ========================= 扇区读出 ========================= */
 200          /* 程序对地址没有作有效性判断,请调用方事先保证他在规定范围内   */
 201          void ArrayRead(uint begin_addr, uchar len)
 202          {
 203   1      //      uchar xdata     data_buffer[];                  /* 整个扇区读取缓存区   */
 204   1              uint iSectorAddr;
 205   1              uint i;
 206   1              iSectorAddr = begin_addr;       // & 0xfe00;            /* 取扇区地址   */
 207   1              
 208   1              ISP_IAP_enable();
 209   1              for(i = 0; i < len; i++)
 210   1              {
 211   2                      ISP_ADDRH =     (uchar)(iSectorAddr >> 8);
 212   2                      ISP_ADDRL =     (uchar)(iSectorAddr & 0x00ff);
 213   2      
 214   2                      ISP_CMD   =     ISP_CMD & 0xf8;                         /* 清低3位      */
 215   2                      ISP_CMD   =     ISP_CMD | RdCommand;            /* 读命令1      */
 216   2                      ISP_DATA = 0;
 217   2                      ISP_TRIG = 0x46;                        /* 触发ISP_IAP命令字节1 */
 218   2                      ISP_TRIG = 0xb9;                        /* 触发ISP_IAP命令字节2 */
 219   2                      _nop_();
 220   2      
 221   2                      Ttotal[i]       =       ISP_DATA;
 222   2                      iSectorAddr++;
 223   2              }
 224   1              ISP_IAP_disable();                                              /* 关闭IAP功能  */
 225   1      }


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


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

⌨️ 快捷键说明

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