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

📄 isp_falsh.lst

📁 LED控制
💻 LST
字号:
C51 COMPILER V8.02   ISP_FALSH                                                             03/27/2009 09:21:37 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE ISP_FALSH
OBJECT MODULE PLACED IN ISP_FALSH.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ISP_FALSH.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <STC12C5410.H>
   2          #include <intrins.h>        /* use _nop_() function */
   3          //sfr16 DPTR = 0x82;
   4          
   5          
   6          /* 定义命令 */
   7          #define READ_AP_and_Data_Memory_Command                         0x01        /*  字节读数据存储区   */
   8          #define PROGRAM_AP_and_Data_Memory_Command          0x02        /*  字节编程数据存储区 */
   9          #define SECTOR_ERASE_AP_and_Data_Memory_Command     0x03        /*  扇区擦除数据存储区 */
  10          
  11          typedef     unsigned char       INT8U;          /* 8 bit 无符号整型  */
  12          typedef     unsigned int    INT16U;     /* 16 bit 无符号整型 */
  13          //#define               DELAY_CONST         60000
  14          
  15          /* 定义常量 */
  16          #define ERROR   0
  17          #define OK      1
  18          
  19          /* 定义Flash 操作等待时间 */
  20          #define        MCU_CLOCK_40MHz
  21          //#define         MCU_CLOCK_20MHz
  22          //#define        MCU_CLOCK_10MHz
  23          //#define        MCU_CLOCK_5MHz
  24          #ifdef MCU_CLOCK_40MHz
  25                  #define WAIT_TIME        0x00
  26          #endif
  27          #ifdef MCU_CLOCK_20MHz
                      #define WAIT_TIME        0x01
              #endif
  30          #ifdef MCU_CLOCK_10MHz
                      #define WAIT_TIME        0x02
              #endif
  33          #ifdef MCU_CLOCK_5MHz
                      #define WAIT_TIME        0x03
              #endif
  36          
  37          /* 调试控制项 */
  38          //#define         DEBUG_STC89C_LE58RD+
  39          
  40          #define         DEBUG_STC89C_LE52RC
  41          
  42          //#define USED_BYTE_QTY_IN_ONE_SECTOR                1
  43          //#define USED_BYTE_QTY_IN_ONE_SECTOR                2
  44          //#define USED_BYTE_QTY_IN_ONE_SECTOR                4
  45          //#define USED_BYTE_QTY_IN_ONE_SECTOR                8
  46          //#define USED_BYTE_QTY_IN_ONE_SECTOR                16
  47          #define USED_BYTE_QTY_IN_ONE_SECTOR                32
  48          //#define USED_BYTE_QTY_IN_ONE_SECTOR                64
  49          //#define USED_BYTE_QTY_IN_ONE_SECTOR                128
  50          //#define USED_BYTE_QTY_IN_ONE_SECTOR                256
  51          //#define USED_BYTE_QTY_IN_ONE_SECTOR                512
  52          
  53          INT8U xdata protect_buffer[USED_BYTE_QTY_IN_ONE_SECTOR];
  54          
  55          
