dongfang 发表于 2024-11-11 10:11:43

AI8H的EEPROM如何使用

本帖最后由 DebugLab 于 2024-11-11 10:47 编辑

AI8H的EEPROM如何使用,请高手指教

DebugLab 发表于 2024-11-11 10:51:28

#include "reg51.h"
#include "intrins.h"

sfr   P0M1    =   0x93;
sfr   P0M0    =   0x94;
sfr   P1M1    =   0x91;
sfr   P1M0    =   0x92;
sfr   P2M1    =   0x95;
sfr   P2M0    =   0x96;
sfr   P3M1    =   0xb1;
sfr   P3M0    =   0xb2;
sfr   P4M1    =   0xb3;
sfr   P4M0    =   0xb4;
sfr   P5M1    =   0xc9;
sfr   P5M0    =   0xca;

sfr   IAP_DATA    =   0xC2;
sfr   IAP_ADDRH   =   0xC3;
sfr   IAP_ADDRL   =   0xC4;
sfr   IAP_CMD   =   0xC5;
sfr   IAP_TRIG    =   0xC6;
sfr   IAP_CONTR   =   0xC7;
sfr   IAP_TPS   =   0xF5;

void IapIdle()
{
    IAP_CONTR = 0;                              //关闭IAP功能
    IAP_CMD = 0;                              //清除命令寄存器
    IAP_TRIG = 0;                               //清除触发寄存器
    IAP_ADDRH = 0x80;                           //将地址设置到非IAP区域
    IAP_ADDRL = 0;
}

char IapRead(int addr)
{
    char dat;

    IAP_CONTR = 0x80;                           //使能IAP
    IAP_TPS = 12;                               //设置等待参数12MHz
    IAP_CMD = 1;                              //设置IAP读命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();
    dat = IAP_DATA;                           //读IAP数据
    IapIdle();                                  //关闭IAP功能

    return dat;
}

void IapProgram(int addr, char dat)
{
    IAP_CONTR = 0x80;                           //使能IAP
    IAP_TPS = 12;                               //设置等待参数12MHz
    IAP_CMD = 2;                              //设置IAP写命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_DATA = dat;                           //写IAP数据
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();
    IapIdle();                                  //关闭IAP功能
}

void IapErase(int addr)
{
    IAP_CONTR = 0x80;                           //使能IAP
    IAP_TPS = 12;                               //设置等待参数12MHz
    IAP_CMD = 3;                              //设置IAP擦除命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();                                    //
    IapIdle();                                  //关闭IAP功能
}

void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;

    IapErase(0x0400);
    P0 = IapRead(0x0400);                     //P0=0xff
    IapProgram(0x0400, 0x12);
    P1 = IapRead(0x0400);                     //P1=0x12

    while (1);
}



dongfang 发表于 2024-11-11 13:02:19

本帖最后由 dongfang 于 2024-11-11 13:05 编辑

DebugLab 发表于 2024-11-11 10:51

我看到这个程序了,但存不了,麻烦你看看什么原因,我用的是STC8H1K28, IPA设置是4k
void main()
{
               
                STC_Init();                           //初始化STC8H
                lcdinit();                            //初始化LCD
                ADC_Init();                                                         //初始化ADC
                Timer0_Init();                   //初始化时钟0               
                PWM_config();                                                      //初始PWMA

                iap_h = IapRead(0x6000);
                iap_l = IapRead(0x6001);
                ADD=(u16)iap_h * 256 + (u16)iap_l;
      
      
    IE0= 0;       //外中断0标志位
    EX0 = 1;      //INT0 使能
    IT0 = 1;      //INT0 下降沿中断               
                EA=1;
/******************************************/      

                photodisplay(Photo1);   //显示图片1
                delay_ms(250);
         
               
                zdkz ();
      /*************************************/
   while(1)
   {                        
                                          
                AD=Get_ADC10bitResult(0);
               
                        ADF=AD*4.88;
                        delay_ms(1);
                        AD=ADF;

                        wu= AD/1000;
                        liu = AD%1000/100;
                        qi= AD%100/10;
                        ba= AD%10;         
               
                        write(0,0x90);
                        write(1,DIS5);
                        write(1,DIS5);
                        write(1,DIS5);
                        write(1,DIS5);
                        write(1,DIS5);
               
//               ADD=Get_ADC10bitResult(1);

                        
                        yi= ADD/1000;
                        er= ADD%1000/100;
                        san = ADD%100/10;
                        si= ADD%10;         
                        
                        write(0,0x88);
                        write(1,DIS5);
                        write(1,DIS5);
                        write(1,DIS5);                        
                        write(1,DIS5);
                        write(1,DIS5);
                        write(0,0x98);
                        write(1,0x10);
                        
                                             

                        if(ADD!=ADD_1)
                              {
                                                      ADD_1=ADD;
                                                      IapErase(0x6000);
                                                      iap_h = (u8)(ADD_1>>8);
                                                      iap_l = (u8)(ADD_1);               
                                                      IapProgram(0x6000,iap_h);
                                                      IapProgram(0x6001, iap_l);
                              }
                        
                        
   }
}
我用编码器改变ADD的值,改变ADD的值,重新上电ADD还是零,没有保存下来,你看看保存读取有错误吗

QQ624353765 发表于 2024-11-11 13:16:48






这是EEPROM一个扇区的终极用法,一共50行代码简洁高效

vb2002 发表于 2024-11-12 13:27:26

QQ624353765 发表于 2024-11-11 13:16
这是EEPROM一个扇区的终极用法,一共50行代码简洁高效

不用擦除吗?
可以单独按字节循环写吗

QQ624353765 发表于 2024-11-12 14:15:14

vb2002 发表于 2024-11-12 13:27
不用擦除吗?
可以单独按字节循环写吗

擦了才能写,慢慢参悟,里面藏着很多编程的先进思想

wlhet 发表于 2024-11-13 18:15:08

QQ624353765 发表于 2024-11-12 14:15
擦了才能写,慢慢参悟,里面藏着很多编程的先进思想

不错 学习了

vb2002 发表于 2024-11-14 09:31:27

rpbdibvj 发表于 2024-11-13 18:15
不错 学习了

学会了吗?
我是半天没研究明白.

hande5 发表于 2024-11-14 11:47:21

学习了

dongfang 发表于 2024-11-14 16:43:44

我的eeprom存储成功了,不是程序问题是存储地址的问题,使用IAP访问存储,地址都是从相对地址0000开始的,结束地址就看自定义EEPORM的大小了。
页: [1]
查看完整版本: AI8H的EEPROM如何使用