標(biāo)題:
PIC單片機(jī)讀內(nèi)部EEPROM的讀寫(xiě)操作子程序
[打印本頁(yè)]
作者:
wendi
時(shí)間:
2013-7-11 02:58
標(biāo)題:
PIC單片機(jī)讀內(nèi)部EEPROM的讀寫(xiě)操作子程序
//********************************************************************************
//********************************************************************************
// pic16f917
//********************************************************************************
unsigned char read_eeprom(unsigned char);
void write_eeprom(unsigned char,unsigned char);
void write_work();
//********************************************************************************
//********************************************************************************
unsigned char read_eeprom(unsigned char addr)
{
unsigned char num;
do{;}
while(RD==1); //上一次讀操作是否完成
EEADR=addr; //EEPROM地址為00H
EEPGD=0; //指向EEPROM數(shù)據(jù)儲(chǔ)存器
RD=1; //開(kāi)始讀
do{;}
while(RD==1); //等待讀操作完成
num=EEDATA; //讀出
return(num); //返回讀出的數(shù)
}
//********************************************************************************
void write_work()
{
if((write_dt&0x1) == 0x1)
{
write_eeprom(0,sdy_dt);
}
if((write_dt&0x2) == 0x2)
{
write_eeprom(1,sdy_set);
}
if((write_dt&0x4) == 0x4)
{
write_eeprom(2,power_dt);
}
write_dt=0;
}
//********************************************************************************
void write_eeprom(unsigned char addr,unsigned char data)
{
do{;}
while(WR==1); //上一次寫(xiě)操作是否完成
EEADR=addr; //EEPROM地址
EEDATA=data; //準(zhǔn)備寫(xiě)入EEPROM的數(shù)據(jù)
EEPGD=0; //指向EEPROM數(shù)據(jù)儲(chǔ)存器
WREN=1; //使能寫(xiě)操作
EECON2=0x55; //設(shè)置通用參數(shù)
EECON2=0xAA; //設(shè)置通用參數(shù)
WR=1; //開(kāi)始寫(xiě)
do{;}
while(WR==1); //等待寫(xiě)操作完成
WREN=0; //禁止寫(xiě)操作
}
//********************************************************************************
//********************************************************************************
作者:
libiaoha
時(shí)間:
2013-9-1 11:04
我也來(lái)湊個(gè)熱鬧:
#define ReadRomString_CALL
#define WriteRomString_CALL
//*************************************
// 函數(shù)名稱:ReadRomByte
// 函數(shù)功能:從ROM的某一地址讀數(shù)據(jù)
// 入口參數(shù):所讀數(shù)據(jù)的地址
// 出口參數(shù):所讀地址的數(shù)據(jù)
//***************************************
uint8 ReadRomByte(uint8 addr)
{
uint8 num;
while(RD==1);//等待讀完成
EEADR=addr;//寫(xiě)入要讀的址址
EEPGD=0;//操作EEPROM
RD=1;//執(zhí)行讀操作
while(RD==1);//等待讀完成
num=EEDATA;
return num;//返回讀取的數(shù)據(jù)
}
//*************************************
// 函數(shù)名稱:WriteRomByte
// 函數(shù)功能:從RAM的某一地址寫(xiě)數(shù)據(jù)
// 入口參數(shù):所寫(xiě)數(shù)據(jù)的地址及數(shù)據(jù)
// 出口參數(shù):無(wú)
//***************************************
void WriteRomByte(uint8 addr,uint8 data)
{
uint8 Tmp ;
uint8 i ;
Tmp = ReadRomByte(addr) ;
if(Tmp == data) return ; //如果讀出數(shù)據(jù)與要寫(xiě)的數(shù)一樣 直接返回
for(i=3;i>0;i--)//最多寫(xiě)三次
{
while(WR==1);//等待寫(xiě)完成
EEADR=addr;//寫(xiě)入地址信息
EEDATA=data;//寫(xiě)入數(shù)據(jù)信息
EEPGD=0;//操作EEPROM
WREN=1; //寫(xiě)EEPROM允許
EECON2=0x55;//寫(xiě)入特定時(shí)序
EECON2=0xaa;
WR=1; //執(zhí)行寫(xiě)操作
while(WR==1);//等待寫(xiě)完成
WREN=0;//禁止寫(xiě)入EEPROM
Tmp = ReadRomByte(addr) ;
if(Tmp == data)
{
break ;
}
}
}
//*************************************
// 函數(shù)名稱:ReadRomString
// 函數(shù)功能:從RAM讀一連串的數(shù)據(jù)
// 入口參數(shù):所讀數(shù)據(jù)的首地址 讀得的數(shù)據(jù)的存放首地址 讀數(shù)據(jù) 長(zhǎng)度
// 出口參數(shù):所讀地址的數(shù)據(jù)
/***************************************/
#ifdef ReadRomString_CALL
void ReadRomString(uint8 InAddr,uint8 *OutAddr,uint8 DataLong)
{
uint8 i ;
for(i=DataLong;i>0;i--)
{
while(RD==1);//等待讀完成
EEADR = InAddr;//寫(xiě)入要讀的址址
EEPGD = 0;//操作EEPROM
RD = 1;//執(zhí)行讀操作
while(RD==1);//等待讀完成
*OutAddr = EEDATA;
InAddr ++ ; //存儲(chǔ)地址加1
OutAddr ++ ; //數(shù)據(jù)地址加1
}
}
#endif //ReadRomString_CALL
//*************************************
// 函數(shù)名稱:WriteRomString
// 函數(shù)功能:從RAM寫(xiě)一連串的數(shù)據(jù)
// 入口參數(shù):要寫(xiě)進(jìn)RAM的首地址 要寫(xiě)的數(shù)據(jù) 寫(xiě)數(shù)據(jù)的長(zhǎng)度
// 出口參數(shù):無(wú)
/***************************************/
#ifdef WriteRomString_CALL
void WriteRomString(uint8 InAddr,uint8 *InData,uint8 DataLong)
{
uint8 i,j;
uint8 Tmp ;
for(i=DataLong;i>0;i--)
{
//讀出的和要寫(xiě)的數(shù)據(jù)一致 直接寫(xiě)下一個(gè)數(shù)據(jù)
Tmp = ReadRomByte(InAddr) ;
if(Tmp != (*InData)) //讀數(shù)據(jù)與要寫(xiě)數(shù)據(jù)不一至 進(jìn)行寫(xiě) 操作
{
for(j=3;j>0;j--)//最多寫(xiě)三次
{
while(WR==1);//等待寫(xiě)完成
EEADR = InAddr;//寫(xiě)入地址信息
EEDATA = *InData;//寫(xiě)入數(shù)據(jù)信息
EEPGD = 0;//操作EEPROM
WREN = 1; //寫(xiě)EEPROM允許
EECON2 = 0x55;//寫(xiě)入特定時(shí)序
EECON2 = 0xaa;
WR = 1; //執(zhí)行寫(xiě)操作
while(WR==1);//等待寫(xiě)完成
WREN = 0;//禁止寫(xiě)入EEPROM
Tmp = ReadRomByte(InAddr) ;
if(Tmp == (*InData))
{
break ;
}
}
}
InAddr ++ ; //存儲(chǔ)地址加1
InData ++ ; //數(shù)據(jù)地址加1
}
}
#endif //WriteRomString_CALL
// 結(jié)束 本文源自
http://blog.csdn.net/libiaojs/article/details/9418357
作者:
gzpenglin
時(shí)間:
2014-6-10 17:09
辛苦了!
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1