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

📄 flash_eeprom.lst

📁 C51单片机一个小项目源程序:包含液晶12232驱动,AD7705驱动,按键扫描及单片机内部EEPROM的驱动,是一个比较值得参考的源程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.50   FLASH_EEPROM                                                          09/26/2007 17:19:05 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE FLASH_EEPROM
OBJECT MODULE PLACED IN Flash_Eeprom.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE Flash_Eeprom.c LARGE BROWSE DEBUG OBJECTEXTEND

line level    source

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

  56   1               _nop_();
  57   1      
  58   1              ISP_IAP_disable();
  59   1              return OK;
  60   1      }
  61          #ifdef byte_pro
              #define byte_pro
              /* 字节编程 */
              INT8U byte_program(INT16U byte_addr, INT8U original_data)
              {
                      ISP_ADDRH       =       (INT8U)(byte_addr >> 8);
                      ISP_ADDRL       =       (INT8U)(byte_addr & 0x00ff);
              
                      ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
                      ISP_CMD         =       ISP_CMD |       PROGRAM_AP_and_Data_Memory_Command;             /* 0000,0010 */
                      ISP_DATA        =       original_data;
              
                      ISP_IAP_enable();
                      ISP_TRIG        =       0x46;        /* 触发ISP_IAP命令 */
                      ISP_TRIG        =       0xb9;        /* 触发ISP_IAP命令 */
                      _nop_();
              
                      ISP_IAP_disable();
                      return  OK;
              }
              
              /* 字节编程并校验 */
              INT8U byte_program_and_verify(INT16U byte_addr, INT8U original_data)
              {
                      ISP_ADDRH       =       (INT8U)(byte_addr >> 8);
                      ISP_ADDRL       =       (INT8U)(byte_addr & 0x00ff);
              
                      ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
                      ISP_CMD         =       ISP_CMD |       PROGRAM_AP_and_Data_Memory_Command;     /* 0000,0010 */
                      ISP_DATA        =       original_data;
              
                      ISP_IAP_enable();
              
                      ISP_TRIG        =       0x46;
                      ISP_TRIG        =       0xb9;
                      _nop_();
              
                      ISP_DATA        =       0x00;
              
                      ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
                      ISP_CMD         =       ISP_CMD |       READ_AP_and_Data_Memory_Command;        /* 0000,0001 */
              
                      ISP_TRIG        =       0x46;        /* 触发ISP_IAP命令 */
                      ISP_TRIG        =       0xb9;        /* 触发ISP_IAP命令 */
                      _nop_();
              
                      ISP_IAP_disable();
              
                      if(ISP_DATA     ==      original_data)
                              return  OK;
                      else
                              return  ERROR;
              }
              #endif
 115          
 116          /* 写数据进Flash存储器, 只在同一个扇区内写,不保留原有数据      */
 117          /* begin_addr,被写数据Flash开始地址;counter,连续写多少个字节; array[],数据来源       */
C51 COMPILER V7.50   FLASH_EEPROM                                                          09/26/2007 17:19:05 PAGE 3   

 118          INT8U sequential_write_flash_in_one_sector(INT16U begin_addr, INT16U counter, INT8U array[])
 119          {
 120   1              INT16U  i       =       0;
 121   1              INT16U  in_sector_begin_addr    =       0;
 122   1              INT16U  sector_addr     =       0;
 123   1      
 124   1              /* 判是否是有效范围,此函数不允许跨扇区操作 */
 125   1              if(counter > USED_BYTE_QTY_IN_ONE_SECTOR)
 126   1                      return  ERROR;
 127   1              in_sector_begin_addr =        begin_addr & 0x01ff;         /* 0000,0001,1111,1111 */
 128   1              if( (in_sector_begin_addr + counter) > USED_BYTE_QTY_IN_ONE_SECTOR )
 129   1                      return ERROR;
 130   1      
 131   1          /* 擦除 要修改/写入 的扇区 */
 132   1              sector_addr     =       (begin_addr & 0xfe00);  /* 1111,1110,0000,0000; 取扇区地址 */
 133   1              ISP_ADDRH       =       (INT8U)(sector_addr >> 8);
 134   1              ISP_ADDRL       =       0x00;
 135   1              ISP_CMD         =       ISP_CMD &       0xf8;           /* 1111,1000 */
 136   1              ISP_CMD         =       ISP_CMD |       SECTOR_ERASE_AP_and_Data_Memory_Command;        /* 0000,0011 */
 137   1      
 138   1              ISP_IAP_enable();
 139   1              ISP_TRIG        =       0x46;        /* 触发ISP_IAP命令 */
 140   1              ISP_TRIG        =       0xb9;        /* 触发ISP_IAP命令 */
 141   1              _nop_();
 142   1      
 143   1              for(i = 0; i< counter; i++)
 144   1              {
 145   2                      /* 写一个字节 */
 146   2                      ISP_ADDRH       =       (INT8U)(begin_addr >> 8);
 147   2                      ISP_ADDRL       =       (INT8U)(begin_addr & 0x00ff);
 148   2                      ISP_DATA        =       array[i];
 149   2                      ISP_CMD         =       ISP_CMD &       0xf8;   /* 1111,1000 */
 150   2                      ISP_CMD         =       ISP_CMD |       PROGRAM_AP_and_Data_Memory_Command;             /* 0000,0010 */
 151   2      
 152   2                      ISP_TRIG        =       0x46;   /* 触发ISP_IAP命令 */
 153   2                      ISP_TRIG        =       0xb9;   /* 触发ISP_IAP命令 */
 154   2                      _nop_();
 155   2      
 156   2                      /* 读回来 */
 157   2                      ISP_DATA        =       0x00;
 158   2      

⌨️ 快捷键说明

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