找回密码
 立即注册
查看: 2928|回复: 50

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

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

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2024-8-3 14:13:49 | 显示全部楼层 |阅读模式
本帖最后由 vb2002 于 2024-8-3 14:15 编辑

代码 断电换挡 (该部分之前已经实现了),但是只写入一点点东西,需要擦除整个扇区.
现在是先写,写完整个扇区,然后擦除,擦头开始写.
代码和 .c  .h文件附上
EEPROM.c (1.65 KB, 下载次数: 100) EEPROM.h (1.07 KB, 下载次数: 92) main.c (3.06 KB, 下载次数: 93)

  1. #include "stc8h.h"
  2. #include "intrins.h"
  3. #include "eeprom.h"
  4. #include <stdio.h>
  5. #define MAIN_Fosc 11059200UL
  6. #define BRT         (65536 - MAIN_Fosc / 115200 / 4)
  7. //#define add           0x0E00
  8. typedef unsigned char u8;
  9. typedef unsigned int u16;
  10.   
  11. u8 state;
  12. u8 show,cnt;
  13. u8 dat;
  14. u16 EEPROMId = 0XE00;
  15. bit key_flag;
  16. //void delayms(u16 ms);   
  17. void sys_init();
  18. void PWM_init(void);
  19. //void Timer0_Init(void);
  20. void UartInit()
  21. {
  22.     SCON = 0x5a;
  23.     T2L = BRT;
  24.     T2H = BRT >> 8;
  25.     AUXR = 0x15;
  26. }
  27. void UartSend(char dat)
  28. {
  29.     while (!TI);
  30.     TI = 0;
  31.     SBUF = dat;
  32. }
  33. void main()
  34. {               
  35.         sys_init();  
  36.     UartInit();
  37. IapIdle();
  38. dat = IapRead(EEPROMId+1);
  39. if(dat == 0XFF)
  40. {
  41. dat = IapRead(EEPROMId);
  42. }
  43. else
  44. {
  45. EEPROMId++;
  46. }
  47.                 if(EEPROMId >= 0XFFD)//如果当前字节到达EEPROM末尾,擦除扇区所有数据
  48.                 {       
  49. //                        SetMode(CMD_ERASE);        //扇区擦除
  50.                         IapErase(0x0e00);        //擦除扇区
  51.                  
  52.                 }
  53.   
  54.      UartSend(IapRead(dat));
  55.      UartSend(IapRead(EEPROMId));
  56.         PWMA_CCR1 = state;   
  57. //        if(temp != 0xFF) number = temp;         
  58.        
  59.           while(1)
  60.         {
  61.         switch(state)
  62.         {
  63.                 case 0 :  IapProgram(EEPROMId+1,state); PWMA_CCR1 = 5;   break;
  64.                 case 1 :  IapProgram(EEPROMId+1,state); PWMA_CCR1 = 15;   break;
  65.                 case 2 :  IapProgram(EEPROMId+1,state); PWMA_CCR1 = 55;   break;
  66.                 case 3 :  IapProgram(EEPROMId+1,state); PWMA_CCR1 = 250;   break;
  67.                 default:break;
  68.         }
  69.         }
  70.          
  71.        
  72. }
  73. void sys_init(void)
  74. {
  75.         P_SW2=0x80;
  76.        
  77.     P3M0 = 0x00; P3M1 = 0x00;       P1M0 = 0x00; P1M1 = 0x00;
  78.        
  79.              PWM_init();
  80. //         Timer0_Init();
  81.        
  82.         IT0=1;EX0=1;
  83.         INTCLKO|=0x40;   //EX4=1; 允许INT4外部中断
  84. //        IP2H=0x00;               
  85.         IP2=0x10;
  86.        
  87.         EA=1;                        //打开总中断
  88. }
  89. //// 初始化PWM功能
  90. void PWM_init(void) {
  91.     PWMA_CCER1 = 0x00;                          // 写CCMRx前必须先清零CCERx关闭通道
  92.     PWMA_CCMR1 = 0x60;                          // 设置CC1为PWMA输出模式
  93.     PWMA_PS        = 0x00;                      //  
  94.     PWMA_CCER1 = 0x03;                          // 使能CC4通道双极
  95.     PWMA_CCR1 = 0;                              // 初始化CCR4计数值为0
  96.     PWMA_ARR = 256;                           // 设置周期时间为12000个计数周期
  97.     PWMA_ENO = 0x01;                            // 使能PWM4P+N端口输出
  98.     PWMA_PSCR = 0;                              // PWM时钟预分频寄存器设置为0
  99.     PWMA_BKR = 0x80;                            // 使能主输出
  100.     PWMA_CR1 = 0x01;                            // 开始计时
  101.        
  102. }
  103. //void Timer0_Isr(void) interrupt 1
  104. //{
  105. //        flag=1;
  106. //}
  107. //void Timer0_Init(void)                //1毫秒@11.0592MHz
  108. //{
  109. //        AUXR |= 0x80;                        //定时器时钟1T模式
  110. //        TMOD &= 0xF0;                        //设置定时器模式
  111. //        TMOD |= 0x01;                        //设置定时器模式
  112. //        TL0 = 0xCD;                                //设置定时初始值
  113. //        TH0 = 0xD4;                                //设置定时初始值
  114. //        TF0 = 0;                                //清除TF0标志
  115. //        TR0 = 1;                                //定时器0开始计时
  116. //        ET0 = 1;                                //使能定时器0中断
  117. //}
  118. void INT4_Isr(void) interrupt 16
  119. {
  120. IAP_CONTR=0x60;                       
  121. }
  122. void INT0_Isr(void) interrupt 0
  123. {
  124. }
  125. void delayms(u16 ms)
  126.         {u16 i;
  127.         do{
  128.                 i = MAIN_Fosc /10000;
  129.                 while(--i);
  130.         }                while(--ms);
  131. }
  132.        
