以下程序来自网络,仅供参考
stc eeprom的实用读写演示,提供了一种eeprom动态分配的实施方法
sfr isp_data=0xe2;
sfr isp_addrh=0xe3;
sfr isp_addrl=0xe4;
sfr isp_cmd=0xe5;
sfr isp_trig=0xe6;
sfr isp_contr=0xe7;
unsigned char eeprom_read(unsigned int addres);
void eeprom_write(unsigned int address,unsigned char wdata);
void eeprom_eares(unsigned int addres);//扇区擦除。
void eeprom_eares(unsigned int addres)//扇区擦除。
{unsigned i;
isp_addrl=addres; //低位地址
isp_addrh=addres>>8; //高位地址
isp_contr=0x01;
isp_contr=isp_contr|0x80; //设时间与充ISP操作。
isp_cmd=0x03; //扇区命命令
isp_trig=0x46; //触发
isp_trig=0xb9; //触发启动。
for(i=0;i<3;i++);
isp_addrl=0xff;
isp_addrh=0xff;
isp_contr=0x00;
isp_cmd=0x00;
isp_trig=0x00;
}
void eeprom_write(unsigned int addres,unsigned char write_data)//写数据。
{unsigned char i;
isp_data=write_data; //要写入的数据。
isp_addrl=addres; //低位地址
isp_addrh=addres>>8; //高位地址
isp_contr=0x01;
isp_contr=isp_contr|0x80; //设时间与充ISP操作。
isp_cmd=0x02; //写命令
isp_trig=0x46; //触发
isp_trig=0xb9; //触发启动。
for(i=0;i<3;i++);
isp_addrl=0xff;
isp_addrh=0xff;
isp_contr=0x00;
isp_cmd=0x00;
isp_trig=0x00;
}
unsigned char eeprom_read(unsigned int addres)
{unsigned char i,z;
isp_addrl=addres; //低位地址
isp_addrh=addres>>8; //高位地址
isp_contr=0x01;
isp_contr=isp_contr|0x80; //设时间与充ISP操作。
isp_cmd=0x01; //写命令
isp_trig=0x46; //触发
isp_trig=0xb9; //触发启动。
for(i=0;i<3;i++);
isp_addrl=0xff;
isp_addrh=0xff;
isp_contr=0x00;
isp_cmd=0x00;
isp_trig=0x00;
z=isp_data;
return(z);
}
一个汇编的:
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;;; 内部EEPROM读写定义
ISP_DATA EQU 0E2H ;写入读出数据寄存器.
ISP_ADDRH EQU 0E3H ;地址寄存器高8位
ISP_ADDRL EQU 0E4H ;地址寄存器低8位
ISP_CMD EQU 0E5H ;命令模式寄存器
ISP_TRIG EQU 0E6H ;命令触发寄存器
ISP_CONTR EQU 0E7H ;ISP/IAP控制寄存器.
ISP_IAP_BYTE_READ EQU 1 ;字节读
ISP_IAP_BYTE_PROGRAM EQU 2 ;字节编程,要空才能写
ISP_IAP_SECTOR_ERASE EQU 3 ;扇区擦除,
WAIT_TIME EQU 1 ;20M以下为1
BYTE_ADDR_HIGH EQU 60H ;高位地址
BYTE_ADDR_LOW EQU 61H ;低位地址
BYTE_WRITE_DATA EQU 62H ;要写入的数据
;***********************内部EEPROM操作*************************
READ_EEPROM:MOV ISP_ADDRH,ISP_ADDRH ;送高地址
MOV ISP_ADDRL,ISP_ADDRL ;送低地址
MOV ISP_CONTR,#01h ;设置等等待时间
ORL ISP_CONTR,#80h ;允许ISP/IAP操作
MOV ISP_CMD,#01h ;送读命令
MOV ISP_TRIG,#46H ;触发
MOV ISP_TRIG,#0B9H ;触发启动.
NOP
NOP
MOV ISP_CONTR,#00H
MOV ISP_CMD,#00H
MOV ISP_TRIG,#00H
MOV ISP_ADDRH,#0FFH
MOV ISP_ADDRL,#0FFH
MOV 6AH,ISP_DATA ;读出的数据放到6AH单元中。
RET
WRITE_EARES: MOV WDT,#34H
CLR EA ;关中断
MOV ISP_ADDRH,ISP_ADDRH ;送高地址
MOV ISP_ADDRL,ISP_ADDRL ;送低地址
MOV ISP_CONTR,#1h ;设置等等待时间
ORL ISP_CONTR,#10000000B ;允许ISP/IAP操作
MOV ISP_CMD,#3h ;送扇区命令
MOV ISP_TRIG,#46H ;触发
MOV ISP_TRIG,#0B9H ;触发启动.
NOP
NOP
MOV ISP_CONTR,#00H
MOV ISP_CMD,#00H
MOV ISP_TRIG,#00H
MOV ISP_ADDRH,#0FFH
MOV ISP_ADDRL,#0FFH
SETB EA
RET
WRITE_EEPROM:MOV WDT,#34H
CLR EA
MOV ISP_DATA,BYTE_WRITE_DATA ;要写入的数据
MOV ISP_ADDRH,ISP_ADDRH ;送高地址
MOV ISP_ADDRL,ISP_ADDRL ;送低地址
MOV ISP_CONTR,#1h ;设置等等待时间
ORL ISP_CONTR,#10000000B ;允许ISP/IAP操作
MOV ISP_CMD,#02h ;送写命令
MOV ISP_TRIG,#46H ;触发
MOV ISP_TRIG,#0B9H ;触发启动.
NOP
NOP
MOV ISP_CONTR,#00H
MOV ISP_CMD,#00H
MOV ISP_TRIG,#00H
MOV ISP_ADDRH,#0FFH
MOV ISP_ADDRL,#0FFH
SETB EA