可以这样在eeprom中保存浮点数
大家知道浮点数无论双精度还是单精度都占用4个字节,如果需要断电保持数据,最好把它们保存在eeprom中,经过实验可以用下面的程序来做。unsigned char uid;
unsigned char *point1;
float floaa,floab;
void PassNumber()
{
floaa=56.2345;
point1=(char*)&floaa;
uid=*point1;
point1++;
uid=*point1;
point1++;
uid=*point1;
point1++;
uid=*point1;
//在此处将uid数组存到pporom断电(略)
//再次来电后
//再开机从epprom中去除数据到数组(略)
point1=(char*)&floab;
*point1=uid;
point1++;
*point1=uid;
point1++;
*point1=uid;
point1++;
*point1=uid;
floaa=floab;
}
用联合体啊
union {
float Dat_f;
char Dat_C;
}EEProm_Union;
EEProm_Union.Dat_f = 0.1234;
存取EEProm_Union.Dat_C ~ EEProm_Union.Dat_C 也可以void*类型指针直接传,或许是更优雅的做法
把float类型的数据cast成char,这种做法本身是不优雅、不严谨的
{:4_250:} 谢谢分享 其实,方法很多,指针强制类型转换除了能应付各种单位变量,也可以将结构体类型或大数组写入EEPROM,
共用体(联合体)的优势是简单可靠,易于理解,特别适合严谨的应用和新手小白。 可以试试联合体 本帖最后由 bkeuqoaq 于 2024-11-8 09:52 编辑
实际做法是将所有要保存的变量放在结构体中,,存储整个结构体(将整个结构体当成字节数组),读取时也是类似,连续读取EEPROM数据到结构体首地址,不需要其它特殊操作了
if (EEPROM_SaveStruct() == 1)
{
OLED_ShowStrCpl(128-11*6, 7, "SAVE-1", 0xffff);
INT_TickDelay(500ms);
OLED_ShowStr(128-11*6, 7, " ");
}
else
{
OLED_ShowStrCpl(128-11*6, 7, "SAVE-0", 0xffff);
INT_TickDelay(500ms);
OLED_ShowStr(128-11*6, 7, " ");
}
u8 EE_Restore(void)
{
if (1)
{
MenuSet_Typedef* pTask = &g_stMenuSet;
AT24X_Read(ADDR__MENU_SET, sizeof(g_stMenuSet), (u8*)pTask);
if (pTask->ulInitFlag != EE_INIT_OK_FLAG__MENU)
{
EE_ResetMenuSet(0);
}
}
直接用结构体
页:
[1]