复制代码
复制代码

回复

使用道具 举报 送花

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

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2024-8-3 17:00:24 | 显示全部楼层
wnag*** 发表于 2024-8-3 16:54
我刚才看到库函数有EEPROM的操作函数,要是你的EEPROM.c不能用,在官网下载库函数用呗,先把EEPROM的读写擦 ...

库函数跑起来没问题.  eeprom均衡写入就不会弄了

截图202408031700063869.jpg

回复 支持 反对

使用道具 举报 送花

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

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2024-8-3 17:17:06 | 显示全部楼层
wnag*** 发表于 2024-8-3 17:10
就这么几行代码你要是还看不明白,我真没办法了

我调用了.但是老是报错,要不你抽两分钟,帮我改一下?
放在我的代码里
回复 支持 反对

使用道具 举报 送花

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

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2024-8-3 17:28:10 | 显示全部楼层
wnag*** 发表于 2024-8-3 17:20
报错截图来看看


这个是我的代码,劳您看一眼
库函数的调用 我用的其他文件夹
库文件已经添加只目录内了

1.35 eeprom 均衡wyh -demo.zip (78.93 KB, 下载次数: 104)
回复 支持 反对

使用道具 举报 送花

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

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2024-8-3 17:32:26 | 显示全部楼层
wnag*** 发表于 2024-8-3 17:29
报错截图,我要看截图

我加你微信了
我重新整理下
回复 支持 反对

使用道具 举报 送花

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

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2024-8-3 19:26:16 | 显示全部楼层
wnag*** 发表于 2024-8-3 17:34
驾校教练?佩服

是啊,驾校教练.
现在可以写了.
就是led点不亮了
刚刚把u8 dat 和u16 eepromid,移到全局变量去了.可以点亮,但是又不能换挡了!!
回复 支持 反对

使用道具 举报 送花

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

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2024-8-3 22:54:03 | 显示全部楼层
wnag*** 发表于 2024-8-3 19:54
好好看视频学习一下吧
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=323

感谢大佬指点,
回复 支持 反对

使用道具 举报 送花

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

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2024-8-4 15:56:57 来自手机 | 显示全部楼层
wnagming 发表于 2024-8-3 20:02
u8 dat 和u16 eepromid这两个尽量放在函数内,全局变量不宜太多,用函数返回值做数据就好 ...

我加了定时器上去,
通电开始计时,3秒内关机再开,就换下一个档,  3秒后关机再开就是就是当前档位不变
代码加在定时器中断里面
if (time<3000)
运行switch
else
这后面不会写了
回复 支持 反对

使用道具 举报 送花

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

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2024-8-4 17:30:22 | 显示全部楼层
wnag*** 发表于 2024-8-4 17:09
后面就不用写了,time

这样没效果.
  1. void Timer0_Isr(void) interrupt 1
  2. {        
  3.         TL0 = 0xCD;                                //设置定时初始值
  4.         TH0 = 0xD4;                                //设置定时初始值
  5.          if(time<200)
  6.         {
  7.                 switch(dat)
  8.                         {       
  9.                                 case 254: IapProgram(EEPROMId+1,1);break;
  10.                                 case 1: IapProgram(EEPROMId+1,15);break;
  11.                                 case 15: IapProgram(EEPROMId+1,55);break;
  12.                                 default: IapProgram(EEPROMId+1,254);break;
  13.                         }               
  14.                
  15.                
  16.         }
  17.         else
  18.         {
  19.                
  20.        
  21.         }
  22.         if(time<200) time++;
  23. }
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:233
  • 最近打卡:2025-04-30 16:08:37

61

主题

818

回帖

1490

积分

金牌会员

积分
1490
发表于 2024-8-4 17:32:13 | 显示全部楼层
  学习
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 06:09 , Processed in 0.149090 second(s), 114 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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