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

📄 eeprom.c

📁 STC单片机读写eeprom源程序
💻 C
字号:

#include "REG52.H"
#define      uint8   unsigned char
#define      Uint8   unsigned char
#define      uint16  unsigned int
#define      Uint16  unsigned int
#include     <intrins.h>
#include     <absacc.h>
#include     <math.h>
#include     <string.h>
//#include "SYSTEM.H"   
/*****************************************
STC单片机EEPROM操作
每个扇区512字节的空间, 只是用低128字节
58系列单片机有58个扇区
EEPROM起始地址0x8000
******************************************/
#ifndef 	__DATAFLASH_C__
#define		__DATAFLASH_C__
#endif


//命令
#define READ_BYTE		0x01
#define WRITE_BYTE		0x02
#define EARSE_SECTOR	        0x03
#define WAIT_TIME		0x0
//#define MAX_BYTE_USED	        512  //每扇区最大存储空间

#define DEBUG_STC89C_LE52RC

#ifdef DEBUG_STC89C_LE58RD                        //STC89C58RD+,  89LE58RD+
	#define EEPROM_start       0x8000 //58单片机的eepeom的起始地址
#endif
#ifdef DEBUG_STC89C_LE52RC                        //STC89C52RC,        89LE52RC
	#define EEPROM_start       0x2000 //58单片机的eepeom的起始地址
#endif
#ifdef DEBUG_STC89C_LE54RC                        //STC89C54RC,        89LE54RC
	#define EEPROM_start       0x8000 //58单片机的eepeom的起始地址
#endif
 

/************************/
sfr ISP_DATA    = 0xe2;
sfr ISP_ADDR_H 	= 0xe3;
sfr ISP_ADDR_L 	= 0xe4;
sfr ISP_CMD	= 0xe5;
sfr ISP_TRIG	= 0xe6;
sfr ISP_CONTR	= 0xe7;
/************************/
Uint8 rdByte(Uint16 addr)
{
	  //addr = addr+EEPROM_start;
		ISP_ADDR_H = (Uint8)(addr>>8);
		ISP_ADDR_L = (Uint8)(addr&0x00ff);
		ISP_CMD = READ_BYTE;
		ISP_CONTR = (WAIT_TIME | 0x80);
		ISP_TRIG = 0x46;
		ISP_TRIG = 0xb9;
		_nop_();
		ISP_CONTR &= 0x7f;
		ISP_TRIG = 0x00;
		return(ISP_DATA);
}		

/*addr-字节的地址,buffer[]-读的数据所在的数组,len-读的数据的长度*/			
void rdData(unsigned int addr, unsigned char buffer[], unsigned int len)
{
		Uint16 i;
		EA = 0;
		addr = addr+EEPROM_start;
		for(i=0; i<len; i++)
		{
				buffer[i]=rdByte(addr++);
		}
		EA = 1;
}				

void earseSector(unsigned int addr)
{
	  EA = 0;
		addr = addr+EEPROM_start;
		addr &= 0xfe00;										/*块的起始地址*/
		ISP_ADDR_H = (Uint8)(addr>>8);
		ISP_ADDR_L = (Uint8)(addr&0x00ff);
		ISP_CMD = EARSE_SECTOR;
		ISP_CONTR = (WAIT_TIME | 0x80);
		ISP_TRIG = 0x46;
		ISP_TRIG = 0xb9;
		_nop_();_nop_();_nop_();
		ISP_CONTR &= 0x7f;
		ISP_TRIG = 0x00;
		EA = 1;
}	
	
void wrByte(Uint16 addr, Uint8 byte)
{		
		ISP_ADDR_H = (Uint8)(addr>>8);
		ISP_ADDR_L = (Uint8)(addr&0x00ff);
		ISP_CMD = WRITE_BYTE;
		ISP_DATA = byte;
		ISP_CONTR = (WAIT_TIME | 0x80);
		ISP_TRIG = 0x46;
		ISP_TRIG = 0xb9;
		_nop_();
		ISP_CONTR &= 0x7f;
		ISP_TRIG = 0x00;
}	

/*addr-字节的地址,buffer[]-要写的数据的数组,len-写的数据的长度*/	
void wrData(unsigned int addr, unsigned char buffer[], unsigned int len)
{
		Uint8 i;
		EA = 0;
		addr = addr+EEPROM_start;
		for(i=0; i<len; i++)
		{
				wrByte(addr+i, buffer[i]);			/*写入整个数组*/
		}		
		EA = 1;
}				
		 

⌨️ 快捷键说明

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