avr-lib本身在<avr/eeprom.h>里面有定义eeprom的操作,现将它优化写在自定义的C文件中。
eeprom_wr.c如下:
/*
该程序主要功能是实现eeprom空间的读写;
*/
#include<avr/io.h>
#include <util/delay.h>
#include <avr/eeprom.h>
#define INT8U unsigned char
#define INT16U unsigned int
void write_byte_to_eeprom(INT8U *addr,INT8U data)//将data数据,写入addr地址;
{
while(!eeprom_is_ready());
eeprom_write_byte(addr, data);
}
void read_byte_from_eeprom(INT8U *addr,INT8U* data)//将addr位置的数据读出并写到data内;
{
while(!eeprom_is_ready());
*data = eeprom_read_byte(addr);
}
void write_word_to_eeprom(INT16U *addr,INT16U data)//由于eeprom的地址是按字节定义的,所以,使用INT16U格式的时候,每一次增加地址,应该增加2;
{
while(!eeprom_is_ready()); //检测eeprom是否已经准备就绪;
eeprom_write_word(addr,data); //将data数据,写入addr地址;
}
void read_word_from_eeprom(INT16U *addr,INT16U* data)//由于eeprom的地址是按字节定义的,所以,使用INT16U格式的时候,每一次增加地址,应该增加2;
{
while(!eeprom_is_ready()); //检查eeprom是否已经准备就绪;
*data = eeprom_read_word(addr);//将addr位置的数据读出并写到data内;
}
eeprom_wr.h如下:
#ifndef EEPROM_WR_H_
#define EEPROM_WR_H_
#define INT8U unsigned char
#define INT16U unsigned int
extern void write_byte_to_eeprom(INT8U *addr,INT8U data);
extern void read_byte_from_eeprom(INT8U *addr,INT8U* data);
extern void write_word_to_eeprom(INT16U *addr,INT16U data);
extern void read_word_from_eeprom(INT16U *addr,INT16U* data);
#endif /* PROGRAM_WR_H_ */
本文使用LCD1602来显示eeprom的读写内容;LCD1602的例程可以参考:https://blog.csdn.net/rzchong1988/article/details/101764091
最后的main.c如下:
#define F_CPU 4000000UL
#include <stdio.h>
#include <util/delay.h>
#include "lcd1602.h"
//#include "ADC_tran.h"
#include "eeprom_wr.h"
#define INT8U unsigned char
#define INT16U unsigned int
INT16U* addr;
INT16U wdata;
INT16U rdata;
INT8U* b_addr;
INT8U b_wdata;
INT8U b_rdata;
char str[20];
int main(void)
{
Init_LCD1602();
// Init_AD(CH);
b_addr=2;
b_wdata = 230;
b_rdata = 0;
write_byte_to_eeprom(b_addr,b_wdata);
read_byte_from_eeprom(b_addr,&b_rdata);
sprintf(str,"data %d",b_rdata);
Display_String(0,0,str);
b_addr=4;
b_wdata = 240;
b_rdata = 0;
write_byte_to_eeprom(b_addr,b_wdata);
read_byte_from_eeprom(b_addr,&b_rdata);
sprintf(str,"data %d",b_rdata);
Display_String(0,1,str);
_delay_ms(1000);
addr=10;
wdata = 30530;
rdata = 0;
write_word_to_eeprom(addr,wdata);
read_word_from_eeprom(addr,&rdata);
sprintf(str,"data %d",rdata);
Display_String(0,0,str);
addr=12;
wdata = 30531;
rdata = 0;
write_word_to_eeprom(addr,wdata);
read_word_from_eeprom(addr,&rdata);
sprintf(str,"data %d",rdata);
Display_String(0,1,str);
while(1);
}
在protuess中显示如下: