// Segment pins: a, b, c, d, e, f, g
int segPins[7] = {3, 4, 5, 6, 7, 8, 9};
volatile int counter = 0; // must be volatile for interrupt
// 7-segment patterns for digits 0–9 (Common Cathode)
byte digits[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
};
void setup() {
// Set segment pins as output
for (int i = 0; i < 7; i++) {
pinMode(segPins[i], OUTPUT);
}
// Button pin with internal pull-up
pinMode(2, INPUT_PULLUP);
// Attach interrupt on pin 2
attachInterrupt(digitalPinToInterrupt(2), countUp, FALLING);
}
void loop() {
displayDigit(counter);
// Simulate delay (interrupt still works!)
delay(1000);
}
// Interrupt Service Routine (ISR)
void countUp() {
counter++;
if (counter > 9) counter = 0;
}
// Function to display digit
void displayDigit(int num) {
for (int i = 0; i < 7; i++) {
digitalWrite(segPins[i], digits[num][i]);
}
}