找回密码
 立即注册
查看: 114|回复: 5

多个错误代码循环显示编程请教

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:346
  • 最近打卡:2025-05-01 19:40:16

10

主题

165

回帖

1233

积分

金牌会员

积分
1233
发表于 2025-3-25 08:09:41 | 显示全部楼层 |阅读模式
有5个错误报警代码,从E1-E5,分别代表不同的告警信息,单个报警信息显示这个我会做,但如果同时有多个报警信息显示,比如E1,E2,E4这三个报警,显示时是先显示E1一秒,灭2秒再显示E2一秒,再灭2秒,再显示E4,依次循环。当解决一个错误时下次循环显示便不再显示,直到所有错误解除后显示正常,通过数码管显示,这个程序要怎么编比较合理,就是在使用中我不确定会发生哪些错误,但显示是从低到高依次显示。哪位大神帮给个思路,谢谢!
回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-3-25 08:12:00 | 显示全部楼层
针对您提出的多错误代码循环显示需求,以下是一个合理的编程思路,基于优先级队列和状态机的方式实现。该方案能够动态处理多个报警信息的显示,并确保在错误解除后自动更新显示内容。

1. 数据结构设计
首先,定义一个数据结构来存储当前的报警状态。可以使用一个数组或列表来存储所有可能的错误代码(E1-E5),并记录每个错误的状态(是否激活)。例如:
  1. c
  2. define MAXERRORS 5
  3. int errorstates[MAXERRORS] = {0}; // 0表示未激活,1表示激活
复制代码

2. 优先级队列
为了实现从低到高依次显示的错误代码,可以使用一个优先级队列(或简单的数组排序)来管理当前激活的错误代码。每次循环时,从队列中取出下一个错误代码进行显示。
  1. c
  2. int activeerrors[MAXERRORS];
  3. int activecount = 0;
  4. // 更新激活的错误列表
  5. void updateactiveerrors() {
  6.     activecount = 0;
  7.     for (int i = 0; i < MAXERRORS; i++) {
  8.         if (errorstates[i]) {
  9.             activeerrors[activecount++] = i;
  10.         }
  11.     }
  12. }
复制代码

3. 状态机设计
使用状态机来控制显示逻辑。状态机可以有以下几种状态:
IDLE:无错误,显示正常。
DISPLAYERROR:显示当前错误代码。
WAIT:等待一段时间后切换到下一个错误代码。
  1. c
  2. enum State { IDLE, DISPLAYERROR, WAIT };
  3. enum State currentstate = IDLE;
  4. int currenterrorindex = 0;
  5. unsigned long lastupdatetime = 0;
  6. void statemachine() {
  7.     switch (currentstate) {
  8.         case IDLE:
  9.             if (activecount > 0) {
  10.                 currentstate = DISPLAYERROR;
  11.             }
  12.             break;
  13.         case DISPLAYERROR:
  14.             displayerror(activeerrors[currenterrorindex]);
  15.             lastupdatetime = millis();
  16.             currentstate = WAIT;
  17.             break;
  18.         case WAIT:
  19.             if (millis() - lastupdatetime >= 2000) { // 等待2秒
  20.                 currenterrorindex = (currenterrorindex + 1) % activecount;
  21.                 currentstate = DISPLAYERROR;
  22.             }
  23.             break;
  24.     }
  25. }
复制代码

4. 显示函数
编写一个显示函数,用于在数码管上显示当前错误代码。
  1. c
  2. void displayerror(int errorindex) {
  3.     // 根据errorindex显示对应的错误代码(E1-E5)
  4.     // 例如:digitalWrite(segments, errorcode[errorindex]);
  5.     // 显示1秒
  6.     delay(1000);
  7.     // 关闭显示
  8.     // digitalWrite(segments, 0);
  9. }
复制代码

5. 错误处理
当检测到错误时,更新errorstates数组,并调用updateactiveerrors函数更新激活的错误列表。当错误解除时,同样更新errorstates并重新计算激活的错误列表。
  1. c
  2. void seterrorstate(int errorindex, int state) {
  3.     errorstates[errorindex] = state;
  4.     updateactiveerrors();
  5.     if (activecount == 0) {
  6.         currentstate = IDLE;
  7.     }
  8. }
复制代码

6. 主循环
在主循环中调用状态机函数,确保显示逻辑持续运行。
  1. c
  2. void loop() {
  3.     statemachine();
  4.     // 其他逻辑
  5. }
复制代码

总结
该方案通过优先级队列和状态机的结合,能够动态处理多个错误代码的显示,并确保在错误解除后自动更新显示内容。通过合理的状态切换和错误处理,程序能够高效地管理多个报警信息的显示顺序和持续时间。希望这个思路能帮助您解决实际编程中的问题。

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

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-3-25 08:12:00 | 显示全部楼层
要实现多个错误代码的循环显示,并且能够动态更新显示内容(即当某个错误解除后不再显示),可以采用以下编程思路。假设你使用的是单片机或嵌入式系统,并且通过数码管进行显示。以下是一个基于C语言的伪代码实现思路:

1. 数据结构设计
首先,需要设计一个数据结构来存储当前的错误状态。可以使用一个数组来记录哪些错误代码需要显示,并且按照从低到高的顺序进行显示。
  1. c
  2. define MAXERRORS 5
  3. bool errorstatus[MAXERRORS] = {false}; // 初始化错误状态数组,false表示无错误
复制代码

2. 错误状态更新
当检测到错误时,更新错误状态数组。例如,当检测到E1错误时,将errorstatus[0]设置为true;当E1错误解除时,将其设置为false。

```c
void updateerrorstatus(int errorcode, bool status) {
    if (errorcode >= 1 && errorcode

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2940

积分

荣誉版主

无情的代码机器

积分
2940
发表于 2025-3-25 08:37:33 | 显示全部楼层
和楼上的大致思路一致


  • define MAXERRORS 5
  • int errorstates[MAXERRORS] = {0}; // 0表示未激活,1表示激活
  • void displayError(){    u8 i = 0;    for(;i<MAXERRORS;i++){        if(errorstates){            //显示            ...            //延时            ...        }    }}






三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:519
  • 最近打卡:2025-05-02 07:55:51
已绑定手机

46

主题

1694

回帖

2544

积分

金牌会员

积分
2544
发表于 2025-3-25 08:55:28 | 显示全部楼层
建议显示最高优先级的报警,消除了再显示次一级的报警
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:346
  • 最近打卡:2025-05-01 19:40:16

10

主题

165

回帖

1233

积分

金牌会员

积分
1233
发表于 2025-3-25 09:17:23 | 显示全部楼层
有没有类似的例程呀,
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 09:01 , Processed in 0.211000 second(s), 78 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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