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),导致数值显示异常。
解决方案
- 移除冗余的
binaryToDecimal函数,直接将binaryValue赋值给decimalValue(它本身就是正确的十进制数)。 - 保留原有的
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); } }
修改说明
- 移除错误转换函数:
binaryValue本身就是4位二进制对应的十进制数,无需额外转换。 - 优化0值显示:避免0值显示异常,确保数码管显示"00"。
- 添加串口调试:方便你查看当前的二进制和十进制数值,验证按键操作是否正确。
测试验证
- 当4位二进制为
1010(十进制10),数码管会显示"10"; - 当4位二进制为
1111(十进制15),数码管会显示"15"; - 所有0-15的数值均可正常显示。
内容的提问来源于stack exchange,提问作者YourDailyRegularWeeb
相关产品推荐
相关产品推荐

