vb2002 发表于 2024-8-3 00:19:51

本帖最后由 vb2002 于 2024-8-3 00:22 编辑

DebugLab 发表于 2024-8-3 00:17
写只能把1变0,擦除是整个扇区变成1,一位一位写就可以一位一位的变0,一个扇区就可以当成4096bit的计数 ...
意思是 FF 只能写成 01 10 11 00是吗?
如果我要写 238那就是需要1110 01108个FF
这样我理解的是
擦除了写可以是16进制
直接写只能是2进制?
是这样吗

vb2002 发表于 2024-8-3 02:32:58

DebugLab 发表于 2024-8-3 00:17
写只能把1变0,擦除是整个扇区变成1,一位一位写就可以一位一位的变0,一个扇区就可以当成4096bit的计数 ...

一字节里面
ff是 255
那我把一个字节里面写01 02 03 04 应该没问题啊, 就是 0000 0001 ,0000 0010,0000 0011

DebugLab 发表于 2024-8-3 09:33:40

vb2002 发表于 2024-8-3 02:32
一字节里面
ff是 255
那我把一个字节里面写01 02 03 04 应该没问题啊, 就是 0000 0001 ,0000 0010,000 ...

1111 1111
1111 1110
1111 1100
1111 1000
1111 0000
这样

vb2002 发表于 2024-8-3 11:22:42

wnagming 发表于 2024-8-3 07:36
擦除后EEPROM中值为0XFF,想写入什么值都行,但是只能写一次,第二次写入的话,已经置零的位不会变为1 ...

你这个程序我调不通!{:4_167:}

eeprom.ceeprom.h我用的 布丁橘长的那个模块
主函数里面我改了一下.
结果led不亮. 串口打印也没反应


wjhhhhh 发表于 2024-8-3 11:55:25

本帖最后由 wjhhhhh 于 2024-8-3 11:57 编辑

可以参考一下。
/**把关机时的台 写二个字节到第二个扇区前一字节的前四位是波段 后四位和后一字节的八位是调谐频道****/
/** 写入二个字节到第二个扇区***提前到开机时就找到这个地址 关机时写入到这个地址节省时间*/
void EEP_Ws2(u8 RW_zj1,u8 RW_zj2)//前四位波段少于15   写入二个字节是因为单个数据会出现0xFF
{EZtmp=RW_zj1; EZtmp=RW_zj2;
      //guan_ji_hao =ik<<8 & (ik-1);//这次断电时存入的地址
      //提前到开机时就找到这个地址 关机时节省时间
EEPROM_read(512,RWtmp,512);//第二扇区(地址512 0x0200)起 512字节全读出来511~1023
   for(ik=0;ik<512;ik++)
    {if((RWtmp==0xFF)&&(RWtmp==0xFF))//有二个连续字节FF 没有写过
      {EEPROM_write(ik+512,EZtmp,2);         //追加 写入收到的2个
             break;                                  //跳出ik 0~511循环
      }                                                                         //0~511循环到此                   电烙铁
   if(ik>=510)                                                               //循环到510仍然没有连续的两个FF
            {SectorErase(512);                   //没有了连续的2个FF 擦除第二扇区                  
             RWtmp=EZtmp;RWtmp=EZtmp;//新的二个数据填进地址0和1 这个笨写法编译后code比循环写法少了23个字节!
             EEPROM_write(512,RWtmp,2);          //512是第二扇区起始
            }
    }
}

/*** 开机读出上次关机前的"台"****************************** */
void kai_ji_R() //读二个字节是因为第二个数据会出现0xFF
{EEPROM_read(512,RWtmp,512);//从地址512(第二扇区起始)开始把512个(512~1023)全读出来
for(ik=0;ik<512;ik++)   //找连续的2个FF 读出的RWtmp是序号
{if((RWtmp==0xFF)&&(RWtmp==0xFF))//有过擦除操作后或新的芯片第一次运行RWtmpRWtmp全是FF
    {PWM_7(0x001A);      //开机就调频F缺省频段 调频第一次开机遇全FF会出错?
   PWM_8(0x01F0); //开机缺省频点 陕西交通 89.6 MHz
         break;                              //跳出ik循环      
    }                        
   if((RWtmp==0xFF)&&(RWtmp==0xFF)) //这里RWtmp是第二扇区的 两个FF是存入(写过)和没写过的分界
    {xu_hao=(ik-3);      //RWtmp[]第二扇区存储的台的序号 RWtmp是序号
         EEPROM_read(512,RWtmp,512);//从地址512(第二扇区首)把512个全读出来 RWtmp是波段、调谐数据
         bo_duan =(RWtmp&0xF0)>>4; //波段0000 xxxxxxxx <=15
         tiao_xie=((RWtmp&0x0F)<<8) | (RWtmp);
   if(bo_duan>=2){Q1_EN=1;}//遇到了短波 发高电平给短波高放当电源               
      else{Q1_EN=0;}          //发低电平 没了短波高放电源
               guan_ji_hao=(ik-1) <<8 & ik;//这次断电时存入的地址 高位在前
               break;   //跳出ik 0~511循环else
    }
}         // ik 0~511循环到此
}      

vb2002 发表于 2024-8-3 12:01:33

wjhhhhh 发表于 2024-8-3 11:55
可以参考一下。
/**把关机时的台 写二个字节到第二个扇区前一字节的前四位是波段 后四位和后一字节的八位 ...

你这个代码我就更久看不懂了
{:4_167:}

vb2002 发表于 2024-8-3 12:13:32

wnagming 发表于 2024-8-3 11:31
STC8H1K08我用过,成功了的

程序里面看着挺简单的, 就是调不通.
.h文件里面的见到还要调用 main.h

wjhhhhh 发表于 2024-8-3 12:24:40

本帖最后由 wjhhhhh 于 2024-8-3 12:29 编辑

vb2002 发表于 2024-8-3 12:01
你这个代码我就更久看不懂了
大致的思路是 写入二个字节新数据(第一个的高四位小于15)前找到连续的两个0xFF在这两个的位置写入新数据 直到扇区末尾没有了连续的两个0xFF 就擦除又从头开始写。在写入的数据里尽量找持续不变的特征作为标记判断连续的0xFF没有写的地址位置实在没有特征就给它加一个。

vb2002 发表于 2024-8-3 12:28:01

wnagming 发表于 2024-8-3 11:31
STC8H1K08我用过,成功了的

我编译出来,很多很多错误.
看的眼都花了

vb2002 发表于 2024-8-3 13:02:33

wnagming 发表于 2024-8-3 12:53
不好意思,忘记了,main.h里主要是变量大小的定义(u8 u16 u32)等

那我再试试 把main.c 里面的u8 u16移动一下
页: 1 2 [3] 4
查看完整版本: 请教下这位老哥说的,可以减少eeprom的磨损.