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

📄 flash_eeprom.lst

📁 C51单片机一个小项目源程序:包含液晶12232驱动,AD7705驱动,按键扫描及单片机内部EEPROM的驱动,是一个比较值得参考的源程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 159   2                      ISP_CMD         =       ISP_CMD &       0xf8;   /* 1111,1000 */
 160   2                      ISP_CMD     =   ISP_CMD |       READ_AP_and_Data_Memory_Command;        /* 0000,0001 */
 161   2      
 162   2                      ISP_TRIG        =       0x46;   /* 触发ISP_IAP命令 */
 163   2                      ISP_TRIG        =       0xb9;   /* 触发ISP_IAP命令 */
 164   2                      _nop_();
 165   2      
 166   2                      /*  比较对错 */
 167   2                      if(ISP_DATA != array[i])
 168   2                      {
 169   3                              ISP_IAP_disable();
 170   3                              return ERROR;
 171   3                      }
 172   2              begin_addr++;
 173   2              }
 174   1              ISP_IAP_disable();
 175   1              return  OK;
 176   1      }
 177          #ifdef write_flash
              #define write_flash
              /* 写数据进数据Flash存储器(EEPROM), 只在同一个扇区内写,保留同一扇区中不需修改的数据    */
C51 COMPILER V7.50   FLASH_EEPROM                                                          09/26/2007 17:19:05 PAGE 4   

              /* begin_addr,被写数据Flash开始地址;counter,连续写多少个字节; array[],数据来源               */
              INT8U write_flash_with_protect_in_one_sector(INT16U begin_addr, INT16U counter, INT8U array[])
              {
                      INT16U  i       =       0;
                      INT16U  in_sector_begin_addr    =       0;
                      INT16U  sector_addr     =       0;
                      INT16U  byte_addr       =       0;
              
                      /* 判是否是有效范围,此函数不允许跨扇区操作 */
                      if(counter > USED_BYTE_QTY_IN_ONE_SECTOR)
                              return ERROR;
                      in_sector_begin_addr =        begin_addr & 0x01ff;         /* 0000,0001,1111,1111 */
                      /* 假定从扇区的第0个字节开始,到USED_BYTE_QTY_IN_ONE_SECTOR-1个字节结束,后面部分不用,程序易编写 */
                      if( (in_sector_begin_addr + counter) > USED_BYTE_QTY_IN_ONE_SECTOR )
                              return ERROR;
              
                      /* 将该扇区数据 0 - (USED_BYTE_QTY_IN_ONE_SECTOR-1) 字节数据读入缓冲区保护 */
                      sector_addr             =       (begin_addr & 0xfe00);  /* 1111,1110,0000,0000; 取扇区地址              */
                      byte_addr               =   sector_addr;                        /* 扇区地址为扇区首字节地址                             */
              
                      ISP_IAP_enable();
                      for(i = 0; i < USED_BYTE_QTY_IN_ONE_SECTOR; i++)
                      {
                              ISP_ADDRH       =       (INT8U)(byte_addr >> 8);
                              ISP_ADDRL       =       (INT8U)(byte_addr & 0x00ff);
              
                              ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
                              ISP_CMD         =       ISP_CMD |       READ_AP_and_Data_Memory_Command;        /* 0000,0001 */
              
                              ISP_TRIG        =       0x46;
                              ISP_TRIG        =       0xb9;
                              _nop_();
              
                              protect_buffer[i]       =       ISP_DATA;
                              byte_addr++;
                      }
              
                      /* 将要写入的数据写入保护缓冲区的相应区域,其余部分保留 */
                      for(i = 0; i < counter; i++)
                      {
                              protect_buffer[in_sector_begin_addr] = array[i];
                              in_sector_begin_addr++;
                      }
              
                      /* 擦除 要修改/写入 的扇区 */
                      ISP_ADDRH       =       (INT8U)(sector_addr >> 8);
                      ISP_ADDRL       =       0x00;
                      ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
                      ISP_CMD         =       ISP_CMD |       SECTOR_ERASE_AP_and_Data_Memory_Command;        /* 0000,0011 */
              
                      ISP_TRIG        =       0x46;        /* 触发ISP_IAP命令 */
                      ISP_TRIG        =       0xb9;        /* 触发ISP_IAP命令 */
                      _nop_();
              
                      /* 将保护缓冲区的数据写入 Data Flash, EEPROM */
                      byte_addr       =   sector_addr;                        /* 扇区地址为扇区首字节地址     */
                      for(i = 0; i< USED_BYTE_QTY_IN_ONE_SECTOR; i++)
                      {
                              /* 写一个字节 */
                              ISP_ADDRH       =       (INT8U)(byte_addr >> 8);
                              ISP_ADDRL       =       (INT8U)(byte_addr & 0x00ff);
                              ISP_DATA        =       protect_buffer[i];
C51 COMPILER V7.50   FLASH_EEPROM                                                          09/26/2007 17:19:05 PAGE 5   

                              ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
                              ISP_CMD         =       ISP_CMD |       PROGRAM_AP_and_Data_Memory_Command;             /* 0000,0010 */
              
                              ISP_TRIG        =       0x46;        /* 触发ISP_IAP命令 */
                              ISP_TRIG        =       0xb9;        /* 触发ISP_IAP命令 */
                              _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_();
              
                              /*  比较对错 */
                              if(ISP_DATA != protect_buffer[i])
                              {
                                      ISP_IAP_disable();
                                      return ERROR;
                      }
                      byte_addr++;
                      }
                      ISP_IAP_disable();
                      return OK;
              }
              #endif
 271          #ifdef delay
              #define delay
              void delay(INT16U counter)
              {
                      INT16U  temp    =       0;
                      for(temp = counter; temp>0; temp--)
                      {
                              _nop_();
                              _nop_();
                              _nop_();
                      }
              }
              #endif
 284          
 285          /*      display_Begin_LED();
 286                  delay(DELAY_CONST);
 287          
 288                  sector_erase(DEBUG_Data_Memory_Begin_Sector_addr);
 289                  if(byte_program_and_verify(DEBUG_Data_Memory_Begin_Sector_addr,0x55) == OK)
 290                          display_OK_LED();
 291                  else
 292                          display_ERROR_LED();  */
 293          
 294          /*
 295                  if(sequential_write_flash_in_one_sector(DEBUG_Data_Memory_Begin_Sector_addr, USED_BYTE_QTY_IN_ONE_SECTOR,
             - Test_array_total))
 296                          display_OK_LED();
 297                  else
 298                          display_ERROR_LED();
 299          */
 300          /*
 301                  if(write_flash_with_protect_in_one_sector(DEBUG_Data_Memory_Begin_Sector_addr+0x3, USED_BYTE_QTY_IN_ONE_S
             -ECTOR-0x30, Test_array_total))
C51 COMPILER V7.50   FLASH_EEPROM                                                          09/26/2007 17:19:05 PAGE 6   

 302                          display_OK_LED();
 303                  else
 304                          display_ERROR_LED();
 305          */
 306          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    328    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =    128       9
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   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 + -