如果要讀取一個字節,
用戶首先必須向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 <pic.h>
#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;//返回讀取的數據
}