PIC内部EEPROM读写操作

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;//返回读取的数据
}


你可能感兴趣的:(Microchip,8bit,PIC)