PIC18单片机怎么读写EEPROM,我使用的是18F4520的单片机,求一个读写EEPROM的程序实例
PIC18单片机怎么读写EEPROM,我使用的是18F4520的单片机,求一个读写EEPROM的程序实例...
PIC18单片机怎么读写EEPROM,我使用的是18F4520的单片机,求一个读写EEPROM的程序实例
展开
展开全部
/*
***************************************************************************************************
函数名:EE_readbyte
功 能:片内EEPROM 读1字节
说 明:Read_AddrH:待写入的高地址;Read_Addr:待写入的低地址
函数执行完返回一个存放在该地址处的值
***************************************************************************************************
*/
uchar EE_ReadByte(uchar Read_AddrH,uchar Read_Addr)
{
EEADRH = Read_AddrH; //写入高地址
EEADR = Read_Addr; //写入低地址
EECON1bits.EEPGD = 0; //访问EEPROM存储区
EECON1bits.CFGS = 0; //访问EEPROM或程序区
EECON1bits.RD = 1;
return EEDATA;
}
/*
***************************************************************************************************
函数名:EE_writebyte
功 能:片内EEPROM 写1字节
说 明:Write_AddrH:待写入的高位地址;Write_Addr:待写入的低位地址;Write_Byte:待写入的字节
***************************************************************************************************
*/
void EE_WriteByte(uchar Write_AddrH,uchar Write_Addr,uchar Write_Byte)
{
ClrWdt(); //喂狗
while(EECON1bits.WR);
EEADRH = Write_AddrH; //写入高地址
EEADR = Write_Addr; //写入低地址
EEDATA = Write_Byte; //写入数据
EECON1bits.EEPGD = 0; //访问EEPROM存储区
EECON1bits.CFGS = 0; //访问EEPROM或程序区
EECON1bits.WREN = 1; //充许擦写
INTCONbits.GIE = 0; //禁止所有中断
EECON2 = 0x55; //写入密钥
EECON2 = 0xaa;
EECON1bits.WR = 1; //开始写操作
Nop();
Nop();
INTCONbits.GIE = 1; //开中断
EECON1bits.WREN = 0; //禁止擦写
while(EECON1bits.WR) //等待写完成
{
;
}
}
/*
***************************************************************************************************
函数名:EE_WriteArray
功 能:写入数组数据到EEPROM
说 明:AddrH:EEPROM起始地址高字节,Addr:EEPROM起始地址低字节
WriteByte[]:待存储的数据存放数组
LenArray:待存储的数组长度
举例:存放地址0x0020---0x0029;存放数据array[10]
***************************************************************************************************
*/
void EE_WriteArray(uchar AddrH,uchar Addr,uchar WriteArray[],uchar LenArray)
{
uchar tempH,tempL,tempByte;
uint i=0;
tempH = AddrH;
tempL = Addr;
for(i=0;i<LenArray;i++)
{
tempByte = WriteArray[i];
EE_WriteByte(tempH,tempL,tempByte);
tempL++;
}
}
/*
***************************************************************************************************
函数名:EE_ReadArray
功 能:写入数组数据到EEPROM
说 明:AddrH:EEPROM起始地址高字节,Addr:EEPROM起始地址低字节
ReadByte[]:待存储的数据存放数组
LenArray:待存储的数组长度
举例:存放地址0x0020---0x0029;存放数据array[10]
***************************************************************************************************
*/
void EE_ReadArray(uchar AddrH,uchar Addr,uchar ReadArray[],uchar LenArray)
{
uchar tempH,tempL,tempByte;
uint i;
tempH=AddrH;
tempL=Addr;
for(i=0;i<LenArray;i++)
{
tempByte=EE_ReadByte(tempH,tempL);
ReadArray[i]=tempByte;
tempL++;
}
}
***************************************************************************************************
函数名:EE_readbyte
功 能:片内EEPROM 读1字节
说 明:Read_AddrH:待写入的高地址;Read_Addr:待写入的低地址
函数执行完返回一个存放在该地址处的值
***************************************************************************************************
*/
uchar EE_ReadByte(uchar Read_AddrH,uchar Read_Addr)
{
EEADRH = Read_AddrH; //写入高地址
EEADR = Read_Addr; //写入低地址
EECON1bits.EEPGD = 0; //访问EEPROM存储区
EECON1bits.CFGS = 0; //访问EEPROM或程序区
EECON1bits.RD = 1;
return EEDATA;
}
/*
***************************************************************************************************
函数名:EE_writebyte
功 能:片内EEPROM 写1字节
说 明:Write_AddrH:待写入的高位地址;Write_Addr:待写入的低位地址;Write_Byte:待写入的字节
***************************************************************************************************
*/
void EE_WriteByte(uchar Write_AddrH,uchar Write_Addr,uchar Write_Byte)
{
ClrWdt(); //喂狗
while(EECON1bits.WR);
EEADRH = Write_AddrH; //写入高地址
EEADR = Write_Addr; //写入低地址
EEDATA = Write_Byte; //写入数据
EECON1bits.EEPGD = 0; //访问EEPROM存储区
EECON1bits.CFGS = 0; //访问EEPROM或程序区
EECON1bits.WREN = 1; //充许擦写
INTCONbits.GIE = 0; //禁止所有中断
EECON2 = 0x55; //写入密钥
EECON2 = 0xaa;
EECON1bits.WR = 1; //开始写操作
Nop();
Nop();
INTCONbits.GIE = 1; //开中断
EECON1bits.WREN = 0; //禁止擦写
while(EECON1bits.WR) //等待写完成
{
;
}
}
/*
***************************************************************************************************
函数名:EE_WriteArray
功 能:写入数组数据到EEPROM
说 明:AddrH:EEPROM起始地址高字节,Addr:EEPROM起始地址低字节
WriteByte[]:待存储的数据存放数组
LenArray:待存储的数组长度
举例:存放地址0x0020---0x0029;存放数据array[10]
***************************************************************************************************
*/
void EE_WriteArray(uchar AddrH,uchar Addr,uchar WriteArray[],uchar LenArray)
{
uchar tempH,tempL,tempByte;
uint i=0;
tempH = AddrH;
tempL = Addr;
for(i=0;i<LenArray;i++)
{
tempByte = WriteArray[i];
EE_WriteByte(tempH,tempL,tempByte);
tempL++;
}
}
/*
***************************************************************************************************
函数名:EE_ReadArray
功 能:写入数组数据到EEPROM
说 明:AddrH:EEPROM起始地址高字节,Addr:EEPROM起始地址低字节
ReadByte[]:待存储的数据存放数组
LenArray:待存储的数组长度
举例:存放地址0x0020---0x0029;存放数据array[10]
***************************************************************************************************
*/
void EE_ReadArray(uchar AddrH,uchar Addr,uchar ReadArray[],uchar LenArray)
{
uchar tempH,tempL,tempByte;
uint i;
tempH=AddrH;
tempL=Addr;
for(i=0;i<LenArray;i++)
{
tempByte=EE_ReadByte(tempH,tempL);
ReadArray[i]=tempByte;
tempL++;
}
}
展开全部
E2PROM一般用 I2C总线,直接参考I2C总线驱动程序吧。百度文库一搜一大把。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的EEPROM事不是用的I2C通信协议啊?是的话 到外面直接下一个I2C的驱动程序啊,在CSDN里面很多的。写出来的还没有别个做好的I2C来的快,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询