C51 COMPILER V8.02   ISP_FALSH                                                             03/27/2009 09:21:37 PAGE 2   

  56          /* 打开 ISP,IAP 功能 */
  57          void ISP_IAP_enable(void)
  58          {
  59   1              EA      =       0;      /* 关中断 */
  60   1              ISP_CONTR       =       ISP_CONTR & 0x18;       /* 0001,1000 */
  61   1              ISP_CONTR       =       ISP_CONTR | WAIT_TIME;
  62   1              ISP_CONTR       =       ISP_CONTR | 0x80;       /* 1000,0000 */
  63   1      }
  64          
  65          /* 关闭 ISP,IAP 功能 */
  66          void ISP_IAP_disable(void)
  67          {
  68   1              ISP_CONTR       =       ISP_CONTR & 0x7f;       /* 0111,1111 */
  69   1              ISP_TRIG        =       0x00;
  70   1              EA                      =   1;                  /* 开中断 */
  71   1      }
  72          
  73          /* 字节读 */
  74          extern INT8U byte_read(INT16U byte_addr)
  75          {
  76   1              ISP_ADDRH       =       (INT8U)(byte_addr >> 8);
  77   1              ISP_ADDRL       =       (INT8U)(byte_addr & 0x00ff);
  78   1      
  79   1              ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
  80   1              ISP_CMD         =       ISP_CMD |       READ_AP_and_Data_Memory_Command;        /* 0000,0001 */
  81   1      
  82   1              ISP_IAP_enable();
  83   1      
  84   1              ISP_TRIG        =       0x46;
  85   1              ISP_TRIG        =       0xb9;
  86   1              _nop_();
  87   1      
  88   1              ISP_IAP_disable();
  89   1              return (ISP_DATA);
  90   1      }
  91          
  92          
  93          /* 写数据进数据Flash存储器(EEPROM), 只在同一个扇区内写,保留同一扇区中不需修改的数据    */
  94          /* begin_addr,被写数据Flash开始地址;counter,连续写多少个字节; array[],数据来源               */
  95          extern INT8U write_flash_with_protect_in_one_sector(INT16U begin_addr, INT16U counter, INT8U array[])
  96          {
  97   1              INT16U  i       =       0;
  98   1              INT16U  in_sector_begin_addr    =       0;
  99   1              INT16U  sector_addr     =       0;
 100   1              INT16U  byte_addr       =       0;
 101   1      
 102   1              /* 判是否是有效范围,此函数不允许跨扇区操作 */
 103   1              if(counter > USED_BYTE_QTY_IN_ONE_SECTOR)
 104   1                      return ERROR;
 105   1              in_sector_begin_addr =        begin_addr & 0x01ff;         /* 0000,0001,1111,1111 */
 106   1              /* 假定从扇区的第0个字节开始,到USED_BYTE_QTY_IN_ONE_SECTOR-1个字节结束,后面部分不用,程序易编写 */
 107   1              if( (in_sector_begin_addr + counter) > USED_BYTE_QTY_IN_ONE_SECTOR )
 108   1                      return ERROR;
 109   1      
 110   1              /* 将该扇区数据 0 - (USED_BYTE_QTY_IN_ONE_SECTOR-1) 字节数据读入缓冲区保护 */
 111   1              sector_addr             =       (begin_addr & 0xfe00);  /* 1111,1110,0000,0000; 取扇区地址              */
 112   1              byte_addr               =   sector_addr;                        /* 扇区地址为扇区首字节地址                             */
 113   1      
 114   1              ISP_IAP_enable();
 115   1              for(i = 0; i < USED_BYTE_QTY_IN_ONE_SECTOR; i++)
 116   1              {
 117   2                      ISP_ADDRH       =       (INT8U)(byte_addr >> 8);
C51 COMPILER V8.02   ISP_FALSH                                                             03/27/2009 09:21:37 PAGE 3   

 118   2                      ISP_ADDRL       =       (INT8U)(byte_addr & 0x00ff);
 119   2      
 120   2                      ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
 121   2                      ISP_CMD         =       ISP_CMD |       READ_AP_and_Data_Memory_Command;        /* 0000,0001 */
 122   2      
 123   2                      ISP_TRIG        =       0x46;
 124   2                      ISP_TRIG        =       0xb9;
 125   2                      _nop_();
 126   2      
 127   2                      protect_buffer[i]       =       ISP_DATA;
 128   2                      byte_addr++;
 129   2              }
 130   1      
 131   1              /* 将要写入的数据写入保护缓冲区的相应区域,其余部分保留 */
 132   1              for(i = 0; i < counter; i++)
 133   1              {
 134   2                      protect_buffer[in_sector_begin_addr] = array[i];
 135   2                      in_sector_begin_addr++;
 136   2              }
 137   1      
 138   1              /* 擦除 要修改/写入 的扇区 */
 139   1              ISP_ADDRH       =       (INT8U)(sector_addr >> 8);
 140   1              ISP_ADDRL       =       0x00;
 141   1              ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
 142   1              ISP_CMD         =       ISP_CMD |       SECTOR_ERASE_AP_and_Data_Memory_Command;        /* 0000,0011 */
 143   1      
 144   1              ISP_TRIG        =       0x46;        /* 触发ISP_IAP命令 */
 145   1              ISP_TRIG        =       0xb9;        /* 触发ISP_IAP命令 */
 146   1              _nop_();
 147   1      
 148   1              /* 将保护缓冲区的数据写入 Data Flash, EEPROM */
 149   1              byte_addr       =   sector_addr;                        /* 扇区地址为扇区首字节地址     */
 150   1              for(i = 0; i< USED_BYTE_QTY_IN_ONE_SECTOR; i++)
 151   1              {
 152   2                      /* 写一个字节 */
 153   2                      ISP_ADDRH       =       (INT8U)(byte_addr >> 8);
 154   2                      ISP_ADDRL       =       (INT8U)(byte_addr & 0x00ff);
 155   2                      ISP_DATA        =       protect_buffer[i];
 156   2                      ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
 157   2                      ISP_CMD         =       ISP_CMD |       PROGRAM_AP_and_Data_Memory_Command;             /* 0000,0010 */
 158   2      
 159   2                      ISP_TRIG        =       0x46;        /* 触发ISP_IAP命令 */
 160   2                      ISP_TRIG        =       0xb9;        /* 触发ISP_IAP命令 */
 161   2                      _nop_();
 162   2      
 163   2                      /* 读回来 */
 164   2                      ISP_DATA        =       0x00;
 165   2      
 166   2                      ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
 167   2                      ISP_CMD         =       ISP_CMD |       READ_AP_and_Data_Memory_Command;        /* 0000,0001 */
 168   2      
 169   2                      ISP_TRIG        =       0x46;        /* 触发ISP_IAP命令 */
 170   2                      ISP_TRIG        =       0xb9;        /* 触发ISP_IAP命令 */
 171   2                      _nop_();
 172   2      
 173   2                      /*  比较对错 */
 174   2                      if(ISP_DATA != protect_buffer[i])
 175   2                      {
 176   3                              ISP_IAP_disable();
 177   3                              return ERROR;
 178   3              }
 179   2              byte_addr++;
C51 COMPILER V8.02   ISP_FALSH                                                             03/27/2009 09:21:37 PAGE 4   

 180   2              }
 181   1              ISP_IAP_disable();
 182   1              return OK;
 183   1      }
 184          
 185          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    361    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =     32    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      11
   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 + -