📄 eeprom.h
字号:
/*********************************************************************************************************
** 工程功能 :内置EEPROM
** 工程作者 :Blue Sky Teams——WCW
** 工程版本 :V1.0
*********************************************************************************************************/
#include<STC12C5A60S2.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define IAP_ENABLE 0X83 //IAP_CONTR,ISP/IAP寄存器,设置允许IAP/ISP功能,从用户主程序区启动,
//系统时钟小于12M,读2个时钟,编程660个时钟,擦除252144个时钟
/********************************IAP_CMD寄存器宏定义指令集,操作模式选择 **************************************/
//详细的介绍请参看“STC12C5A60S2.pdf”第12章 STC12C5A60S2系列单片机eeprom的应用 中对IAP_CMD寄存器的介绍
#define STANDBY 0X00 //待机模式
#define BYTE_READ 0X01 //字节读取
#define BYTE_PROGRAM 0X02 //字节编程
#define SECTOR_ERASE 0X03 //扇区删除
//函数声明
void Erase_zijie(uint ADDR);
void Zijie_Program(uchar DATAIN,uint ADDR);
void Byte_Program(uchar,uint);
void Iap_Disable(void);
uchar Byte_Read(uint);
void Sector_Erase(uint);
/*********************************************************************************************************
** 函数功能 :字节写入
** 函数说明 :在写入数据之前必须擦除之前的数据,而内置eeprom只能进行扇区擦除,不能实现扇区擦除;
** 在扇区内已有数据而想写入数据又不想丧失已有的存在的数据的情况下,此函数可实现单字节写入的效果
** 入口参数 :写入的数据,要写入的地址
** 出口参数 :无
*********************************************************************************************************/
void Zijie_Program(uchar DATAIN,uint ADDR)
{
Erase_zijie(ADDR); //基于eeprom的特性,在写入数据之前必须先把之前的数据擦除
Byte_Program(DATAIN,ADDR);
}
/*********************************************************************************************************
** 函数功能 :字节编程
** 函数说明 :以字节的形式将数据写入EEPROM,单独一次或连续的IAP之后要关闭IAP功能
** 入口参数 :数据,数据的十六位地址
** 出口参数 :无
*********************************************************************************************************/
void Byte_Program(uchar DATAIN,uint ADDR)
{
uchar DPL;
DPL=ADDR&0X00FF;
IAP_DATA=DATAIN;
IAP_CONTR=IAP_ENABLE;
IAP_CMD=BYTE_PROGRAM;
IAP_ADDRH=ADDR>>8;
IAP_ADDRL=DPL;
// EA=0;
IAP_TRIG=0X5A;
IAP_TRIG=0XA5;
_nop_();
Iap_Disable();
// EA=1;
}
/*********************************************************************************************************
** 函数功能 :IAP功能关闭
** 函数说明 :单独一次或连续的IAP之后要关闭IAP功能
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void Iap_Disable()
{
IAP_CONTR=0X00;
IAP_CMD=0X00;
IAP_TRIG=0X00;
IAP_ADDRH=0XFF;
IAP_ADDRL=0XFF;
}
uchar Byte_Read(uint ADDR)
{
uchar DATAOUT;
uchar DPL;
DPL=ADDR&0X00FF;
IAP_CONTR=IAP_ENABLE;
IAP_CMD=BYTE_READ;
IAP_ADDRH=ADDR>>8;
IAP_ADDRL=DPL;
// EA=0;
IAP_TRIG=0X5A;
IAP_TRIG=0XA5;
_nop_();
DATAOUT=IAP_DATA;
// EA=1;
Iap_Disable();
return(DATAOUT);
}
/*********************************************************************************************************
** 函数功能 :扇区擦除,将整个扇区的数据擦除
** 函数说明 :扇区中任意字节的地址都是该扇区的地址,无需求出首地址
** 入口参数 :要擦除的扇区内的任意一个地址
** 出口参数 :无
*********************************************************************************************************/
void Sector_Erase(uint ADDR)
{
uchar DPL;
DPL=ADDR&0X00FF;
IAP_CONTR=IAP_ENABLE;
IAP_CMD=SECTOR_ERASE;
IAP_ADDRH=ADDR>>8;
IAP_ADDRL=DPL;
// EA=0;
IAP_TRIG=0X5A;
IAP_TRIG=0XA5;
_nop_();
Iap_Disable();
// EA=1;
}
/*********************************************************************************************************
** 函数功能 :字节擦除
** 函数说明 :内置的eeprom不能像24C02那样实现单字节擦除,此函数可弥补这个不足,实现单字节擦除
** 入口参数 :要擦除的字节地址
** 出口参数 :无
*********************************************************************************************************/
void Erase_zijie(uint ADDR)
{
uchar cunchu[512],shouADDR=0;
uint ADDRH=0,ADDRL=0,i=0;
ADDRH=ADDR/512;
ADDRL=ADDR%512;
shouADDR=ADDRH*512;
for(i=0;i<512;i++)
{
cunchu[i]=Byte_Read(i+shouADDR);
}
Sector_Erase(ADDR);
for(i=0;i<512;i++)
{
if(i==ADDRL)
;
else
Byte_Program(cunchu[i],i);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -