EPROM操作:
如果要读取一个字节,
用户首先必须向EEADRL寄存器写入地址,然后清除EEPGD控制位,以及EECON1的CFGS位,
然后再将RD位置高。需要的数据经过一次指令周期马上就出现在EEDATL里面了,下一个指令
就可以读取出来,当然为了稳定可以加noop。EEDATL寄存器将会保留该读取的值,直到下一次读取操作
或者是用户写入操作。
代码:
EEADRL=DATA_EE_Address;
nop();
EEPGD=0;
CFGS=0;
RD=1;
nop();
nop();
result_byte=EEDATL;
如果要写入一个字节;
先设置地址EEADRL,并写入数据Byte的EEDATL,然后在遵循如下时序操作:
EEADRL=DATA_EE_Address;
EEDATL=Data_Byte;
EEPGD=0;
CFGS=0;
//危险操作,允许写入
WREN=1;
//严格按照如下顺序初始化,
GIE=0; //关闭中断
EECON2=0x55;
EECON2=0xaa;
WR=1;
GIE=1; //恢复中断
WREN=0; //恢复
while(WR){
nop();
}
while(!EEIF){ //poll中断标志位
nop();
}
EEIF=0; //必须软件清除标志位
写EEPROM要花费2ms到8ms的时间,故在检测WR状态位要花费相当长时间,会进入中断(时间间隔为1ms的T0中断)。
写入EEPROM有一个特定的过程:将55H写入EECON2,将AAH写入EECON2
然后将WR位置1
*******************************************/
#include
#include "../head/config.h"
__CONFIG(HS&WDTDIS&LVPDIS&PWRTEN);
//HS振荡,禁止看门狗,低压编程关闭,启动延时定时器
void WriteEE(uint8 addr,uint8 data);//EEPROM写函数
uint8 ReadEE(uint8 addr); //EEPROM读函数
uint8 cydata; //定义全局变量
void main(void) //主函数
{
uint8 k;
PORTD = 0xff; //PORTD赋FF
TRISD = 0x00;//PORTD为输出
for(k = 0;k < 7; k++)
{
WriteEE(k,k+1); //循环调用EEPROM写函数,向地址为0~7的写入1~8
}
while(1)
{
cydata = ReadEE(0);//读取EEPROM的地址0数据
if(cydata == 1)
{
RD0 = 0; //判断EEPROM地址0里的数据是不是为1,为1则点亮LED0
}
}
}
//EEPROM写数据函数
void WriteEE(uint8 addr,uint8 data)
{
do{}
while(WR == 1);//等待写完成
EEADR = addr;//写入地址信息
EEDATA = data;//写入数据信息
EEPGD = 0;//操作EEPROM
WREN = 1; //写EEPROM允许
EECON2 = 0x55;//写入特定时序
EECON2 = 0xaa;
WR = 1; //执行写操作
do{}
while(WR == 1);//等待写完成
WREN = 0;//禁止写入EEPROM
}
//EEPROM读数据函数
uint8 ReadEE(uint8 addr)
{
uint8 num;
do{}
while(RD == 1);//等待读完成
EEADR = addr;//写入要读的址址
EEPGD = 0;//操作EEPROM
RD = 1;//执行读操作
do{}
while(RD == 1);//等待读完成
num = EEDATA;
return num;//返回读取的数据
}