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

📄 eeprom.lst

📁 protues仿真keil程序 初学者的福音
💻 LST
字号:
C51 COMPILER V9.01   EEPROM                                                                05/06/2012 20:40:06 PAGE 1   


C51 COMPILER V9.01, COMPILATION OF MODULE EEPROM
OBJECT MODULE PLACED IN EEPROM.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE EEPROM.c ROM(COMPACT) BROWSE DEBUG OBJECTEXTEND

line level    source

   1          
   2          #include "stc90.h"
   3          #include "EEPROM.H"
   4          #include "intrins.h"
   5          
   6          
   7          
   8          
   9          
  10          /* 打开 ISP,IAP 功能 */
  11          void ISP_IAP_enable(void)
  12          {
  13   1              EA      =       0;      /* 关中断 */
  14   1              ISP_CONTR       =       ISP_CONTR & 0x18;       /* 0001,1000 */
  15   1              ISP_CONTR       =       ISP_CONTR | WAIT_TIME;
  16   1              ISP_CONTR       =       ISP_CONTR | 0x80;       /* 1000,0000 */
  17   1      }
  18          
  19          /* 关闭 ISP,IAP 功能 */
  20          void ISP_IAP_disable(void)
  21          {
  22   1              ISP_CONTR       =       ISP_CONTR & 0x7f;       /* 0111,1111 */
  23   1              ISP_TRIG        =       0x00;
  24   1              EA                      =   1;                  /* 开中断 */
  25   1      }
  26          
  27          /* 字节读 */
  28          INT8U byte_read(INT16U byte_addr)
  29          {
  30   1              ISP_ADDRH       =       (INT8U)(byte_addr >> 8);
  31   1              ISP_ADDRL       =       (INT8U)(byte_addr & 0x00ff);
  32   1      
  33   1              ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
  34   1              ISP_CMD         =       ISP_CMD |       READ_AP_and_Data_Memory_Command;        /* 0000,0001 */
  35   1      
  36   1              ISP_IAP_enable();
  37   1      
  38   1              ISP_TRIG        =       0x46;
  39   1              ISP_TRIG        =       0xb9;
  40   1              _nop_();
  41   1      
  42   1              ISP_IAP_disable();
  43   1              return (ISP_DATA);
  44   1      }
  45          
  46          /* 扇区擦除 */
  47          INT8U sector_erase(INT16U sector_addr)
  48          {
  49   1              INT16U get_sector_addr  =       0;
  50   1              get_sector_addr                 =       (sector_addr & 0xfe00); /* 1111,1110,0000,0000; 取扇区地址 */
  51   1              ISP_ADDRH                       =       (INT8U)(get_sector_addr >> 8);
  52   1              ISP_ADDRL                       =       0x00;
  53   1      
  54   1              ISP_CMD =       ISP_CMD &       0xf8;   /* 1111,1000 */
  55   1              ISP_CMD =       ISP_CMD |       SECTOR_ERASE_AP_and_Data_Memory_Command;        /* 0000,0011 */
C51 COMPILER V9.01   EEPROM                                                                05/06/2012 20:40:06 PAGE 2   

  56   1      
  57   1              ISP_IAP_enable();
  58   1              ISP_TRIG        =       0x46;        /* 触发ISP_IAP命令 */
  59   1              ISP_TRIG        =       0xb9;        /* 触发ISP_IAP命令 */
  60   1               _nop_();
  61   1      
  62   1              ISP_IAP_disable();
  63   1              return 1;
  64   1      }
  65          
  66          /* 字节编程 */
  67          //INT8U byte_program(INT16U byte_addr, INT8U original_data)
  68          //{
  69          //      ISP_ADDRH       =       (INT8U)(byte_addr >> 8);
  70          //      ISP_ADDRL       =       (INT8U)(byte_addr & 0x00ff);
  71          //
  72          //      ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
  73          //      ISP_CMD         =       ISP_CMD |       PROGRAM_AP_and_Data_Memory_Command;             /* 0000,0010 */
  74          //      ISP_DATA        =       original_data;
  75          //
  76          //      ISP_IAP_enable();
  77          //      ISP_TRIG        =       0x46;        /* 触发ISP_IAP命令 */
  78          //      ISP_TRIG        =       0xb9;        /* 触发ISP_IAP命令 */
  79          //      _nop_();
  80          //
  81          //      ISP_IAP_disable();
  82          //      return  1;
  83          //}
  84          
  85          
  86          
  87          /* 写数据进 数据Flash存储器, 只在同一个扇区内写,不保留原有数据 */
  88          /* begin_addr,被写数据Flash开始地址;counter,连续写多少个字节; array[],数据来源       */
  89          INT8U sequential_write_flash_in_one_sector(INT16U begin_addr, INT16U counter, INT8U array[])
  90          {
  91   1              INT16U  i       =       0;
  92   1              INT16U  in_sector_begin_addr    =       0;
  93   1              INT16U  sector_addr     =       0;
  94   1      
  95   1              /* 判是否是有效范围,此函数不允许跨扇区操作 */
  96   1              if(counter > USED_BYTE_QTY_IN_ONE_SECTOR)
  97   1                      return  0;
  98   1              in_sector_begin_addr =        begin_addr & 0x01ff;         /* 0000,0001,1111,1111 */
  99   1              if( (in_sector_begin_addr + counter) > USED_BYTE_QTY_IN_ONE_SECTOR )
 100   1                      return 0;
 101   1      
 102   1          /* 擦除 要修改/写入 的扇区 */
 103   1              sector_addr     =       (begin_addr & 0xfe00);  /* 1111,1110,0000,0000; 取扇区地址 */
 104   1              ISP_ADDRH       =       (INT8U)(sector_addr >> 8);
 105   1              ISP_ADDRL       =       0x00;
 106   1              ISP_CMD         =       ISP_CMD &       0xf8;           /* 1111,1000 */
 107   1              ISP_CMD         =       ISP_CMD |       SECTOR_ERASE_AP_and_Data_Memory_Command;        /* 0000,0011 */
 108   1      
 109   1              ISP_IAP_enable();
 110   1              ISP_TRIG        =       0x46;        /* 触发ISP_IAP命令 */
 111   1              ISP_TRIG        =       0xb9;        /* 触发ISP_IAP命令 */
 112   1              _nop_();
 113   1      
 114   1              for(i = 0; i< counter; i++)
 115   1              {
 116   2                      /* 写一个字节 */
 117   2                      ISP_ADDRH       =       (INT8U)(begin_addr >> 8);
C51 COMPILER V9.01   EEPROM                                                                05/06/2012 20:40:06 PAGE 3   

 118   2                      ISP_ADDRL       =       (INT8U)(begin_addr & 0x00ff);
 119   2                      ISP_DATA        =       array[i];
 120   2                      ISP_CMD         =       ISP_CMD &       0xf8;   /* 1111,1000 */
 121   2                      ISP_CMD         =       ISP_CMD |       PROGRAM_AP_and_Data_Memory_Command;             /* 0000,0010 */
 122   2      
 123   2                      ISP_TRIG        =       0x46;   /* 触发ISP_IAP命令 */
 124   2                      ISP_TRIG        =       0xb9;   /* 触发ISP_IAP命令 */
 125   2                      _nop_();
 126   2      
 127   2                      /* 读回来 */
 128   2                      ISP_DATA        =       0x00;
 129   2      
 130   2                      ISP_CMD         =       ISP_CMD &       0xf8;   /* 1111,1000 */
 131   2                      ISP_CMD     =   ISP_CMD |       READ_AP_and_Data_Memory_Command;        /* 0000,0001 */
 132   2      
 133   2                      ISP_TRIG        =       0x46;   /* 触发ISP_IAP命令 */
 134   2                      ISP_TRIG        =       0xb9;   /* 触发ISP_IAP命令 */
 135   2                      _nop_();
 136   2      
 137   2                      /*  比较对错 */
 138   2                      if(ISP_DATA != array[i])
 139   2                      {
 140   3                              ISP_IAP_disable();
 141   3                              return 0;
 142   3                      }
 143   2              begin_addr++;
 144   2              }
 145   1              ISP_IAP_disable();
 146   1              return  1;
 147   1      }
 148          
 149          
 150          
 151          void delay(INT16U counter)
 152          {
 153   1              INT16U  temp    =       0;
 154   1              for(temp = counter; temp>0; temp--)
 155   1              {
 156   2                      _nop_();
 157   2                      _nop_();
 158   2                      _nop_();
 159   2              }
 160   1      }
 161          
 162          
 163           


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    279    ----
   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 + -