找回密码
 立即注册
楼主: vb2002

被这个代码卡脖子了..有大佬伸出援助之手吗?

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

318

回帖

1835

积分

金牌会员

积分
1835
发表于 2024-8-6 16:57:02 | 显示全部楼层
本帖最后由 Lkck8210 于 2024-8-6 16:58 编辑
vb2*** 发表于 2024-8-6 02:27
你这个代码上面我不会弄,,能否给出代码哦?

screenshots.gif

用的是STC8G1K08A
  1. #include <STC8G.H>
  2. #include <intrins.h>//_nop_, _cror_, _crol_
  3. #include <stdio.h>//printf, sprintf
  4. //#include <string.h>//strlen, strcmp, strcpy, strcat
  5. typedef         unsigned char        u8;  //0 to 255
  6. typedef         unsigned int        u16;  //0 to 65535
  7. typedef         unsigned long        u32;  //0 to 4294967295
  8. void Timer0_Init(void)                //5毫秒@11.0592MHz
  9. {
  10.         AUXR &= 0x7F;                        //定时器时钟12T模式
  11.         TMOD &= 0xF0;                        //设置定时器模式
  12.         TL0 = 0x00;                                //设置定时初始值
  13.         TH0 = 0xEE;                                //设置定时初始值
  14.         TF0 = 0;                                //清除TF0标志
  15.         TR0 = 1;                                //定时器0开始计时
  16. }
  17. void IapIdle()
  18. {
  19.     IAP_CONTR = 0;                              //关闭IAP功能
  20.     IAP_CMD = 0;                                //清除命令寄存器
  21.     IAP_TRIG = 0;                               //清除触发寄存器
  22.     IAP_ADDRH = 0x80;                           //将地址设置到非IAP区域
  23.     IAP_ADDRL = 0;
  24. }
  25. char IapRead(int addr)
  26. {
  27.     char dat;
  28.     IAP_CONTR = 0x80;                           //使能IAP
  29.     IAP_TPS = 12;                               //设置等待参数12MHz
  30.     IAP_CMD = 1;                                //设置IAP读命令
  31.     IAP_ADDRL = addr;                           //设置IAP低地址
  32.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  33.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  34.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  35.     _nop_();
  36.     dat = IAP_DATA;                             //读IAP数据
  37.     IapIdle();                                  //关闭IAP功能
  38.     return dat;
  39. }
  40. void IapProgram(int addr, char dat)
  41. {
  42.     IAP_CONTR = 0x80;                           //使能IAP
  43.     IAP_TPS = 12;                               //设置等待参数12MHz
  44.     IAP_CMD = 2;                                //设置IAP写命令
  45.     IAP_ADDRL = addr;                           //设置IAP低地址
  46.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  47.     IAP_DATA = dat;                             //写IAP数据
  48.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  49.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  50.     _nop_();
  51.     IapIdle();                                  //关闭IAP功能
  52. }
  53. void IapErase(int addr)
  54. {
  55.     IAP_CONTR = 0x80;                           //使能IAP
  56.     IAP_TPS = 12;                               //设置等待参数12MHz
  57.     IAP_CMD = 3;                                //设置IAP擦除命令
  58.     IAP_ADDRL = addr;                           //设置IAP低地址
  59.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  60.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  61.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  62.     _nop_();                                    //
  63.     _nop_();                                    //
  64.     _nop_();                                    //
  65.     _nop_();                                    //
  66.     _nop_();                                    //
  67.     _nop_();                                    //
  68.     IapIdle();                                  //关闭IAP功能
  69. }
  70. void Delay50ms(void)        //@12.000MHz
  71. {
  72.         unsigned char data i, j, k;
  73.         _nop_();
  74.         _nop_();
  75.         i = 4;
  76.         j = 12;
  77.         k = 50;
  78.         do
  79.         {
  80.                 do
  81.                 {
  82.                         while (--k);
  83.                 } while (--j);
  84.         } while (--i);
  85. }
  86. u8 bdata Byte;
  87. sbit Bit0 = Byte^0;
  88. sbit Bit1 = Byte^1;
  89. sbit Bit2 = Byte^2;
  90. sbit Bit3 = Byte^3;
  91. sbit Bit4 = Byte^4;
  92. sbit Bit5 = Byte^5;
  93. void GPIO_W(u8 dat)
  94. {
  95.         Byte = dat;
  96.         P30 = Bit0;
  97.         P31 = Bit1;
  98.         P32 = Bit2;
  99.         P33 = Bit3;
  100.         P54 = Bit4;
  101.         P55 = Bit5;
  102. }
  103. #define EEPromAddrStr 0x0000
  104. #define EEPromAddrEnd EEPromAddrStr+0x200
  105. void main()
  106. {
  107.         u8 mode = 0, SwitchTime = 0, delay = 75;
  108.         u16 i, TimEEPromAddr, ModeEEPromAddr;
  109.         Delay50ms();
  110.         Timer0_Init();
  111.         P3M0=0;P3M1=0;
  112.         P5M0=0;P5M1=0;
  113.         for(i=EEPromAddrStr;i<EEPromAddrEnd;i+=2)
  114.         {
  115.                 SwitchTime = IapRead(i);
  116.                 if(SwitchTime==0xFF)break;
  117.         }
  118.         if(i==EEPromAddrStr)
  119.         {
  120.                 TimEEPromAddr = EEPromAddrStr;
  121.         }
  122.         else
  123.         {
  124.                 SwitchTime = IapRead(i - 2);
  125.                 mode = IapRead(i - 2 + 1);
  126.                 if(i>=EEPromAddrEnd)
  127.                 {
  128.                         TimEEPromAddr = EEPromAddrStr;
  129.                         IapErase(EEPromAddrStr);
  130.                 }else{
  131.                         TimEEPromAddr = i;
  132.                 }
  133.         }
  134.         ModeEEPromAddr = TimEEPromAddr+1;
  135.         if((SwitchTime > 0) && (i!=EEPromAddrStr))
  136.         {
  137.                 mode = ++mode % 5;
  138.         }
  139.         IapProgram(ModeEEPromAddr, mode);
  140.         SwitchTime = 0xFF;
  141.         GPIO_W(~(0x01<<mode));
  142.     while (1)
  143.         {
  144.                 if(TF0)//5ms
  145.                 {
  146.                         TF0=0;
  147.                         if(++delay>=75)//75 x 5ms = 375ms
  148.                         {
  149.                                 delay=0;
  150.                                 if(SwitchTime)//8 x 375ms = 3000ms
  151.                                 {
  152.                                         SwitchTime>>=1;
  153.                                         IapProgram(TimEEPromAddr, SwitchTime);
  154.                                 }
  155.                         }
  156.                 }
  157.         }
  158. }
