找回密码
 立即注册
查看: 353|回复: 9

AI8H的EEPROM如何使用

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:47
  • 最近打卡:2025-04-10 06:42:19

19

主题

39

回帖

373

积分

中级会员

积分
373
发表于 2024-11-11 10:11:43 | 显示全部楼层 |阅读模式
本帖最后由 DebugLab 于 2024-11-11 10:47 编辑

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-11-11 10:51:28 | 显示全部楼层
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. sfr     P0M1    =   0x93;
  4. sfr     P0M0    =   0x94;
  5. sfr     P1M1    =   0x91;
  6. sfr     P1M0    =   0x92;
  7. sfr     P2M1    =   0x95;
  8. sfr     P2M0    =   0x96;
  9. sfr     P3M1    =   0xb1;
  10. sfr     P3M0    =   0xb2;
  11. sfr     P4M1    =   0xb3;
  12. sfr     P4M0    =   0xb4;
  13. sfr     P5M1    =   0xc9;
  14. sfr     P5M0    =   0xca;
  15. sfr     IAP_DATA    =   0xC2;
  16. sfr     IAP_ADDRH   =   0xC3;
  17. sfr     IAP_ADDRL   =   0xC4;
  18. sfr     IAP_CMD     =   0xC5;
  19. sfr     IAP_TRIG    =   0xC6;
  20. sfr     IAP_CONTR   =   0xC7;
  21. sfr     IAP_TPS     =   0xF5;
  22. void IapIdle()
  23. {
  24.     IAP_CONTR = 0;                              //关闭IAP功能
  25.     IAP_CMD = 0;                                //清除命令寄存器
  26.     IAP_TRIG = 0;                               //清除触发寄存器
  27.     IAP_ADDRH = 0x80;                           //将地址设置到非IAP区域
  28.     IAP_ADDRL = 0;
  29. }
  30. char IapRead(int addr)
  31. {
  32.     char dat;
  33.     IAP_CONTR = 0x80;                           //使能IAP
  34.     IAP_TPS = 12;                               //设置等待参数12MHz
  35.     IAP_CMD = 1;                                //设置IAP读命令
  36.     IAP_ADDRL = addr;                           //设置IAP低地址
  37.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  38.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  39.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  40.     _nop_();
  41.     dat = IAP_DATA;                             //读IAP数据
  42.     IapIdle();                                  //关闭IAP功能
  43.     return dat;
  44. }
  45. void IapProgram(int addr, char dat)
  46. {
  47.     IAP_CONTR = 0x80;                           //使能IAP
  48.     IAP_TPS = 12;                               //设置等待参数12MHz
  49.     IAP_CMD = 2;                                //设置IAP写命令
  50.     IAP_ADDRL = addr;                           //设置IAP低地址
  51.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  52.     IAP_DATA = dat;                             //写IAP数据
  53.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  54.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  55.     _nop_();
  56.     IapIdle();                                  //关闭IAP功能
  57. }
  58. void IapErase(int addr)
  59. {
  60.     IAP_CONTR = 0x80;                           //使能IAP
  61.     IAP_TPS = 12;                               //设置等待参数12MHz
  62.     IAP_CMD = 3;                                //设置IAP擦除命令
  63.     IAP_ADDRL = addr;                           //设置IAP低地址
  64.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  65.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  66.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  67.     _nop_();                                    //
  68.     IapIdle();                                  //关闭IAP功能
  69. }
  70. void main()
  71. {
  72.     P0M0 = 0x00;
  73.     P0M1 = 0x00;
  74.     P1M0 = 0x00;
  75.     P1M1 = 0x00;
  76.     P2M0 = 0x00;
  77.     P2M1 = 0x00;
  78.     P3M0 = 0x00;
  79.     P3M1 = 0x00;
  80.     P4M0 = 0x00;
  81.     P4M1 = 0x00;
  82.     P5M0 = 0x00;
  83.     P5M1 = 0x00;
  84.     IapErase(0x0400);
  85.     P0 = IapRead(0x0400);                       //P0=0xff
  86.     IapProgram(0x0400, 0x12);
  87.     P1 = IapRead(0x0400);                       //P1=0x12
  88.     while (1);
  89. }
复制代码


DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:47
  • 最近打卡:2025-04-10 06:42:19

19

主题

39

回帖

373

积分

中级会员

积分
373
发表于 2024-11-11 13:02:19 | 显示全部楼层
本帖最后由 dongfang 于 2024-11-11 13:05 编辑

我看到这个程序了,但存不了,麻烦你看看什么原因,我用的是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[wu]);
                        write(1,DIS5[liu]);
                        write(1,DIS5[10]);
                        write(1,DIS5[qi]);
                        write(1,DIS5[ba]);
               
//                 ADD=Get_ADC10bitResult(1);

                        
                        yi  = ADD/1000;
                        er  = ADD%1000/100;
                        san = ADD%100/10;
                        si  = ADD%10;         
                        
                        write(0,0x88);
                        write(1,DIS5[yi]);
                        write(1,DIS5[10]);
                        write(1,DIS5[er]);                        
                        write(1,DIS5[san]);
                        write(1,DIS5[si]);
                        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还是零,没有保存下来,你看看保存读取有错误吗
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:434
  • 最近打卡:2025-05-01 20:16:58
已绑定手机

229

主题

328

回帖

1471

积分

金牌会员

积分
1471
发表于 2024-11-11 13:16:48 | 显示全部楼层
3ee2c295-12ec-49eb-8479-8eeb41de3ba3.png


QQ20241111-131244.png

这是EEPROM一个扇区的终极用法,一共50行代码简洁高效
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:351
  • 最近打卡:2025-05-02 00:50:51
已绑定手机

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2024-11-12 13:27:26 | 显示全部楼层
QQ6243*** 发表于 2024-11-11 13:16
这是EEPROM一个扇区的终极用法,一共50行代码简洁高效

不用擦除吗?
可以单独按字节循环写吗
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:434
  • 最近打卡:2025-05-01 20:16:58
已绑定手机

229

主题

328

回帖

1471

积分

金牌会员

积分
1471
发表于 2024-11-12 14:15:14 | 显示全部楼层
vb2*** 发表于 2024-11-12 13:27
不用擦除吗?
可以单独按字节循环写吗

擦了才能写,慢慢参悟,里面藏着很多编程的先进思想
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:154
  • 最近打卡:2025-04-30 08:40:57
已绑定手机

15

主题

630

回帖

730

积分

高级会员

积分
730
发表于 2024-11-13 18:15:08 来自手机 | 显示全部楼层
QQ624353765 发表于 2024-11-12 14:15
擦了才能写,慢慢参悟,里面藏着很多编程的先进思想

不错 学习了
STC 666 888
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:351
  • 最近打卡:2025-05-02 00:50:51
已绑定手机

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2024-11-14 09:31:27 | 显示全部楼层

学会了吗?
我是半天没研究明白.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:53
  • 最近打卡:2024-12-27 08:18:49

0

主题

132

回帖

136

积分

注册会员

积分
136
发表于 2024-11-14 11:47:21 | 显示全部楼层
学习了
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:47
  • 最近打卡:2025-04-10 06:42:19

19

主题

39

回帖

373

积分

中级会员

积分
373
发表于 2024-11-14 16:43:44 | 显示全部楼层
我的eeprom存储成功了,不是程序问题是存储地址的问题,使用IAP访问存储,地址都是从相对地址0000开始的,结束地址就看自定义EEPORM的大小了。
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 06:59 , Processed in 0.282065 second(s), 116 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表