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

📄 eeprom.c

📁 stc-isp开发板驱动程序
💻 C
字号:
#include <config.h>

#define IN_EEPROM

#if  EEPROM_USING

#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    10
unsigned char xdata  eeprom_buffer[EEPROM_MAX_BUFFER];
//-----------------------------------------------------------------------------
// ----eeprom的读,需要指定地址,每次固定读入一定
void eeprom_read(void)
{
//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;

 for(i=0x00;i<EEPROM_MAX_BUFFER;i++)
    { ISP_ADDRH  = 0x28;		//选择第二扇区
	  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(void)  //eeprom写入
{
//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;

 for(i=0x00;i<EEPROM_MAX_BUFFER;i++)
    { ISP_DATA=eeprom_buffer[i];
	  ISP_ADDRH  = 0x28;			   //选择第二扇区
	  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(void)
{
//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;

  ISP_ADDRH  = 0x28;
  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 xdata eeprom_operatemode=0x01;
void eeprom_process(void)
{if(eeprom_operatemode==0x01)	//读出
   {eeprom_read();
	if((eeprom_buffer[8]==0x55)&&(eeprom_buffer[9]==0xaa))
	  {exhaust_number=eeprom_buffer[3]*1000+eeprom_buffer[2]*100+eeprom_buffer[1]*10+eeprom_buffer[0];
	   authorize_number=eeprom_buffer[7]*1000+eeprom_buffer[6]*100+eeprom_buffer[5]*10+eeprom_buffer[4];
	   eeprom_operatemode=0x00;
	   }
	else									//否则初始化
	   {exhaust_number=0x00;
	    authorize_number=1000;
		eeprom_operatemode=0x00;
        }
   }
 else if(eeprom_operatemode==0x02)	//写入
         {eeprom_earse();
		  eeprom_buffer[0]=exhaust_number%10;
          eeprom_buffer[1]=(exhaust_number%100)/10;
          eeprom_buffer[2]=(exhaust_number%1000)/100;
	      eeprom_buffer[3]=exhaust_number/1000;
	      eeprom_buffer[4]=authorize_number%10;
	      eeprom_buffer[5]=(authorize_number%100)/10;
 	      eeprom_buffer[6]=(authorize_number%1000)/100;
	      eeprom_buffer[7]=authorize_number/1000;
		  eeprom_buffer[8]=0x55;
          eeprom_buffer[9]=0xaa;
          eeprom_write();
		  eeprom_operatemode=0x00;
	     }
 }


#endif



⌨️ 快捷键说明

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