发新帖我要提问
12
返回列表
打印

SH88F4051的EEPROM操作程序,已经调试通过,放心使用

[复制链接]
楼主: linlh11
手机看帖
扫描二维码
随时随地手机跟帖
21
浮忞| | 2020-5-12 14:41 | 只看该作者 回帖奖励 |倒序浏览
想试下EEPROM功能,显示一个数掉电后上电继续加数,但每次上电都是从0开始,有些延时,初始化,显示程序我就没贴出来
void Write_Data(unsigned int addr1,unsigned char dat1)
{
    unsigned char aa;
    aa = EA;
    EA = 0;
    FLASHCON = 0x01;                           //SSP编程需先关闭中断
    IB_DATA = dat1;                                //编程用数据寄存器
    IB_OFFSET = addr1;                        //被擦除/编程的块单元地址
    XPAGE = 0x00;                                //擦除/编程用扇区选择和地址选择寄存器
    if(gBFlashLock!=0x5A)                 //判断写操作标志位
    {
        goto Write_Err;
    }
    IB_CON1 = 0x6E;                                //SSP操作模式选择寄存器:存储单元编程
    IB_CON2 = 0x05;                                //SSP流程控制寄存器1
    IB_CON3 = 0x0A;
    IB_CON4 = 0x09;
    IB_CON5 = 0x06;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
Write_Err:
    gBFlashLock=0x00;
    XPAGE=0x00;
    FLASHCON = 0x00;                        //当不需要对类EEPROM操作时,必须将FAC位清0。
    EA = aa;
}


/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
SSP操作类EEPROM-读数据:
入口:addr = 扇区单元地址
出口:dat = 读出的数据
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
unsigned char Read_Data(unsigned int addr2)
{
    unsigned char dat2;
    unsigned char aa;
    aa = EA;
    EA = 0;
    EA = 0;
    FLASHCON = 0x01;
    XPAGE = 0x00;
    IB_OFFSET = addr2;
        if(gBFlashLock!=0x5A)                 // 烧写/擦除的超级抗干扰措施
    {
        goto Read_Err;
    }
    IB_CON1 = 0x6E;                                //SSP操作模式选择寄存器:存储单元编程
    IB_CON2 = 0x05;                                //SSP流程控制寄存器1
    IB_CON3 = 0x0A;
    IB_CON4 = 0x09;
    IB_CON5 = 0x06;
      
    dat2 = IB_DATA;                                //取出数据
    _nop_();
    _nop_();
    _nop_();
    _nop_();
Read_Err:
    gBFlashLock=0x00;
    XPAGE=0x00;
    FLASHCON = 0x00;                        //当不需要对类EEPROM操作时,必须将FAC位清0。
    EA = aa;
    return dat2;
}
//擦除
void cc(unsigned int addr)
{
        CY = EA;
    EA = 0;
    FLASHCON = 0x01;   
    XPAGE = addr;
        if(gBFlashLock != 0xA5)                 //判断写操作标志位
    {
        goto Erase_Err;
    }
    IB_CON1 = 0xE6;                                //SSP操作模式选择寄存器:扇形擦除
    IB_CON2 = 0x05;
    IB_CON3 = 0x0A;
    IB_CON4 = 0x09;
    IB_CON5 = 0x06;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
Erase_Err:
    gBFlashLock=0x00;
    XPAGE=0x00;
    FLASHCON = 0x00;
    EA = CY;
}
void work()
{
    T++;
    if(T == 1000)
    {
        T = 0;
        num ++;
        {
            if(num > 60)
            {
                num = 0;
            }
        }
    }
    cc(0x01);
    Write_Data(0x01,num);
}
void view()
{
    Display_DIA(0,num);
}
void main()
{
    Oscillator_Init();
    CLK32KTO24M();
    init();
    Delayms(1);
    ClearDisplay();
    gBFlashLock = 0x5A;                        //烧写/擦除的超级抗干扰措施 标志位
    num = Read_Data(0x01);
    while(1)
    {
        work();
        view();
        Delayms(1);
    }
}

使用特权

评论回复
22
linlh11|  楼主 | 2020-5-20 22:16 | 只看该作者
浮忞 发表于 2020-5-12 14:41
想试下EEPROM功能,显示一个数掉电后上电继续加数,但每次上电都是从0开始,有些延时,初始化,显示程序我 ...

你的程序中计数是不是一直在进行中,然后突然掉电后,把当前计数值存入类EEPROM里,重新上电后你还想继续接着掉电前的数值计数?如果是这样的话,那么就牵涉到掉电存储这样的技术。因为掉电存储处理不好,写入类EEPROM里的数据就是0,你可以先试试,程序运行时存入数据,不要在掉电时存入数据,然后断电再上电,看数据正确否,排除一下正常存储时你的程序没有而我问题。

使用特权

评论回复
23
浮忞| | 2020-5-25 10:37 | 只看该作者
linlh11 发表于 2020-5-20 22:16
你的程序中计数是不是一直在进行中,然后突然掉电后,把当前计数值存入类EEPROM里,重新上电后你还想继续 ...

谢谢楼主耐心解答和帮助,找到原因了,是延时太短了(main里面的while循环里只延时了一毫秒),导致程序运行太快没足够时间写进去,把延时加长点就没问题了

使用特权

评论回复
24
linlh11|  楼主 | 2020-5-26 16:23 | 只看该作者
浮忞 发表于 2020-5-25 10:37
谢谢楼主耐心解答和帮助,找到原因了,是延时太短了(main里面的while循环里只延时了一毫秒),导致程序 ...

解决问题就好,没想到我8年前写的帖子,现在还在板块顶部,竟然没有沉下去。好长时间我都没有来论坛了

使用特权

评论回复
25
scottjiang| | 2020-6-22 13:46 | 只看该作者
csdn有78/79系列eeprom读写库,把数据结构封装,读写soeasy!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则