📄 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 + -