#include
#include
//定义类型,方便代码移植
typedef unsigned char UINT8;
typedef unsigned int UINT16;
typedef unsigned long UINT32;
typedef char INT8;
typedef int INT16;
typedef long INT32;
static UINT8 i=0;
/*
定义寄存器 ISP
*/
sfr ISP_DATA= 0xe2; // Flash数据寄存器
sfr ISP_ADDRH= 0xe3;// Flash高字节地址寄存器
sfr ISP_ADDRL= 0xe4;// Flash低字节地址寄存器
sfr ISP_CMD= 0xe5;// Flash命令模式寄存器
sfr ISP_TRIG= 0xe6;// Flash命令触发寄存器
sfr ISP_CONTR= 0xe7;// ISP/IAP 控制寄存器
#define NOP() _nop_()
#define EEPROM_START_ADDRESS 0X2000
#define LED_PORT P2
//微秒级延时
void DelayNus(UINT16 t)
{
UINT16 d=0;
d=t;
do
{
NOP();
}while(--d > 0);
}
//毫秒级延时
void DelayNms(UINT16 t)
{
do
{
DelayNus(1000);
}while(--t > 0);
}
//EEPROM使能
void EEPROMEnable(void)
{
ISP_CONTR=0x81;//使能并设置好等待时间
}
//EEPROM禁用
void EEPROMDisable(void)
{
ISP_CONTR=0x00;//禁止EEPROM
ISP_CMD = 0X00;//无ISP操作
ISP_TRIG = 0X00;//清零
ISP_ADDRH = 0X00;//清零
ISP_ADDRL = 0X00;//清零
}
//eeprom 设置读写地址(相对地址)
void EEPROMSetAddress(UINT16 addr)
{
addr+=EEPROM_START_ADDRESS;//初始化地址
ISP_ADDRH=(UINT8)(addr>>8);//设置读写地址高字节
ISP_ADDRL=(UINT8) addr; //设置读写地址低字节
}
//EEPROM启动
void EEPROMStart(void)
{
ISP_TRIG=0x46;
ISP_TRIG=0xB9;
}
//EEPROM读取单个字节
UINT8 EEPROMReadByte(UINT16 addr)
{
ISP_DATA=0X00;
ISP_CMD=0X01;
EEPROMEnable();
EEPROMSetAddress(addr);
EEPROMStart();
DelayNus(10);//读取一个字节需要10us
EEPROMDisable();
return (ISP_DATA);
}
//EEPROM写入单个字节
UINT8 EEPROMWriteByte(UINT16 addr,UINT8 byte)
{
EEPROMEnable();
ISP_CMD=0X02;
EEPROMSetAddress(addr);
ISP_DATA=byte;
EEPROMStart();
DelayNus(60);
EEPROMDisable();
}
//EEPROM扇区擦除
UINT8 EEPROMSectorErase(UINT16 addr)
{
ISP_CMD=0X03;
EEPROMEnable();
EEPROMSetAddress(addr);
EEPROMStart();
DelayNus(10);//
EEPROMDisable();
}
void main(void)
{
EEPROMSectorErase(0);
EEPROMWriteByte(0,0x0f);
i=EEPROMReadByte(0);
LED_PORT = i;
while(1);
}
现象: