首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AVR Eeprom理解

AVR Eeprom理解
EN

Stack Overflow用户
提问于 2019-12-09 00:32:34
回答 2查看 345关注 0票数 0

我已经开始创建一个按钮计数器,并成功地做到了这一点,然后我转向读和写eeprom --我尝试使用eeprom来读取和写入一个字节,并且成功地做到了这一点,这是非常基本的东西。最近,我尝试使用eeprom_update_word函数,这让我有点困惑,因为我觉得工作不太好,我试过了,但是成功了,有人能帮我吗?以下是我所写的:

代码语言:javascript
复制
 // removed the standard header as they aren't displayed here!

void lcd_num (int);


int main(void)
{
    uint16_t c = 0;
    DDRD = 0x00;

    lcd_init(LCD_DISP_ON);
    lcd_string(5, 0, "COUNTER");
    lcd_command(0xC5);
    // check if value has already been used/initialized...
    if (eeprom_read_word((uint16_t*)10) == UINT16_MAX)
    {
        // ...if not, init to 0
        eeprom_write_word((uint16_t*)10 , 0);
    }
    else
    {
        // ...if yes, read value back
        c = eeprom_read_word((uint16_t*)10);
    }
    lcd_data(c+48);

    while(1)
    {
        if( (PIND & 0x01) == 1 )
        {
            c++;
            lcd_command(0xC5);
            lcd_num(c);
            eeprom_update_word((uint16_t*)10, c);
            while( (PIND & 0x01) == 1 );
        }
        if((PIND & 0x02) == 1)
        {
            eeprom_write_word((uint16_t*)10,0);
            c = eeprom_read_word((uint16_t*)10);
            while((PIND & 0x02) == 1);
        }
    }
}



void lcd_num(int n){
    lcd_data((n/1000)+48);
    n %= 1000;

    lcd_data((n/100)+48);
    n %= 100;

    lcd_data((n/10)+48);
    n %= 10;

    lcd_data(n+48);
}
            void lcd_num(int n){
            lcd_data((n/1000)+48);
            n %= 1000;

            lcd_data((n/100)+48);
            n %= 100;

            lcd_data((n/10)+48);
            n %= 10;

            lcd_data(n+48);
        }

我能再请你帮个忙吗?我想使用手动按钮擦除eeprom,这样我就不会耗尽空间,我已经尝试过了,但这是行不通的。我这样做对吗??

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-09 08:09:32

当前,每次重新启动时,计数器值都会被覆盖。您需要进行某种检查,EEPROM位置是否已经初始化(默认EEPROM内容为所有0xFF)。

代码语言:javascript
复制
// check if value has already been used/initialized...
if (eeprom_read_word((uint16_t*)10) == UINT16_MAX)
{
    // ...if not, init to 0
    eeprom_write_word((uint16_t*)10 , 0);
} 
else 
{
    // ...if yes, read value back
    c = eeprom_read_word((uint16_t*)10);
}
票数 1
EN

Stack Overflow用户

发布于 2019-12-09 07:04:30

因为所有的程序都是在接通电源时执行的,所以这条线路也会运行:

代码语言:javascript
复制
uint16_t c = 0;
// unrelated lines ...
eeprom_write_word((uint16_t*)10 ,c);

他们会覆盖你之前存储在那里的值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59241168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档