#include <avr/io.h>
#include <util/delay.h>
// Switches
#define SW1 1
#define SW2 2
#define SW3 3
// Seven segment display
#define SS_A 0
#define SS_B 1
#define SS_C 2
#define SS_D 3
#define SS_E 4
#define SS_F 5
#define SS_G 6
// Push Buttons
#define PB_1 5
#define PB_2 4
int num = 0;
int blink_delay = 1000; // Initial blink delay in milliseconds
bool PB1_Pressed = false;
bool PB2_Pressed = false;
// Custom delay function
void custom_delay(int ms) {
while(ms--) {
_delay_ms(1); // Small delay of 1ms
}
}
// Function to display the number on 7-segment
void display_number(int num) {
if (num == 1) {
PORTD |= 1 << SS_A;
PORTD &= ~(1 << SS_B);
PORTD &= ~(1 << SS_C);
PORTD |= 1 << SS_D;
PORTD |= 1 << SS_E;
PORTD |= 1 << SS_F;
PORTD |= 1 << SS_G;
} else if (num == 2) {
PORTD &= ~(1 << SS_A);
PORTD &= ~(1 << SS_B);
PORTD |= 1 << SS_C;
PORTD &= ~(1 << SS_D);
PORTD &= ~(1 << SS_E);
PORTD |= 1 << SS_F;
PORTD &= ~(1 << SS_G);
} else if (num == 3) {
PORTD &= ~(1 << SS_A);
PORTD &= ~(1 << SS_B);
PORTD &= ~(1 << SS_C);
PORTD &= ~(1 << SS_D);
PORTD |= 1 << SS_E;
PORTD |= 1 << SS_F;
PORTD &= ~(1 << SS_G);
} else if (num == 4) {
PORTD |= 1 << SS_A;
PORTD &= ~(1 << SS_B);
PORTD &= ~(1 << SS_C);
PORTD |= 1 << SS_D;
PORTD |= 1 << SS_E;
PORTD &= ~(1 << SS_F);
PORTD &= ~(1 << SS_G);
} else if (num == 5) {
PORTD &= ~(1 << SS_A);
PORTD |= 1 << SS_B;
PORTD &= ~(1 << SS_C);
PORTD &= ~(1 << SS_D);
PORTD |= 1 << SS_E;
PORTD &= ~(1 << SS_F);
PORTD &= ~(1 << SS_G);
} else if (num == 6) {
PORTD &= ~(1 << SS_A);
PORTD |= 1 << SS_B;
PORTD &= ~(1 << SS_C);
PORTD &= ~(1 << SS_D);
PORTD &= ~(1 << SS_E);
PORTD &= ~(1 << SS_F);
PORTD &= ~(1 << SS_G);
} else if (num == 7) {
PORTD &= ~(1 << SS_A);
PORTD &= ~(1 << SS_B);
PORTD &= ~(1 << SS_C);
PORTD |= 1 << SS_D;
PORTD |= 1 << SS_E;
PORTD |= 1 << SS_F;
PORTD |= 1 << SS_G;
}
// If num is 0, ensure display is OFF (no segments lit)
if (num == 0) {
PORTD |= (1 << SS_A);
PORTD |= (1 << SS_B);
PORTD |= (1 << SS_C);
PORTD |= (1 << SS_D);
PORTD |= (1 << SS_E);
PORTD |= (1 << SS_F);
PORTD |= 1 << SS_G;
}
}
int main(void) {
// Switch Pullup inputs
DDRB &= ~(1 << SW1);
DDRB &= ~(1 << SW2);
DDRB &= ~(1 << SW3);
PORTB |= (1 << SW1);
PORTB |= (1 << SW2);
PORTB |= (1 << SW3);
// Outputs to seven segment
DDRD |= 1 << SS_A;
DDRD |= 1 << SS_B;
DDRD |= 1 << SS_C;
DDRD |= 1 << SS_D;
DDRD |= 1 << SS_E;
DDRD |= 1 << SS_F;
DDRD |= 1 << SS_G;
// Push Buttons Pullup inputs
DDRB &= ~(1 << PB_1);
DDRB &= ~(1 << PB_2);
PORTB |= (1 << PB_1);
PORTB |= (1 << PB_2);
while (1) {
// Read the switches
if (PINB & (1 << SW1)) {
num += 1;
}
if (PINB & (1 << SW2)) {
num += 2;
}
if (PINB & (1 << SW3)) {
num += 4;
}
// Display the number
display_number(num);
custom_delay(blink_delay); // Wait for the blink delay
// Turn off the display (show blank, not '8')
display_number(0);
custom_delay(blink_delay); // Wait again before turning on
// Handle PB_1 (increase blink delay) and PB_2 (decrease blink delay)
if (!(PINB & (1 << PB_1)) && !PB1_Pressed) {
PB1_Pressed = true;
if (blink_delay < 10000) blink_delay += 200; // Increase delay up to 10 seconds
} else if (PINB & (1 << PB_1)) {
PB1_Pressed = false;
}
if (!(PINB & (1 << PB_2)) && !PB2_Pressed) {
PB2_Pressed = true;
if (blink_delay > 200) blink_delay -= 200; // Decrease delay down to 200 ms
} else if (PINB & (1 << PB_2)) {
PB2_Pressed = false;
}
num = 0; // Reset num for the next loop iteration
}
}