新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STC單片機(jī)EEPROM功能模塊

STC單片機(jī)EEPROM功能模塊

作者: 時(shí)間:2016-11-23 來源:網(wǎng)絡(luò) 收藏
// STC單片機(jī)EEPROM功能模塊

#include
#include

本文引用地址:http://butianyuan.cn/article/201611/320339.htm

// 聲明與IAP相關(guān)的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,根據(jù)時(shí)鐘頻率有所不同
//#define ENABLE_IAP 0x80 // 時(shí)鐘頻率<30MHz
//#define ENABLE_IAP 0x81 // 時(shí)鐘頻率<24MHz
//#define ENABLE_IAP 0x82 // 時(shí)鐘頻率<20MHz
#define ENABLE_IAP 0x83 // 時(shí)鐘頻率<12MHz
//#define ENABLE_IAP 0x84 // 時(shí)鐘頻率<6MHz
//#define ENABLE_IAP 0x85 // 時(shí)鐘頻率<3MHz
//#define ENABLE_IAP 0x86 // 時(shí)鐘頻率<2MHz
//#define ENABLE_IAP 0x87 // 時(shí)鐘頻率<1MHz

// EEPROM數(shù)據(jù)保存的首地址
#define IAP_ADDRESS 0x0800 // 應(yīng)跳過程序所占空間的位置

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

// 從EEPROM中讀一個(gè)字節(jié)
BYTE IapReadByte(WORD addr)
{
BYTE dat;

IAP_CONTR = ENABLE_IAP;
IAP_CMD = CMD_READ;
IAP_ADDRL = addr;
IAP_ADDRH = addr >> 8;
// 注意對(duì)于STC12C2052(AD)單片機(jī),應(yīng)先寫入0x46,再寫入0xb9
// 而對(duì)于STC12C5A60S2單片機(jī),應(yīng)先寫入0x5a,再寫入0xa5
IAP_TRIG = 0x46;
IAP_TRIG = 0xb9;
_nop_();

dat = IAP_DATA;
IapIdle();

return (dat);
}

// 寫一個(gè)字節(jié)到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中的一個(gè)扇區(qū)
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();
}




評(píng)論


技術(shù)專區(qū)

關(guān)閉