PIC16F1829 DATA EEPROM 读写操作示例
时间:01-19 16:23 阅读:1000次
*温馨提示:点击图片可以放大观看高清大图
简介:本文给出一个PIC16F1829 DATA EEPROM 读写操作示例,感兴趣的朋友可以看看。
#define ReadRomString_CALL
#define WriteRomString_CALL
//*************************************
// 函数名称:ReadRomByte
// 函数功能:从ROM的某一地址读数据
// 入口参数:所读数据的地址
// 出口参数:所读地址的数据
//***************************************
uint8 ReadRomByte(uint8 addr)
{
uint8 num;
while(RD==1);//等待读完成
EEADR=addr;//写入要读的址址
EEPGD=0;//操作EEPROM
RD=1;//执行读操作
while(RD==1);//等待读完成
num=EEDATA;
return num;//返回读取的数据
}
//*************************************
// 函数名称:WriteRomByte
// 函数功能:从RAM的某一地址写数据
// 入口参数:所写数据的地址及数据
// 出口参数:无
//***************************************
void WriteRomByte(uint8 addr,uint8 data)
{
uint8 Tmp ;
uint8 i ;
Tmp = ReadRomByte(addr) ;
if(Tmp == data) return ; //如果读出数据与要写的数一样 直接返回
for(i=3;i>0;i--)//最多写三次
{
while(WR==1);//等待写完成
EEADR=addr;//写入地址信息
EEDATA=data;//写入数据信息
EEPGD=0;//操作EEPROM
WREN=1; //写EEPROM允许
EECON2=0x55;//写入特定时序
EECON2=0xaa;
WR=1; //执行写操作
while(WR==1);//等待写完成
WREN=0;//禁止写入EEPROM
Tmp = ReadRomByte(addr) ;
if(Tmp == data)
{
break ;
}
}
}
//*************************************
// 函数名称:ReadRomString
// 函数功能:从RAM读一连串的数据
// 入口参数:所读数据的首地址 读得的数据的存放首地址 读数据 长度
// 出口参数:所读地址的数据
/***************************************/
#ifdef ReadRomString_CALL
void ReadRomString(uint8 InAddr,uint8 *OutAddr,uint8 DataLong)
{
uint8 i ;
for(i=DataLong;i>0;i--)
{
while(RD==1);//等待读完成
EEADR = InAddr;//写入要读的址址
EEPGD = 0;//操作EEPROM
RD = 1;//执行读操作
while(RD==1);//等待读完成
*OutAddr = EEDATA;
InAddr ++ ; //存储地址加1
OutAddr ++ ; //数据地址加1
}
}
#endif //ReadRomString_CALL
//*************************************
// 函数名称:WriteRomString
// 函数功能:从RAM写一连串的数据
// 入口参数:要写进RAM的首地址 要写的数据 写数据的长度
// 出口参数:无
/***************************************/
#ifdef WriteRomString_CALL
void WriteRomString(uint8 InAddr,uint8 *InData,uint8 DataLong)
{
uint8 i,j;
uint8 Tmp ;
for(i=DataLong;i>0;i--)
{
//读出的和要写的数据一致 直接写下一个数据
Tmp = ReadRomByte(InAddr) ;
if(Tmp != (*InData)) //读数据与要写数据不一至 进行写 操作
{
for(j=3;j>0;j--)//最多写三次
{
while(WR==1);//等待写完成
EEADR = InAddr;//写入地址信息
EEDATA = *InData;//写入数据信息
EEPGD = 0;//操作EEPROM
WREN = 1; //写EEPROM允许
EECON2 = 0x55;//写入特定时序
EECON2 = 0xaa;
WR = 1; //执行写操作
while(WR==1);//等待写完成
WREN = 0;//禁止写入EEPROM
Tmp = ReadRomByte(InAddr) ;
if(Tmp == (*InData))
{
break ;
}
}
}
InAddr ++ ; //存储地址加1
InData ++ ; //数据地址加1
}
}
#endif //WriteRomString_CALL