#define F_CPU 1000000UL #include #include #include uint8_t font[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; volatile uint8_t framebuffer[4]; // use to buffer contents of display ISR(TIMER0_OVF_vect) // the code for the interrupt service routine { static uint8_t current_digit = 0; PORTD = 0xff; // all segments off current_digit += 1; // step one digit current_digit %= 4; // and keep between 0-3 PORTB = (0b00010000 << current_digit); PORTD = framebuffer[current_digit]; } void display(uint16_t value) // print a 4-digit number { uint16_t A = value; uint8_t i; for (i = 0; i < 4; i++) { framebuffer[3-i] = ~font[A % 10]; A = A / 10; } } void init(void) { DDRB = 0b11110000; // upper B-pins as output DDRD = 0b11111111; // all D-pins as output // setting up TIMER0 TCCR0A = (0 << COM0A1) | (0 << COM0A0) | (0 << COM0B1) | (0 << COM0B0) | (0 << WGM01) | (0 << WGM00); TCCR0B = (0 << WGM02) | (0 << CS02) | (1 << CS01) | (0 << CS00); TIMSK0 = (0 << OCIE0B) | (0 << OCIE0A) | (1 << TOIE0); sei(); // don't forget to enable interrupts } int main(void) { uint16_t value = 9999; init(); while (1) { display(value); value --; _delay_ms(20); } }