#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內部EEPROM詳細地址表*/
/*===========================================================================================
第一扇區 第二扇區 第三扇區 第四扇區
起始地址 結束地址 起始地址 結束地址 起始地址 結束地址 起始地址 結束地址
2000h 21FFh 2200h 23FFh 2400h 25FFh 2600h 27FFH
==============================================================================================
第五扇區 第六扇區 第七扇區 第八扇區
起始地址 結束地址 起始地址 結束地址 起始地址 結束地址 起始地址 結束地址
2800h 29FFh 2A00h 2BFFh 2C00h 2DFFh 2E00h 2FFFh
==============================================================================================*/
/*
擦除某一扇區(每個扇區512字節)
入口:addr = 某一扇區首地址*/
void eepromErase(uint addr)
{
// 打開 IAP 功能(ISP_CONTR.7)=1:允許編程改變Flash, 設置Flash操作等待時間
// 0x83(晶振<5M) 0x82(晶振<10M) 0x81(晶振<20M) 0x80(晶振<40M)
ISP_CONTR = 0x81;
ISP_CMD = 0x03; //用戶可以對"Data Flash/EEPROM區"進行扇區擦除
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(); // 關閉ISP/IAP
}
/*寫一字節
入口:addr = 扇區單元地址 , dat = 待寫入數據*/
void eepromWriteByte(uint addr, uchar dat)
{
ISP_CONTR = 0x81;
ISP_CMD = 0x02; //用戶可以對"Data Flash/EEPROM區"進行字節編程
ISP_ADDRL = addr;
ISP_ADDRH = addr>>8;
ISP_DATA = dat; //數據進ISP_DATA
ISP_TRIG = 0x46;
ISP_TRIG = 0xB9;
_nop_();
eepromClose(); //關閉ISP/IAP
}
/*讀一字節
入口:addr = 扇區單元地址
出口:dat = 讀出的數據*/
uchar eepromReadByte(uint addr)
{
uchar dat;
ISP_CONTR = 0x81;
ISP_CMD = 0x01; // 用戶可以對"Data Flash/EEPROM區"進行字節讀
ISP_ADDRL = addr;
ISP_ADDRH = addr>>8;
ISP_TRIG = 0x46;
ISP_TRIG = 0xB9;
_nop_();
dat = ISP_DATA; // 取出數據
eepromClose(); // 關閉ISP/IAP
return dat;
}
/*關閉ISP/IAP操作*/
void eepromClose(void)
{
ISP_CONTR = 0; // 關閉IAP功能
ISP_CMD = 0; // 待機模式,無ISP操作
ISP_TRIG = 0; // 關閉IAP功能, 清與ISP有關的特殊功能寄存器
ISP_ADDRH = 0x80;
ISP_ADDRL = 0;
}