huarana 发表于 2015-1-13 09:38:45

关于内部eeprom,有没有办法初始化一次eep

也就是说内部eep本来全是ff的,我想在烧入程序第一次运行的时候初始化一次为其他值。

以后的断电上电就不用执行这个初始化代码了。(因为第一次上电以后会用按键来设置刷新eep)



tigerman520 发表于 2015-1-13 09:47:03

写一个标志位,如0XAA55,如果上电读取非0XAA55就初始化一次。

huarana 发表于 2015-1-13 10:16:42

tigerman520 发表于 2015-1-13 09:47
写一个标志位,如0XAA55,如果上电读取非0XAA55就初始化一次。

如何区分第一次上电运行还是以后的运行。

是不是可以在main函数的 while外面写个++标致位。

u8        num=0;

void        main()

                {
                if(num==0)
                        {
                                ”eep初始化代码“       
                        }
                num++;
                if(num>250)
                num=1;             /*防止num+满自溢变成0,也就是说只有程序烧进去那一次num才会=0 */               

                while(1)
                        {
                                “用户代码”
                        }
               
                }


这样不知可行不

叶子疯 发表于 2015-1-13 10:38:19

extern unsigned char eeprom_write(unsigned char addr, unsigned char value);//eeprom写函数
extern unsigned char eeprom_read(unsigned char addr);//eeprom读函数
//上面两个函数是PICC自带的
//下面这些语句是初始化eeprom的,8个一组,只在烧写程序时有用。
__EEPROM_DATA(50, 50, 50, 0, 0, 0, 0x12, 0x5c);//亮度,对比度,音量
__EEPROM_DATA(0x01, 0xf4, 0x03, 0x20, 0x06, 0x40, 0, 0);//R101    0x08
__EEPROM_DATA(0x07, 0xd0, 0x0f, 0xa0, 0x00, 0x00, 0, 0);//R101顶蒸0x10
__EEPROM_DATA(0x02, 0x8a, 0x06, 0x72, 0x00, 0x00, 0, 0);//M201    0x18
__EEPROM_DATA(0x01, 0xf4, 0x03, 0x20, 0x06, 0x40, 0, 0);//A301    0x20
__EEPROM_DATA(0x03, 0xe8, 0x0c, 0x1c, 0x00, 0x00, 0, 0);//c37
__EEPROM_DATA(0x01, 0xf4, 0x03, 0x20, 0x07, 0xd0, 0, 0);//6408
__EEPROM_DATA(0x01, 0xf4, 0x05, 0xdc, 0x00, 0x00, 0, 0);//VA01
__EEPROM_DATA(0x02, 0x12, 0x06, 0x72, 0x00, 0x00, 0, 0);//CH7140b
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0, 0);//A502特殊
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0, 0);//F505特殊
__EEPROM_DATA(0x03, 0xE8, 0x03, 0xE8, 0x07, 0xD0, 0, 0);//V70
__EEPROM_DATA(0x02, 0x80, 0x06, 0x68, 0x0D, 0x48, 0, 0);//CM9

huarana 发表于 2015-1-13 10:44:02

叶子疯 发表于 2015-1-13 10:38
extern unsigned char eeprom_write(unsigned char addr, unsigned char value);//eeprom写函数
extern uns ...

如何才能保证只在程序烧录时有用呢

叶子疯 发表于 2015-1-13 10:48:48

huarana 发表于 2015-1-13 10:44
如何才能保证只在程序烧录时有用呢

直接用
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);

这个语句本身就是初始化eeprom用的(只在烧程序的时候有用),它会按次序把你的初始数据写入eeprom中。

chill520 发表于 2015-1-13 10:54:52

楼上正解

huarana 发表于 2015-1-13 11:00:36

叶子疯 发表于 2015-1-13 10:48
直接用
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);



噢,非常感谢。找到这个头文件库了。

还有个问题就是 __EEPROM_DATA(a, b, c, d, e, f, g, h),使用一次是不是就将eep前8个字节初始化成()内的数据了?
然后再使用一次一次的话,会紧接着写入第9-16字节吗? 地址会自动增加的吗?  

叶子疯 发表于 2015-1-13 11:09:56

huarana 发表于 2015-1-13 11:00
噢,非常感谢。找到这个头文件库了。

还有个问题就是 __EEPROM_DATA(a, b, c, d, e, f, g, h),使用一 ...

是的,地址都是挨着来的,从0-255

jhjkdz 发表于 2015-4-4 15:22:38

学习!!!

kebaojun305 发表于 2015-4-4 15:55:37

huarana 发表于 2015-1-13 11:00
噢,非常感谢。找到这个头文件库了。

还有个问题就是 __EEPROM_DATA(a, b, c, d, e, f, g, h),使用一 ...

应该不是的,这个语句就决定了每次烧录都是前几个字节。

wangyu_2011 发表于 2015-4-5 10:52:35

const 初始化 就可以了。

fangjikun 发表于 2015-4-6 00:09:47

看了这个才知道。
以前都是笨方法,上电运行检查特定地址内内的内容,判断要不要将eeprom 初始化,哎.....

interxiaodao 发表于 2015-4-7 09:52:25

非常好   学习了

cd4000 发表于 2016-3-8 16:50:45

学习一下!

zqf441775525 发表于 2016-3-8 17:04:42

我一般是用这个流程:
ReadEEPROM -> Check ALL "0xff"? ->(YES) -> 初始化 ->把初始化的数据写入EEPROM

mandzy 发表于 2016-3-22 20:49:47

终于知道__EEPROM_DATA的用法了,我以前都是上电判断当前地址内的值是否在我设定的范围之内,如果在就说明当前值有效,如果不在就采用默认值

kevinchen026 发表于 2016-3-22 21:32:52

__EEPROM_DATA 赞

yick 发表于 2016-3-22 22:02:24

围观学习~~

fchen2 发表于 2016-3-23 17:19:18

我们用的是汇编,只能用
   org ( CEEPROM_ma_PROGRAM_UPR_file_info + CFile_mvdw_file_content_size)
      _dedw -1
页: [1]
查看完整版本: 关于内部eeprom,有没有办法初始化一次eep