You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino Uno R3四位7段LED显示异常:无法显示10-15数值

问题分析与解决方案

错误根源

你的代码核心问题出在**binaryToDecimal函数的逻辑错误**:
binaryValue变量通过位运算binaryValue ^= (1 << i)直接存储的是4位二进制对应的十进制数值(比如二进制1010对应十进制10,binaryValue就是10),但你写的转换函数错误地将binaryValue当作十进制数字串处理(比如把10拆成1和0,计算为1*2 + 0*1=2),导致数值显示异常。

解决方案

  1. 移除冗余的binaryToDecimal函数,直接将binaryValue赋值给decimalValue(它本身就是正确的十进制数)。
  2. 保留原有的displayDecimal函数(已支持两位数显示),补充0值的特殊处理确保显示正常。

修改后的完整代码

const int buttonPins[] = {0, 1, 2, 3};
const int sevSegPins[] = {7, 8, 9, 10, 11, 12, 13};
const int dPins[] = {5, 4};
const int D1 = 4;
const int D2 = 5;

const byte digitValues[10][7] = {
  {1, 1, 1, 1, 1, 1, 0}, // 0
  {0, 1, 1, 0, 0, 0, 0}, // 1
  {1, 1, 0, 1, 1, 0, 1}, // 2
  {1, 1, 1, 1, 0, 0, 1}, // 3
  {0, 1, 1, 0, 0, 1, 1}, // 4
  {1, 0, 1, 1, 0, 1, 1}, // 5
  {1, 0, 1, 1, 1, 1, 1}, // 6
  {1, 1, 1, 0, 0, 0, 0}, // 7
  {1, 1, 1, 1, 1, 1, 1}, // 8
  {1, 1, 1, 1, 0, 1, 1}  // 9
};

int buttonClicks[] = {0, 0, 0, 0};
int binaryValue = 0;
int decimalValue = 0;

void setup() {
  // 初始化按键引脚
  for (int i = 0; i < 4; i++) {
    pinMode(buttonPins[i], INPUT);
    digitalWrite(buttonPins[i], HIGH); // 启用内部上拉电阻
  }

  // 初始化7段数码管引脚
  for (int i = 0; i < 7; i++) {
    pinMode(sevSegPins[i], OUTPUT);
  }

  for (int i = 0; i < 2; i++) {
    pinMode(dPins[i], OUTPUT);
  }

  // 初始化串口通信
  Serial.begin(9600);
}

void loop() {
  // 读取按键状态
  for (int i = 0; i < 4; i++) {
    if (digitalRead(buttonPins[i]) == LOW) {
      // 按键首次按下时翻转对应位
      if (buttonClicks[i] == 0) {
        binaryValue ^= (1 << i);
        buttonClicks[i] = 1;
        // 串口调试信息,方便验证数值
        Serial.print("二进制值: ");
        Serial.print(binaryValue, BIN);
        Serial.print(" | 十进制值: ");
        Serial.println(binaryValue);
      }
    } else {
      buttonClicks[i] = 0;
    }
  }

  // 直接使用binaryValue作为十进制值
  decimalValue = binaryValue;

  // 在数码管显示数值
  displayDecimal(decimalValue);
}

void displayDecimal(int value) {
  // 处理0值,确保显示"00"
  if (value == 0) {
    // 显示十位0
    for (int i = 0; i < 7; i++) {
      digitalWrite(sevSegPins[i], digitValues[0][i]);
    }
    digitalWrite(dPins[1], HIGH);
    delay(5);
    digitalWrite(dPins[1], LOW);
    
    // 显示个位0
    for (int i = 0; i < 7; i++) {
      digitalWrite(sevSegPins[i], digitValues[0][i]);
    }
    digitalWrite(dPins[0], HIGH);
    delay(5);
    digitalWrite(dPins[0], LOW);
    return;
  }

  // 拆分十位和个位显示
  for (int digit = 0; digit < 2; digit++) {
    int digitValue = value % 10;
    value /= 10;

    for (int i = 0; i < 7; i++) {
      digitalWrite(sevSegPins[i], digitValues[digitValue][i]);
    }

    digitalWrite(dPins[digit], HIGH);
    delay(5);
    digitalWrite(dPins[digit], LOW);
  }
}

修改说明

  1. 移除错误转换函数:binaryValue本身就是4位二进制对应的十进制数,无需额外转换。
  2. 优化0值显示:避免0值显示异常,确保数码管显示"00"。
  3. 添加串口调试:方便你查看当前的二进制和十进制数值,验证按键操作是否正确。

测试验证

  • 当4位二进制为1010(十进制10),数码管会显示"10";
  • 当4位二进制为1111(十进制15),数码管会显示"15";
  • 所有0-15的数值均可正常显示。

内容的提问来源于stack exchange,提问作者YourDailyRegularWeeb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 21:19:53