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

📄 eeprom.lst

📁 基于KEIL51的一款高性能的数字功放的完整代码
💻 LST
字号:
C51 COMPILER V8.05a   EEPROM                                                               10/25/2006 17:36:37 PAGE 1   


C51 COMPILER V8.05a, COMPILATION OF MODULE EEPROM
OBJECT MODULE PLACED IN eeprom.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE eeprom.c OMF2 BROWSE DEBUG

line level    source

   1           
   2          #include <config.h>
   3          
   4          
   5          
   6          #define IN_EEPROM
   7          
   8          #if  EEPROM_USING
              
              sfr  ISP_DATA  = 0xE2;
              sfr  ISP_ADDRH = 0xE3;
              sfr  ISP_ADDRL = 0xE4;
              sfr  ISP_CMD   = 0xE5;
              sfr  ISP_TRIG  = 0xE6;
              sfr  ISP_CONTR = 0xE7;//
              #define  ISP_IAP_BYTE_READ     0x01;//字节读
              #define  ISP_IAP_BYTE_PROGRAM  0x02;//字节编程, 前提是该字节是空,0FFh
              #define  ISP_IAP_SECTOR_ERASE  0x03;//扇区擦除, 要某字节为空,要擦一扇区
              #define  WAIT_TIME             0x01;//设置等待时间,30MHz 以下0,24M 以下1,
              #define  ENABLE_ISP            0x81;// <24MHz
              
              #define   EEPROM_MAX_BUFFER    0x10
              #if   XDATA_USING
              unsigned char xdata  eeprom_buffer[EEPROM_MAX_BUFFER];
              #else
              unsigned char idata  eeprom_buffer[EEPROM_MAX_BUFFER];
              #endif
              // -----------------------------------------------------------------------------
              // ------ EEPROM的数据初始化 -------------------------------------------------
              void eeprom_initialize(void) 
              {
              
              
              }
              
              
              // ;ENABLE_ISP EQU 80H ;<30MHz
              // ;ENABLE_ISP EQU 81H ;<24MHz
              // ;ENABLE_ISP EQU 82H ;<20MHz
              // ;ENABLE_ISP EQU 83H ;<12MHz
              // ;ENABLE_ISP EQU 84H ;<6MHz
              // ;ENABLE_ISP EQU 85H ;<3MHz
              // ;ENABLE_ISP EQU 86H ;<2MHz
              // ;ENABLE_ISP EQU 87H ;<1MHz
              
              //-----------------------------------------------------------------------------
              // ----eeprom的读,需要指定地址,每次固定读入一定的字节数
              void eeprom_read(unsigned char idata sectors)
              {
              //MOV ISP_ADDRH, #BYTE_ADDR_HIGH ;送地址高字节
              //MOV ISP_ADDRL, #BYTE_ADDR_LOW ;送地址低字节
              //MOV ISP_CONTR, #WAIT_TIME ;设置等待时间
              //ORL ISP_CONTR, #10000000B ;允许ISP/IAP 操作
              //MOV ISP_CMD, #ISP_IAP_BYTE_READ ;送字节读命令,命令不需改变时,不需重新送命令
              //MOV ISP_TRIG, #46h ;先送46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
C51 COMPILER V8.05a   EEPROM                                                               10/25/2006 17:36:37 PAGE 2   

              //MOV ISP_TRIG, #0B9h ;送完B9h 后,ISP/IAP 命令立即被触发起动
               unsigned char idata   i=0x00;
               unsigned char idata   eeprom_h_address=0x10;
               
               eeprom_h_address=0x10+sectors;  //  由于只使用eeprom的几个字节而已故不要考虑溢出问题  
              
               for(i=0x00;i<EEPROM_MAX_BUFFER;i++)
                  { ISP_ADDRH  = eeprom_h_address;
                        ISP_ADDRL  = i;
                        ISP_CONTR  = WAIT_TIME;
                        ISP_CONTR |= 0x80;
                    ISP_CMD    = ISP_IAP_BYTE_READ;
                        EA = 0x00;
                        ISP_TRIG   = 0x46;
                        ISP_TRIG   = 0xb9;
                        EA = 0x01;
                        eeprom_buffer[i]=ISP_DATA;  
                       }       
              // -----------关闭ISP/IAP功能---------------
                ISP_CONTR = 0x00;
                ISP_CMD   = 0x00;
                ISP_TRIG  = 0x00;
                ISP_ADDRH = 0x00;
                ISP_ADDRL = 0x00;
              }
              
              void eeprom_write(unsigned char idata sectors)
              {
              //MOV ISP_DATA, #ONE_DATA ;送字节编程数据到ISP_DATA
              //MOV ISP_ADDRH, #BYTE_ADDR_HIGH ;送地址高字节
              //MOV ISP_ADDRL, #BYTE_ADDR_LOW ;送地址低字节
              //MOV ISP_CONTR, #WAIT_TIME ;设置等待时间
              //ORL ISP_CONTR, #10000000B ;允许ISP/IAP 操作
              //MOV ISP_CMD, #ISP_IAP_BYTE_PROGRAM ;送字节编程命令
              //MOV ISP_TRIG, #46h ;先送46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
              //MOV ISP_TRIG, #0B9h ;送完B9h 后,ISP/IAP 命令立即被触发起动
              
               unsigned char idata   i=0x00;
               unsigned char idata   eeprom_h_address=0x10;
               
               eeprom_h_address=0x10+sectors;  //  由于只使用eeprom的几个字节而已故不要考虑溢出问题  
              
               for(i=0x00;i<EEPROM_MAX_BUFFER;i++)
                  { ISP_DATA=eeprom_buffer[i];
                        ISP_ADDRH  = eeprom_h_address;
                        ISP_ADDRL  = i;
                        ISP_CONTR  = WAIT_TIME;
                        ISP_CONTR |= 0x80;
                    ISP_CMD    = ISP_IAP_BYTE_PROGRAM;
                        EA = 0x00;
                        ISP_TRIG   = 0x46;
                        ISP_TRIG   = 0xb9;
                        EA = 0x01;        
                       }       
              // -----------关闭ISP/IAP功能---------------
                ISP_CONTR = 0x00;
                ISP_CMD   = 0x00;
                ISP_TRIG  = 0x00;
                ISP_ADDRH = 0x00;
                ISP_ADDRL = 0x00;
              }
              