复制代码


回复 支持 反对

使用道具 举报 送花

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

130

主题

1521

回帖

1861

积分

金牌会员

积分
1861
发表于 2024-8-6 18:06:05 来自手机 | 显示全部楼层
Lkck8210 发表于 2024-8-6 16:57
用的是STC8G1K08A

我手电里也是用的 stc8g1k08a,,就这个体积小
回复 支持 反对

使用道具 举报 送花

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

130

主题

1521

回帖

1861

积分

金牌会员

积分
1861
发表于 2024-8-6 18:43:22 | 显示全部楼层
wnag*** 发表于 2024-8-6 13:34
要是没效果,就把PWM初始化放前面

是这个问题,,我把PWM放在eeprom后面就好了.
但是只解决了一半,,还是有点点闪,,不过可以接受了.
之前是超级闪,现在就是一丢丢闪
回复 支持 反对

使用道具 举报 送花

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

130

主题

1521

回帖

1861

积分

金牌会员

积分
1861
发表于 2024-8-6 19:33:48 | 显示全部楼层

你这个代码,,我是不是直接就把这IO口改成PCA_PWM= 占空比数值就好了.!

截图202408061933022241.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:467
  • 最近打卡:2025-05-01 19:48:59
已绑定手机

20

主题

106

回帖

671

积分

高级会员

积分
671
发表于 2024-8-6 20:44:31 | 显示全部楼层
磨损均衡算法,如你的程序EEPROM使用了32字节,分为16个区存储,每个区32字节(共1个扇区512字节),所有区用完了再擦再写。
一个区全部为0xFF表示无数据,任何一个字节不等于0xFF表示有数据
写:1区无数据则写进1区,有数据进入2区以此类推,16区有数据则擦除整个扇区写1区返回。
读:从16区读,有数据返回数据,无数据读15区以此类推,1区没有读到数据则没有数据。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

318

回帖

1835

积分

金牌会员

积分
1835
发表于 2024-8-6 20:58:34 | 显示全部楼层
vb2*** 发表于 2024-8-6 19:33
你这个代码,,我是不是直接就把这IO口改成PCA_PWM= 占空比数值就好了.!

试试又不会逝世{:5_283:}
回复 支持 反对

使用道具 举报 送花

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

130

主题

1521

回帖

1861

积分

金牌会员

积分
1861
发表于 2024-8-6 21:55:51 | 显示全部楼层
12*** 发表于 2024-8-6 20:44
磨损均衡算法,如你的程序EEPROM使用了32字节,分为16个区存储,每个区32字节(共1个扇区512字节),所有区用 ...

感谢你的解答,
已经有代码弄好了.
这个确实是大大延迟eeprom 寿命
回复 支持 反对

使用道具 举报 送花

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

130

主题

1521

回帖

1861

积分

金牌会员

积分
1861
发表于 2024-8-6 21:56:31 | 显示全部楼层
Lkck*** 发表于 2024-8-6 20:58
试试又不会逝世

已经研究2小时了.
这几天估计都是捣鼓你的代码了.
非常整洁,调理清晰.
回复 支持 反对

使用道具 举报 送花

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

130

主题

1521

回帖

1861

积分

金牌会员

积分
1861
发表于 2024-8-6 23:23:03 | 显示全部楼层
Lkck*** 发表于 2024-8-6 20:58
试试又不会逝世

弄好了,参照你的代码我修改了两处,麻烦帮看看有没有问题可以吗?
还有一个,,我把

#define EEPromAddrStr 12
#define EEPromAddrEnd EEPromAddrStr+4000
这两句改了, eeprom 从12开始写,,写到4012 就擦除 1-8个扇区.这些写对吗?因为太长了.不好测试.
我的想法是从12开始写,写到4012后,就擦除前面扇区,然后从头开始写.



截图202408062318284274.jpg

截图202408062321075205.jpg



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

318

回帖

1835

积分

金牌会员

积分
1835
发表于 2024-8-7 08:54:02 | 显示全部楼层
vb2*** 发表于 2024-8-6 23:23
弄好了,参照你的代码我修改了两处,麻烦帮看看有没有问题可以吗?
还有一个,,我把

刷扇区要一个一个刷,没看到代码
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 15:27 , Processed in 0.124857 second(s), 114 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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