// Pin assignments for segments (A to G + optional DP)
const int segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 9}; // DP is on Pin 9
const int digitPins[] = {10, 11, 12}; // Common pins for each digit (hundreds, tens, units)
// Number patterns for segments (bit patterns for 0-9)
const byte numberPatterns[] = {
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111 // 9
};
const int multiplexDelay = 5; // Delay for multiplexing
void setup() {
Serial.begin(9600); // Initialize Serial communication
initializePins(); // Initialize all pins as outputs
}
void loop() {
int number = getValidThreeDigitNumber(); // Get a valid 3-digit number from user
Serial.print("Showing on 3 Digits Seven-Segment Display: ");
Serial.println(number);
// Continuously display the entered number
while (true) {
displayNumber(number);
}
}
// Function to prompt user until they enter a valid 3-digit number (001-999)
int getValidThreeDigitNumber() {
int number;
Serial.println("Please enter a THREE DIGIT number:"); // Prompt only once initially
while (true) { // Loop until a valid 3-digit number is entered
while (Serial.available() == 0); // Wait for user input
number = Serial.parseInt(); // Read the entered number as an integer
if (number >= 001 && number <= 999) { // Check if it's a valid 3-digit number
return number; // Return the valid number
} else {
// Clear the input buffer before retrying to prevent multiple error messages
while (Serial.available() > 0) {
Serial.read(); // Clear any leftover characters in the buffer
}
Serial.println("??? YOU DID NOT TYPE A 3 DIGIT NUMBER!!!! TRY AGAIN!!! (001-999)");
clearAllDigits(); // Clear the display if input is invalid
}
}
}
// Function to initialize all segment and digit pins as outputs
void initializePins() {
for (int i = 0; i < 8; i++) {
pinMode(segmentPins[i], OUTPUT);
}
for (int i = 0; i < 3; i++) {
pinMode(digitPins[i], OUTPUT);
}
}
// Function to display a 3-digit number on the three-digit 7-segment display
void displayNumber(int number) {
int hundreds = (number / 100) % 10;
int tens = (number / 10) % 10;
int units = number % 10;
showDigit(hundreds, 0);
showDigit(tens, 1);
showDigit(units, 2);
}
// Function to show a single digit at a specific position
void showDigit(int digit, int position) {
clearAllDigits(); // Turn off all digits before activating the current one
setSegments(digit); // Set the segments for the specified digit
digitalWrite(digitPins[position], HIGH); // Activate the specified digit position
delay(multiplexDelay); // Small delay for multiplexing stability
digitalWrite(digitPins[position], LOW); // Turn off the digit after displaying it
}
// Function to set the segments for a specific digit (0-9)
void setSegments(int number) {
byte pattern = numberPatterns[number];
for (int i = 0; i < 7; i++) {
digitalWrite(segmentPins[i], pattern & (1 << i) ? LOW : HIGH); // LOW to turn on for common anode
}
digitalWrite(segmentPins[7], HIGH); // Keep DP off
}
// Function to turn off all digits
void clearAllDigits() {
for (int i = 0; i < 3; i++) {
digitalWrite(digitPins[i], LOW);
}
}