/******************************************
******PIC16F877A 內(nèi)部EEPROM讀寫實(shí)驗(yàn)*******好象還有點(diǎn)問題,沒有寫進(jìn)去?
Author:hnrain
Date:2010-12-25
Version:V0.1
Email:hnrain1004@gmail.com
_______________________________
實(shí)驗(yàn)現(xiàn)象:先給內(nèi)部EEPROM的0~7字節(jié)寫數(shù)據(jù)1~8,再讀出第0字節(jié)的
內(nèi)容,并判斷讀出來的數(shù)據(jù)是不是1,如果是1則點(diǎn)亮RD0口的LED。
重點(diǎn)內(nèi)容:
內(nèi)部EEPROM的操作主要通過4個(gè)寄存器
EECON1,EECON2,EEDATA,EEADR
內(nèi)部EEPROM的操作主要通過4個(gè)寄存器
EECON1,EECON2,EEDATA,EEADR
EEDATA寄存器存放8位讀寫數(shù)據(jù)
EEADR存放EEPROM被訪問過的地址
EEADR存放EEPROM被訪問過的地址
EECON1寄存器定義:
bit7:5 未用;讀為0
bit4 EEIF:EEPROM寫操作中斷標(biāo)志位
= 寫操作完成(必須軟件清零)
= 寫操作未完成或還未開始
bit3 WRERR:EEPROM錯(cuò)誤標(biāo)志位
= 寫操作過早終止
= 寫操作已完成
bit2 WREN:EEPROM寫使能位
= 允許寫入
= 禁止寫入EEPROM
bit1 WR:寫操作控制位
= 啟動(dòng)寫周期,一旦寫入完成,該位將被硬件清零
寫操作控制位只能用軟件置"1"
= EEPROM的寫周期已完成
bit0 RD:讀控制位
= 啟動(dòng)EEPROM讀操作。讀需要一個(gè)周期,RD由硬件清零
RD只能用軟件置“1”
= 未啟動(dòng)EEPROM讀操作
bit7:5 未用;讀為0
bit4 EEIF:EEPROM寫操作中斷標(biāo)志位
= 寫操作完成(必須軟件清零)
= 寫操作未完成或還未開始
bit3 WRERR:EEPROM錯(cuò)誤標(biāo)志位
= 寫操作過早終止
= 寫操作已完成
bit2 WREN:EEPROM寫使能位
= 允許寫入
= 禁止寫入EEPROM
bit1 WR:寫操作控制位
= 啟動(dòng)寫周期,一旦寫入完成,該位將被硬件清零
寫操作控制位只能用軟件置"1"
= EEPROM的寫周期已完成
bit0 RD:讀控制位
= 啟動(dòng)EEPROM讀操作。讀需要一個(gè)周期,RD由硬件清零
RD只能用軟件置“1”
= 未啟動(dòng)EEPROM讀操作
寫入EEPROM有一個(gè)特定的過程:將55H寫入EECON2,將AAH寫入EECON2
然后將WR位置1
*******************************************/
#include <pic.h>
#include "../head/config.h"
然后將WR位置1
*******************************************/
#include <pic.h>
#include "../head/config.h"
__CONFIG(HS&WDTDIS&LVPDIS&PWRTEN);
//HS振蕩,禁止看門狗,低壓編程關(guān)閉,啟動(dòng)延時(shí)定時(shí)器
//HS振蕩,禁止看門狗,低壓編程關(guān)閉,啟動(dòng)延時(shí)定時(shí)器
void WriteEE(uint8 addr,uint8 data);//EEPROM寫函數(shù)
uint8 ReadEE(uint8 addr); //EEPROM讀函數(shù)
uint8 cydata; //定義全局變量
oid DelayMs(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++)
{
for(j=0;j<10;j++);
}
}
void Display(unsigned char num,unsigned char data)
{
PORTD = TABLE[data]; //取出數(shù)據(jù),送D口顯示
PORTC = 0x01;
switch(num)
{
case 0:
PORTA = 0x01;
break;
case 1:
PORTA = 0x02;
break;
case 2:
PORTA = 0x04;
break;
case 3:
PORTA = 0x06;
break;
case 4:
PORTA = 0x08;
break;
case 5:
PORTA = 0x0A;
break;
case 6:
PORTA = 0x0C;
break;
case 7:
PORTA = 0x0E;
break;
default:
PORTA = 0x00;
}
DelayMs(2);
}
{
unsigned int i,j;
for(i=0;i<t;i++)
{
for(j=0;j<10;j++);
}
}
void Display(unsigned char num,unsigned char data)
{
PORTD = TABLE[data]; //取出數(shù)據(jù),送D口顯示
PORTC = 0x01;
switch(num)
{
case 0:
PORTA = 0x01;
break;
case 1:
PORTA = 0x02;
break;
case 2:
PORTA = 0x04;
break;
case 3:
PORTA = 0x06;
break;
case 4:
PORTA = 0x08;
break;
case 5:
PORTA = 0x0A;
break;
case 6:
PORTA = 0x0C;
break;
case 7:
PORTA = 0x0E;
break;
default:
PORTA = 0x00;
}
DelayMs(2);
}
void main(void) //主函數(shù)
{
unsigned char buf;
GIE =0;
TRISD = 0; //portd 輸出
TRISA = 0; //porta 輸出
TRISC = 0; //porta 輸出
PORTC = 0x01; //74HC138控制端口
DelayMs(50);
buf=232;
// writeByte(0x15,buf);
eeprom_write(0x30,buf);
buf = 0;
DelayMs(50);
// buf = 0;
// buf = readByte(0x15);
buf=eeprom_read(0x30); //從片內(nèi)EEPROM中的地址0X10中讀出數(shù)據(jù)
// GIE = 1;
while(1)
{
Display(0,buf/100);
Display(1,buf/10%10);
Display(2,buf%100%10);
}}
{
unsigned char buf;
GIE =0;
TRISD = 0; //portd 輸出
TRISA = 0; //porta 輸出
TRISC = 0; //porta 輸出
PORTC = 0x01; //74HC138控制端口
DelayMs(50);
buf=232;
// writeByte(0x15,buf);
eeprom_write(0x30,buf);
buf = 0;
DelayMs(50);
// buf = 0;
// buf = readByte(0x15);
buf=eeprom_read(0x30); //從片內(nèi)EEPROM中的地址0X10中讀出數(shù)據(jù)
// GIE = 1;
while(1)
{
Display(0,buf/100);
Display(1,buf/10%10);
Display(2,buf%100%10);
}}
//EEPROM寫數(shù)據(jù)函數(shù)
void WriteEE(uint8 addr,uint8 data)
{
do{}
while(WR == 1);//等待寫完成
EEADR = addr;//寫入地址信息
EEDATA = data;//寫入數(shù)據(jù)信息
EEPGD = 0;//操作EEPROM
WREN = 1; //寫EEPROM允許
EECON2 = 0x55;//寫入特定時(shí)序
EECON2 = 0xaa;
WR = 1; //執(zhí)行寫操作
do{}
while(WR == 1);//等待寫完成
WREN = 0;//禁止寫入EEPROM
}
void WriteEE(uint8 addr,uint8 data)
{
do{}
while(WR == 1);//等待寫完成
EEADR = addr;//寫入地址信息
EEDATA = data;//寫入數(shù)據(jù)信息
EEPGD = 0;//操作EEPROM
WREN = 1; //寫EEPROM允許
EECON2 = 0x55;//寫入特定時(shí)序
EECON2 = 0xaa;
WR = 1; //執(zhí)行寫操作
do{}
while(WR == 1);//等待寫完成
WREN = 0;//禁止寫入EEPROM
}
//EEPROM讀數(shù)據(jù)函數(shù)
uint8 ReadEE(uint8 addr)
{
uint8 num;
do{}
while(RD == 1);//等待讀完成
EEADR = addr;//寫入要讀的址址
EEPGD = 0;//操作EEPROM
RD = 1;//執(zhí)行讀操作
do{}
while(RD == 1);//等待讀完成
num = EEDATA;
return num;//返回讀取的數(shù)據(jù)
}
uint8 ReadEE(uint8 addr)
{
uint8 num;
do{}
while(RD == 1);//等待讀完成
EEADR = addr;//寫入要讀的址址
EEPGD = 0;//操作EEPROM
RD = 1;//執(zhí)行讀操作
do{}
while(RD == 1);//等待讀完成
num = EEDATA;
return num;//返回讀取的數(shù)據(jù)
}