#include <stdint.h>
/* -------- Register definitions -------- */
#define DDRA (*(volatile uint8_t*)0x21)
#define PORTA (*(volatile uint8_t*)0x22)
#define DDRB (*(volatile uint8_t*)0x24)
#define PORTB (*(volatile uint8_t*)0x25)
/* -------- 7-segment patterns -------- */
/* (same table you already used successfully) */
uint8_t seg[10] = {
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F // 9
};
/* Small delay for multiplexing */
void delay_ms(void)
{
for (volatile uint16_t i = 0; i < 300; i++);
}
int main(void)
{
DDRA = 0xFF; // segments OUTPUT
DDRB = (1<<0)|(1<<1)|(1<<2)|(1<<3); // digit enables OUTPUT
while (1)
{
/* Digit 1 → '1' */
PORTB = 0x00; // all digits OFF
PORTA = seg[1];
PORTB = (1<<0); // enable digit 1
delay_ms();
/* Digit 2 → '2' */
PORTB = 0x00;
PORTA = seg[2];
PORTB = (1<<1); // enable digit 2
delay_ms();
/* Digit 3 → '3' */
PORTB = 0x00;
PORTA = seg[3];
PORTB = (1<<2); // enable digit 3
delay_ms();
/* Digit 4 → '4' */
PORTB = 0x00;
PORTA = seg[4];
PORTB = (1<<3); // enable digit 4
delay_ms();
}
}