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

📄 54rdeeprom.lst

📁 STC系列单片机EEPROM使用程序,经过修改可以在STC12C54系列上使用
💻 LST
字号:
C51 COMPILER V8.08   54RDEEPROM                                                            03/08/2009 13:41:49 PAGE 1   


C51 COMPILER V8.08, 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 <STC12C5410AD.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          /* 时钟倍频时WaitTime用 0x00*/
  35          
  36          #define WaitTime        0x01
  37          
  38          /* ------------- 定义扇区大小 ------------- */
  39          #define PerSector               512
  40          
  41          extern uchar Ttotal[];
  42          
  43          /* ================ 打开 ISP,IAP 功能 ================= */
  44          void ISP_IAP_enable(void)
  45          {
  46   1              EA      =       0;                                                      /* 关中断               */
  47   1              ISP_CONTR =     ISP_CONTR & 0x18;       /* 0001,1000    */
  48   1              ISP_CONTR =     ISP_CONTR | WaitTime;   /* 写入硬件延时 */
  49   1              ISP_CONTR =     ISP_CONTR | 0x80;       /* ISPEN=1              */
  50   1      }
  51          
  52          /* =============== 关闭 ISP,IAP 功能 ================== */
  53          void ISP_IAP_disable(void)
  54          {
  55   1              ISP_CONTR       =       ISP_CONTR & 0x7f;       /* ISPEN = 0 */
C51 COMPILER V8.08   54RDEEPROM                                                            03/08/2009 13:41:49 PAGE 2   

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

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

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