1、EEARH 与
EEARL位存放地址的寄存器
2、EEDR为数据位
3、EECR
EECR | |||||||
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
-------- | ------- | EEPM1 | EEPM0 | EERIE | EEMPE | EEPE | EERE |
EEPM1 | EEPM0 | 编程时间 | |
0 | 0 |
3.4ms
| 在一个操作中删除和写入 |
0 | 1 |
1.8ms
| 仅擦除 |
1 | 0 |
1.8ms
| 只写 |
1 | 1 | - | 预留给将来使用 |
EERIE:置1中断
EEMPE:主写使能,置1时,设置EEPE在四个时钟周期内将数据写入所选地址的EEPROM。
EEPE:使能
EERE:读使能
代码:
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
// #include <avr/eeprom.h>
#include <GPIO_IO.h>
#include "usart.h"
void EEPROM_write(unsigned int uiAddress,unsigned char ucData)
{
cli(); //关总中断
while(EECR & (1<<EEPE));//等待写入周期的完成,EEWE为EEPROM写使能
EEAR=uiAddress; //EEAR为16位EEPROM地址寄存器,Mega16可用12位 atmega328p可用16位
EEDR=ucData; //EEDR为8位EEPROM数据寄存器
EECR|=(1<<EEMPE); //EEMWE为EEPROM主机写使能
EECR|=(1<<EEPE);
sei(); //开总中断
}
unsigned char EEPROM_read(unsigned int uiAddress)
{
cli(); //关总中断
while(EECR & (1<<EEPE));
EEAR=uiAddress;
EECR|=(1<<EERE);
return EEDR;
sei(); //开总中断
}
int main()
{
uchar asd;
init_USART(); //USART初始化
sei(); //开总中断
// cli(); //关总中断
asd=EEPROM_read(0x0000);
while(1)
{
asd++;
EEPROM_write(0x0000,asd);
put_d(48+EEPROM_read(0x0000));
put_s("\r\n");
_delay_ms(2000);
}
}