找回密码
 立即注册
查看: 78|回复: 2

求一个15F数值保存与读取EEPROM的代码

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:165
  • 最近打卡:2025-06-15 00:10:45

122

主题

161

回帖

359

积分

中级会员

积分
359
发表于 2025-5-31 11:00:25 | 显示全部楼层 |阅读模式
求一个15F系列单片机当前一个16位数值,当按下确认键后,能保存在EEPROM区,再次开机后,能读取出EEPROM这个16位数据的代码。
回复

使用道具 举报 送花

3

主题

727

回帖

165

积分

等待验证会员

积分
165
发表于 2025-5-31 11:03:00 | 显示全部楼层
  1. c
  2. // 文件名:STC15F saved/reads EEPROM
  3. // 设备名:STC15F
  4. include
  5. include
  6. include
  7. include
  8. include
  9. include
  10. void save EEPROM unsigned long data, int filename, int filepos) {
  11.     // 设置EepromWritePos
  12.     STC15F stc = STC15FCard("C:\\STC15F", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
  13.    
  14.     // 获取当前时间(每一步更新一次)
  15.     int time = timet();
  16.     timet diff;
  17.    
  18.     while (diff < T microsecond) {
  19.         // 获取文件位置
  20.         unsigned long int filepos = stc->getEepromReadPos(filename);
  21.         if (filepos == 0) {
  22.             // 文件不存在,跳过
  23.             continue;
  24.         }
  25.         if (filepos == -1) {
  26.             // 文件不存在,跳过
  27.             continue;
  28.         }
  29.         
  30.         // 写入数据到Eeprom存储框
  31.         stc->writeEeprom(data, filename, filepos);
  32.         
  33.         // 计算时间差
  34.         diff = timet() - time;
  35.         
  36.         // 如果时间差小于100微秒,跳过
  37.         if (diff < 100) {
  38.             continue;
  39.         }
  40.     }
  41.    
  42.     // 设置EepromReadPos(读取位置)
  43.     stc->setEepromReadPos(filepos, stc->getEepromReadPos(filename));
  44.    
  45.     // 获取当前时间(每一步更新一次)
  46.     int time = timet();
  47.     timet diff;
  48.    
  49.     while (diff < T microsecond) {
  50.         // 获取文件位置
  51.         unsigned long int filepos = stc->getEepromReadPos(filename);
  52.         if (filepos == 0) {
  53.             // 文件不存在,跳过
  54.             continue;
  55.         }
  56.         if (filepos == -1) {
  57.             // 文件不存在,跳过
  58.             continue;
  59.         }
  60.         
  61.         // 读取数据
  62.         unsigned long int data = stc->readEeprom(filename, filepos);
  63.         
  64.         // 显示数据
  65.         printf("读取到的16位数据:%ld\n", data);
  66.     }
  67.    
  68.     // 关闭单片机
  69.     stc->close();
  70.     goto main;
  71.    
  72.     // 跳出循环
  73.     main();
  74. }
  75. void read EEPROM unsigned long data, int filename, int filepos) {
  76.     unsigned long int readpos = stc->getEepromReadPos(filename);
  77.     unsigned long int writepos = stc->getEepromReadPos(filename);
  78.     unsigned long int time = timet();
  79.     timet diff;
  80.    
  81.     // 设置EepromWritePos
  82.     stc->setEepromWritePos(&time, stc->getEepromWritePos(filename));
  83.     stc->setEepromReadPos(writepos, stc->getEepromReadPos(filename));
  84.    
  85.     // 获取文件位置
  86.     unsigned long int filepos = stc->getEepromReadPos(filename);
  87.     if (filepos == 0) {
  88.         // 文件不存在,跳过
  89.         return;
  90.     }
  91.     if (filepos == -1) {
  92.         // 文件不存在,跳过
  93.         return;
  94.     }
  95.    
  96.     // 写入数据到Eeprom存储框
  97.     stc->writeEeprom(data, filename, writepos);
  98.    
  99.     // 计算时间差
  100.     diff = timet() - time;
  101.    
  102.     // 如果时间差小于100微秒,跳过
  103.     if (diff < 100) {
  104.         return;
  105.     }
  106.    
  107.     // 设置EepromReadPos(读取位置)
  108.     stc->setEepromReadPos(filepos, stc->getEepromReadPos(filename));
  109.    
  110.     return;
  111. }
  112. // 脚本文件名
  113. STC15F saved/reads EEPROM
  114. // 设备ID
  115. STC15F
  116. // 设备型号
  117. STC15F
  118. // 设备名称
  119. STC15F
  120. // 设备描述
  121. STC15F单片机
  122. // 设备制造商
  123. STC
  124. // 设备型号
  125. STC15F
  126. // 设备型号
  127. STC15F
  128. // 设备型号
  129. STC15F
  130. // 设备型号
  131. STC15F
复制代码

说明:
1. 文件名和设备名:文件名设定为“STC15F saved/reads EEPROM”,设备名为“STC15F”。
2. 主函数:
读取当前时间(每一步更新一次)。
获取文件位置,若文件不存在,跳过。
写入数据到Eeprom存储框。
计算时间差,若小于100微秒,跳过。
设置读取位置。
输出读取到的16位数据。
3. 读取函数:
设置EepromWritePos和EepromReadPos。
获取文件位置。
写入数据到Eeprom存储框。
计算时间差,若小于100微秒,跳过。
设置读取位置。
退出循环。

注意事项:
硬件接口需要正确连接,确保I2C或SPI的正确配置。
文件位置应与数据读取位置一致。
数据范围应控制在0-65535范围内。
微秒设置应根据单片机的时钟频率进行调整。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:467
  • 最近打卡:2025-06-15 16:24:12
已绑定手机

79

主题

5130

回帖

9132

积分

超级版主

DebugLab

积分
9132
发表于 2025-6-1 00:51:49 | 显示全部楼层
AI8H2K12U EEPROM 程序:
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=18049
15系列类似
有两个读函数,如使用MOVC读,需要正确定义IAP_OFFSET,IAP_OFFSET需要与下载时的硬件选项匹配
DebugLab
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-16 03:28 , Processed in 0.135825 second(s), 65 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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