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

📄 eeprom.c

📁 基于KEIL51的一款高性能的数字功放的完整代码
💻 C
字号:
 
#include <config.h>



#define IN_EEPROM

#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 触发寄存器,每次都需如此
//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;
}

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;
//	 rs232_senddata(0x84);
//	 rs232_senddata(0x02);

	 }

}


#endif



⌨️ 快捷键说明

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