#include <avr/io.h>
#include <util/delay.h>
// Segment data for digits 0-9 (common cathode)
const uint8_t segment_map[10] = {
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111 // 9
};
// Function to initialize ports
void init_ports() {
DDRF = 0xFF; // Set PORTF as output (A-G, DP)
DDRK = 0x0F; // Set lower nibble of PORTK as output (Digit 1 to Digit 4)
PORTF = 0x00; // Turn off all segments initially
PORTK = 0x0F; // Turn off all digits initially (active low)
}
// Function to display a single digit on the 7-segment display
void display_digit(uint8_t digit, uint8_t position) {
PORTF = segment_map[digit]; // Set segment data for the corresponding digit
PORTK = ~(1 << position); // Enable the selected digit (active low)
_delay_ms(2); // Short delay for multiplexing
PORTK = 0x0F; // Turn off all digits to prevent ghosting
}
// Function to display a 4-digit number
void display_number(uint16_t number) {
uint8_t thousands = (number / 1000) % 10;
uint8_t hundreds = (number / 100) % 10;
uint8_t tens = (number / 10) % 10;
uint8_t units = number % 10;
// Show each digit one by one for multiplexing
display_digit(thousands, 0); // Display thousands place
display_digit(hundreds, 1); // Display hundreds place
display_digit(tens, 2); // Display tens place
display_digit(units, 3); // Display units place
}
int main(void) {
init_ports(); // Initialize the ports
uint16_t counter = 0; // Start counting from 0000
while (1) {
for (counter = 0; counter <= 9999; counter++) {
for (uint16_t i = 0; i < 50; i++) { // Loop to create a fast refresh rate
display_number(counter); // Display the current number
_delay_ms(1); // Short delay to maintain a fast count
}
}
}
return 0;
}