×
单片机 > 单片机程序设计 > 详情

PIC16F1829 DATA EEPROM 读写操作示例

发布时间:2020-08-31 发布时间:
|

简介:本文给出一个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




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机中高阻态的实质及意义