C51 COMPILER V8.05a   EEPROM                                                               10/25/2006 17:36:37 PAGE 3   

              void eeprom_earse(unsigned char idata sectors)
              {
              //MOV ISP_ADDRH, #SECTOR_FIRST_BYTE_ADDR_HIGH ;送扇区起始地址高字节
              //MOV ISP_ADDRL, #SECTOR_FIRST_BYTE_ADDR_LOW ;送扇区起始地址低字节
              //MOV ISP_CONTR, #WAIT_TIME ;设置等待时间
              //ORL ISP_CONTR, #10000000B ;允许ISP/IAP
              //MOV ISP_CMD, #ISP_IAP_SECTOR_ERASE ;送扇区擦除命令,命令不需改变时,不需重新送命令
              //MOV ISP_TRIG, #46h ;先送46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
              //MOV ISP_TRIG, #0B9h ;送完B9h 后,ISP/IAP 命令立即被触发起动
               unsigned char idata   i=0x00;
               unsigned char idata   eeprom_h_address=0x10;
               
               eeprom_h_address=0x10+sectors;  //  由于只使用eeprom的几个字节而已故不要考虑溢出问题  
              
                ISP_ADDRH  = eeprom_h_address;
                ISP_ADDRL  = 0x80;    //指定该扇区的任何一个地址即可
                ISP_CONTR  = WAIT_TIME;
                ISP_CONTR |= 0x80;
                ISP_CMD    = ISP_IAP_SECTOR_ERASE;
                EA = 0x00;
                ISP_TRIG   = 0x46;
                ISP_TRIG   = 0xb9;
                EA = 0x01;        
              // -----------关闭ISP/IAP功能---------------
                ISP_CONTR = 0x00;
                ISP_CMD   = 0x00;
                ISP_TRIG  = 0x00;
                ISP_ADDRH = 0x00;
                ISP_ADDRL = 0x00;
              
              }
              
              // -----------------------------------------------------------------------------
              // ----- EEPROM的数据处理 ----------------------------------------------------
              unsigned char idata  eeprom_operatemode=0x00;  //参数的写入或者读出
              
              void eeprom_process(void)
              {unsigned char idata i=0x00;
               if(eeprom_operatemode==0x01)   //读出
                  {
                       eeprom_read(0x00);
                   if((eeprom_buffer[0]==0x55)&&(eeprom_buffer[1]==0xaa))      //验证正确
                         {master_volume=eeprom_buffer[2]; //音量的控制
                          music_mode=eeprom_buffer[3]; //音乐模式的控制
                          } 
                   else
                         {master_volume=32;  //取得默认值
                          music_mode=0x00;
                          }
                       eeprom_operatemode=0x00;
                      // rs232_senddata(0x84);
                      // rs232_senddata(0x01);
              
                       }
               else if(eeprom_operatemode==0x02)      //写入
                  {eeprom_earse(0x00);
                   eeprom_buffer[0]=0x55;
                   eeprom_buffer[1]=0xaa;
                   eeprom_buffer[2]=master_volume;
                   eeprom_buffer[3]=music_mode; 
                       eeprom_write(0x00);
                       eeprom_operatemode=0x00;
C51 COMPILER V8.05a   EEPROM                                                               10/25/2006 17:36:37 PAGE 4   

              //       rs232_senddata(0x84);
              //       rs232_senddata(0x02);
              
                       }
              
              }
              
              
              #endif
 189          
 190          
 191          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   ----    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
   EDATA SIZE       =   ----    ----
   HDATA SIZE       =   ----    ----
   XDATA CONST SIZE =   ----    ----
   FAR CONST SIZE   =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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