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

📄 eeprom.c

📁 STC89C51RC芯片中EEPROM最简单的模块
💻 C
字号:
#include<reg51.h>
#define uchar unsigned char
#define	uint unsigned int
#define	errer  0x00;
sbit dula=P2^6;
sbit wela=P2^7;
sfr ISP_DATA=0xe2;
sfr ISP_ADDRH=0xe3;
sfr ISP_ADDRL=0xe4;
sfr ISP_CMD=0xe5;
sfr ISP_TRIG=0xe6;
sfr ISP_CONTR=0xe7;
sbit DIOLA=P2^5;
sbit deng=P1^0;
uchar xdata buffer[128];
delay5()
{;;}
delayms(uint z)
{uint x;
while(z--)
for(x=0;x<110;x++);
}
void ISP_set()							 	//开ISP功能 
{
	EA=0;
	ISP_CONTR=ISP_CONTR&0x18; 
	ISP_CONTR=0xc1;
}
void ISP_close()							//关ISP功能 
{
	ISP_CONTR=0x7f;
	ISP_TRIG=0;
	EA=1;
}

void ISP_write(uint add,uchar date)			//写字节 
{	
	ISP_DATA=date;
	ISP_ADDRH=(add>>8);						//写入数据	
	ISP_ADDRL=(add&0x00ff);	
	ISP_set();	
	ISP_TRIG=0x46;
	ISP_TRIG=0xb9;
	ISP_CMD=ISP_CMD&0xf8;
	ISP_CMD=ISP_CMD|0x02;					//11111010 写字节 
	delay5();										
	ISP_close();
}
uchar ISP_read(uint add)					//读字节 
{	
	ISP_ADDRH=(add>>8);
	ISP_ADDRL=(add&0x00ff);	
	ISP_set();	
	ISP_TRIG=0x46;
	ISP_TRIG=0xb9;	
	ISP_CMD=ISP_CMD&0xf8;
	ISP_CMD=ISP_CMD|0x01;						//11111001 读字节
	delay5();					
	ISP_close();
	return ISP_DATA;
}
void ISP_clean(uint add)					//擦除扇区 
{	
	uint flash_ADDR=0;
	flash_ADDR=(add&0xfe00);				//1111111000000000;取扇区地址
	ISP_ADDRH=(flash_ADDR>>8);
	ISP_ADDRL=0x00;	
	ISP_set();
	ISP_TRIG=0x46;
	ISP_TRIG=0xb9;		
	ISP_CMD=ISP_CMD&0xf8;
	ISP_CMD=ISP_CMD|0x03;					//11111011	擦除
	delay5();
	ISP_close();
}
/*
//写数据进 数据Flash存储器, 只在同一个扇区内写,不保留原有数据	
//add,被写数据Flash开始地址;count,连续写多少个字节; *s,数据来源
ISP_array(uint add,uint count,uchar *s)
{
	uint flash_ADDR=0,byte_add=0;
	byte_add=add;
	flash_ADDR=add&0x01ff;
	if((flash_ADDR+count)>128)
	return errer;
	flash_ADDR=(add&0xfe00);				//1111111000000000;取扇区地址
	ISP_ADDRH=(flash_ADDR>>8);
	ISP_ADDRL=0x00;	
	ISP_CMD=ISP_CMD&0xf8;
	ISP_CMD=ISP_CMD|0x03;
	ISP_set();
	ISP_TRIG=0x46;
	ISP_TRIG=0xb9;
	delay5();
	while(count--)
	{	
		ISP_ADDRH=(uchar)(byte_add>>8);						
		ISP_ADDRL=(uchar)(byte_add&0x00ff);
		ISP_DATA=*s;
//		if(byte_add==0x1004)
//		ISP_DATA=0xf0;
		ISP_CMD=ISP_CMD&0xf8;
		ISP_CMD=ISP_CMD|0x02;					//11111010 写字节 		
		ISP_TRIG=0x46;
		ISP_TRIG=0xb9;
		delay5();	
		
		ISP_DATA=0;

		ISP_CMD=ISP_CMD&0xf8;
		ISP_CMD=ISP_CMD|0x01;						//11111001 读字节	
		ISP_TRIG=0x46;
		ISP_TRIG=0xb9;
		delay5();
		
		delayms(200);
		DIOLA=0;
		P1=ISP_DATA;
		DIOLA=1;
		byte_add++;
	}
	ISP_close();
}*/
// 写数据进数据Flash存储器(EEPROM), 只在同一个扇区内写,保留同一扇区中不需修改的数据	 
//  begin_addr,被写数据Flash开始地址;counter,连续写多少个字节; array[],数据来源	 
ISP_array_keep(uint add,uint count,uchar *s)
{
	uint flash_add=0,byte_add=0,i=0,begin_add=0;
	begin_add=add&0x01ff;						//开始地址
	if((begin_add+count)>128)
	return errer;
	flash_add=add&0xfe00;						//扇区地址
	byte_add=add;
	//功能:读出
	ISP_set();									
	for(i=0;i<128;i++)
	{	
	ISP_ADDRH=(uchar)(byte_add>>8);
	ISP_ADDRL=(uchar)(byte_add&0x00ff);	
	ISP_CMD=ISP_CMD&0xf8;
	ISP_CMD=ISP_CMD|0x01;		
	ISP_TRIG=0x46;
	ISP_TRIG=0xb9;						
	delay5();
	buffer[i]=ISP_DATA;
	byte_add++;
	}
	//将要写入的数据写入保护缓冲区的相应区域,其余部分保留 
	for(i=0;i<count;i++)
	{
	buffer[begin_add]=*(s++);
	begin_add++;
	}
	//擦除要写入/修改的扇区
	ISP_ADDRH=(flash_add>>8);
	ISP_ADDRL=0x00;	
	ISP_CMD=ISP_CMD&0xf8;
	ISP_CMD=ISP_CMD|0x03;
	ISP_TRIG=0x46;
	ISP_TRIG=0xb9;
	delay5();	
	//写入保护缓冲区的数据 
	for(i=0;i<128;i++)	
	{	
		ISP_ADDRH=(uchar)(byte_add>>8);						
		ISP_ADDRL=(uchar)(byte_add&0x00ff);
		ISP_DATA=buffer[i];	
		ISP_CMD=ISP_CMD&0xf8;
		ISP_CMD=ISP_CMD|0x02;						
		ISP_TRIG=0x46;
		ISP_TRIG=0xb9;
		delay5();	
		
		ISP_DATA=0;

		ISP_CMD=ISP_CMD&0xf8;
		ISP_CMD=ISP_CMD|0x01;						//11111001 读字节	
		ISP_TRIG=0x46;
		ISP_TRIG=0xb9;
		delay5();
		
		delayms(200);
		DIOLA=0;
		P1=ISP_DATA;
		DIOLA=1;
		byte_add++;
	}
	ISP_close();
}

main()
{
	uchar tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};		
	while(1)
	{
		ISP_array_keep(0x4000,8,tab);	
	}	
}

⌨️ 快捷键说明

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