#include <Arduino.h>
// Define control pins for the shift registers for the 7-seg displays
const int SR1_DS = 2;
const int SR1_SHCP = 3;
const int SR1_STCP = 4;
const int SR2_DS = 5;
const int SR2_SHCP = 6;
const int SR2_STCP = 7;
// Define LED pins for the blinking LEDs.
const int LED1_PIN = 32;
const int LED2_PIN = 33;
// Define LED bar graph pins for anodes (we will drive A1-A10)
// (The corresponding cathodes are connected to ground.)
const int barPins[10] = {22, 23, 24, 25, 26, 27, 28, 29, 30, 31};
// Common-anode 7-seg display digit patterns
// Bit order: 0 -> A, 1 -> B, 2 -> C, 3 -> D, 4 -> E, 5 -> F, 6 -> G, 7 -> DP
// For common anode, a segment is lit when the output is LOW.
byte digitPatterns[10] = {
0xC0, // 0 -> 11000000, segments A B C D E F on, G off
0xF9, // 1 -> 11111001, segments B C on
0xA4, // 2 -> 10100100, segments A B D E G on
0xB0, // 3 -> 10110000, segments A B C D G on
0x99, // 4 -> 10011001, segments B C F G on
0x92, // 5 -> 10010010, segments A C D F G on
0x82, // 6 -> 10000010, segments A C D E F G on
0xF8, // 7 -> 11111000, segments A B C on
0x80, // 8 -> 10000000, all segments on except DP
0x90 // 9 -> 10010000, segments A B C D F G on
};
// Global variables
int counter = 0;
bool ledToggle = false; // used for alternating LED states
// Function to update a 7-seg display via a shift register.
// This function uses the built-in shiftOut() function.
void update7Segment(int dsPin, int shcpPin, int stcpPin, byte pattern) {
digitalWrite(stcpPin, LOW); // Begin shifting
shiftOut(dsPin, shcpPin, MSBFIRST, pattern);
digitalWrite(stcpPin, HIGH); // Latch the data to output
}
void setup() {
// Setup shift register control pins
pinMode(SR1_DS, OUTPUT);
pinMode(SR1_SHCP, OUTPUT);
pinMode(SR1_STCP, OUTPUT);
pinMode(SR2_DS, OUTPUT);
pinMode(SR2_SHCP, OUTPUT);
pinMode(SR2_STCP, OUTPUT);
// Setup LED pins
pinMode(LED1_PIN, OUTPUT);
pinMode(LED2_PIN, OUTPUT);
// Setup LED bar graph anode pins
for(int i = 0; i < 10; i++){
pinMode(barPins[i], OUTPUT);
}
// Initialize the 7-seg displays with "00"
update7Segment(SR1_DS, SR1_SHCP, SR1_STCP, digitPatterns[0]);
update7Segment(SR2_DS, SR2_SHCP, SR2_STCP, digitPatterns[0]);
// Initialize the bar graph: light only the first segment (tens 0 + 1)
for (int i = 0; i < 10; i++) {
if(i < 1)
digitalWrite(barPins[i], HIGH);
else
digitalWrite(barPins[i], LOW);
}
// Initially, both LEDs are off
digitalWrite(LED1_PIN, LOW);
digitalWrite(LED2_PIN, LOW);
}
void loop() {
// Calculate digits for 7-segment displays
int tens = counter / 10;
int ones = counter % 10;
// Update 7-segment displays via shift registers
update7Segment(SR1_DS, SR1_SHCP, SR1_STCP, digitPatterns[tens]);
update7Segment(SR2_DS, SR2_SHCP, SR2_STCP, digitPatterns[ones]);
// Update LED bar graph: light (tens digit + 1) segments.
int segmentsToLight = tens + 1; // for example, 25 -> 2+1 = 3 segments lit.
for (int i = 0; i < 10; i++) {
if (i < segmentsToLight)
digitalWrite(barPins[i], HIGH);
else
digitalWrite(barPins[i], LOW);
}
// Alternate LED blinking: every 2 seconds toggle state.
if (ledToggle) {
digitalWrite(LED1_PIN, HIGH);
digitalWrite(LED2_PIN, LOW);
} else {
digitalWrite(LED1_PIN, LOW);
digitalWrite(LED2_PIN, HIGH);
}
ledToggle = !ledToggle;
// Increment counter, wrap after 99.
counter++;
if(counter > 99) {
counter = 0;
}
delay(2000); // Wait 2 seconds before next update
}