#ifndef EEPROM_H
#define EEPROM_H
#include "common.h"
sfr ISP_DATA = 0xe2; //寄存器申明
sfr ISP_ADDRH = 0xe3;
sfr ISP_ADDRL = 0xe4;
sfr ISP_CMD = 0xe5;
sfr ISP_TRIG = 0xe6;
sfr ISP_CONTR = 0xe7;
void eepromErase(uint addr);
void eepromWriteByte(uint addr, uchar dat);
uchar eepromReadByte(uint addr);
void eepromClose(void);
#endif
/**************************************************/
#include "eeprom.h"
#include <reg52.h>
#include <intrins.h>
/*STC89C52RC內(nèi)部EEPROM詳細(xì)地址表*/
/*===========================================================================================
第一扇區(qū) 第二扇區(qū) 第三扇區(qū) 第四扇區(qū)
起始地址 結(jié)束地址 起始地址 結(jié)束地址 起始地址 結(jié)束地址 起始地址 結(jié)束地址
2000h 21FFh 2200h 23FFh 2400h 25FFh 2600h 27FFH
==============================================================================================
第五扇區(qū) 第六扇區(qū) 第七扇區(qū) 第八扇區(qū)
起始地址 結(jié)束地址 起始地址 結(jié)束地址 起始地址 結(jié)束地址 起始地址 結(jié)束地址
2800h 29FFh 2A00h 2BFFh 2C00h 2DFFh 2E00h 2FFFh
==============================================================================================*/
/*
擦除某一扇區(qū)(每個扇區(qū)512字節(jié))
入口:addr = 某一扇區(qū)首地址*/
void eepromErase(uint addr)
{
// 打開 IAP 功能(ISP_CONTR.7)=1:允許編程改變Flash, 設(shè)置Flash操作等待時間
// 0x83(晶振<5M) 0x82(晶振<10M) 0x81(晶振<20M) 0x80(晶振<40M)
ISP_CONTR = 0x81;
ISP_CMD = 0x03; //用戶可以對"Data Flash/EEPROM區(qū)"進(jìn)行扇區(qū)擦除
ISP_ADDRL = addr; // ISP/IAP操作時的地址寄存器低八位,
ISP_ADDRH = addr>>8; // ISP/IAP操作時的地址寄存器高八位。
ISP_TRIG = 0x46; // 在ISPEN(ISP_CONTR.7)=1時,對ISP_TRIG先寫入46h,
ISP_TRIG = 0xB9; // 再寫入B9h,ISP/IAP命令才會生效。
_nop_();
eepromClose(); // 關(guān)閉ISP/IAP
}
/*寫一字節(jié)
入口:addr = 扇區(qū)單元地址 , dat = 待寫入數(shù)據(jù)*/
void eepromWriteByte(uint addr, uchar dat)
{
ISP_CONTR = 0x81;
ISP_CMD = 0x02; //用戶可以對"Data Flash/EEPROM區(qū)"進(jìn)行字節(jié)編程
ISP_ADDRL = addr;
ISP_ADDRH = addr>>8;
ISP_DATA = dat; //數(shù)據(jù)進(jìn)ISP_DATA
ISP_TRIG = 0x46;
ISP_TRIG = 0xB9;
_nop_();
eepromClose(); //關(guān)閉ISP/IAP
}
/*讀一字節(jié)
入口:addr = 扇區(qū)單元地址
出口:dat = 讀出的數(shù)據(jù)*/
uchar eepromReadByte(uint addr)
{
uchar dat;
ISP_CONTR = 0x81;
ISP_CMD = 0x01; // 用戶可以對"Data Flash/EEPROM區(qū)"進(jìn)行字節(jié)讀
ISP_ADDRL = addr;
ISP_ADDRH = addr>>8;
ISP_TRIG = 0x46;
ISP_TRIG = 0xB9;
_nop_();
dat = ISP_DATA; // 取出數(shù)據(jù)
eepromClose(); // 關(guān)閉ISP/IAP
return dat;
}
/*關(guān)閉ISP/IAP操作*/
void eepromClose(void)
{
ISP_CONTR = 0; // 關(guān)閉IAP功能
ISP_CMD = 0; // 待機(jī)模式,無ISP操作
ISP_TRIG = 0; // 關(guān)閉IAP功能, 清與ISP有關(guān)的特殊功能寄存器
ISP_ADDRH = 0x80;
ISP_ADDRL = 0;
}