#include <Arduino.h>
byte codes[14] = {
0b1111110, 0b0110000, 0b1101101, 0b1111001, 0b0110011, 0b1011011,
0b1011111, 0b1110000, 0b1111111, 0b1111011, 0b1001111, 0b0000101,
0b0000000, 0b0000001
};
unsigned long lastTime = 0;
byte currentDigit = 0;
byte displayData[4] = {0, 0, 0, 0};
void setup() {
Serial.begin(9600);
DDRD |= 0b11111100;
DDRB |= 0b00011111;
}
void processInput(String input) {
input.trim();
int number = input.toInt();
if (input.length() == 0 || (number == 0 && input != "0") || number < -999 || number > 9999) {
displayData[0] = 10;
displayData[1] = 11;
displayData[2] = 11;
displayData[3] = 12;
return;
}
int absoluteValue = abs(number);
if (number >= 0) {
if (number < 10) {
displayData[0] = 12;
displayData[1] = 12;
displayData[2] = 12;
displayData[3] = absoluteValue;
} else if (number < 100) {
displayData[0] = 12;
displayData[1] = 12;
displayData[2] = absoluteValue / 10;
displayData[3] = absoluteValue % 10;
} else if (number < 1000) {
displayData[0] = 12;
displayData[1] = absoluteValue / 100;
displayData[2] = (absoluteValue / 10) % 10;
displayData[3] = absoluteValue % 10;
} else {
displayData[0] = absoluteValue / 1000;
displayData[1] = (absoluteValue / 100) % 10;
displayData[2] = (absoluteValue / 10) % 10;
displayData[3] = absoluteValue % 10;
}
} else {
if (absoluteValue < 10) {
displayData[0] = 12;
displayData[1] = 12;
displayData[2] = 13;
displayData[3] = absoluteValue;
} else if (absoluteValue < 100) {
displayData[0] = 12;
displayData[1] = 13;
displayData[2] = absoluteValue / 10;
displayData[3] = absoluteValue % 10;
} else {
displayData[0] = 13;
displayData[1] = absoluteValue / 100;
displayData[2] = (absoluteValue / 10) % 10;
displayData[3] = absoluteValue % 10;
}
}
}
void updateDisplay() {
PORTB |= 0b00011110;
byte segments = codes[displayData[currentDigit]];
byte portDValue = 0;
if (segments & 0b1000000) portDValue |= 0b00000100;
if (segments & 0b0100000) portDValue |= 0b00001000;
if (segments & 0b0010000) portDValue |= 0b00010000;
if (segments & 0b0001000) portDValue |= 0b00100000;
if (segments & 0b0000100) portDValue |= 0b01000000;
if (segments & 0b0000010) portDValue |= 0b10000000;
PORTD = (PORTD & 0b00000011) | portDValue;
PORTB = (PORTB & 0b11111110) | (segments & 0b0000001);
switch (currentDigit) {
case 0: PORTB &= ~0b00000010; break;
case 1: PORTB &= ~0b00000100; break;
case 2: PORTB &= ~0b00001000; break;
case 3: PORTB &= ~0b00010000; break;
}
currentDigit = (currentDigit + 1) & 3;
}
void loop() {
if (Serial.available()) {
String input = Serial.readStringUntil('\n');
processInput(input);
}
if (millis() - lastTime >= 5) {
lastTime = millis();
updateDisplay();
}
}