您的位置 首页 5G

STC单片机EEPROM功能模块

STC单片机EEPROM功能模块includeSTCSTC12C2052ADh>includeintrinsh>声明与IAP相关的SFRsfrIAP_DATA=0xE2;sfrIAP

// STC单片机EEPROM功用模块

#include
#include

// 声明与IAP相关的SFR
sfr IAP_DATA = 0xE2;
sfr IAP_ADDRH = 0xE3;
sfr IAP_ADDRL = 0xE4;
sfr IAP_CMD = 0xE5;
sfr IAP_TRIG = 0xE6;
sfr IAP_CONTR = 0xE7;

// 界说ISP/IAP/EEPROM指令
#define CMD_IDLE 0
#define CMD_READ 1
#define CMD_PROGRAM 2
#define CMD_ERASE 3

// 界说IAP_CONTR的值ENABLE_IAP,依据时钟频率有所不同
//#define ENABLE_IAP 0x80 // 时钟频率<30MHz
//#define ENABLE_IAP 0x81 // 时钟频率<24MHz
//#define ENABLE_IAP 0x82 // 时钟频率<20MHz
#define ENABLE_IAP 0x83 // 时钟频率<12MHz
//#define ENABLE_IAP 0x84 // 时钟频率<6MHz
//#define ENABLE_IAP 0x85 // 时钟频率<3MHz
//#define ENABLE_IAP 0x86 // 时钟频率<2MHz
//#define ENABLE_IAP 0x87 // 时钟频率<1MHz

// EEPROM数据保存的首地址
#define IAP_ADDRESS 0x0800 // 应越过程序所占空间的方位

// 制止ISP/IAP/EEPROM功用
void IapIdle()
{
IAP_CONTR = 0;
IAP_CMD = 0;
IAP_TRIG = 0;
IAP_ADDRH = 0;
IAP_ADDRL = 0;
}

// 从EEPROM中读一个字节
BYTE IapReadByte(WORD addr)
{
BYTE dat;

IAP_CONTR = ENABLE_IAP;
IAP_CMD = CMD_READ;
IAP_ADDRL = addr;
IAP_ADDRH = addr >> 8;
// 留意关于STC12C2052(AD)单片机,应先写入0x46,再写入0xb9
// 而关于STC12C5A60S2单片机,应先写入0x5a,再写入0xa5
IAP_TRIG = 0x46;
IAP_TRIG = 0xb9;
_nop_();

dat = IAP_DATA;
IapIdle();

return (dat);
}

// 写一个字节到EEPROM
void IapProgramByte(WORD addr, BYTE dat)
{
IAP_CONTR = ENABLE_IAP;
IAP_CMD = CMD_PROGRAM;
IAP_ADDRL = addr;
IAP_ADDRH = addr >> 8;
IAP_DATA = dat;
IAP_TRIG = 0x46;
IAP_TRIG = 0xb9;
_nop_();

IapIdle();
}

// 擦除EEPROM中的一个扇区
void IapEraseSector(WORD addr)
{
IAP_CONTR = ENABLE_IAP;
IAP_CMD = CMD_ERASE;
IAP_ADDRL = addr;
IAP_ADDRH = addr >> 8;
IAP_TRIG = 0x46;
IAP_TRIG = 0xb9;
_nop_();

IapIdle();
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/5g/261207.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部