/* display_value wird am PORTB im Multiplexbetrieb ausgegeben
* Controller: ATmega88 @ 8MHz */
#include <avr/io.h>
#include <util/delay.h>

uint16_t display_value;
uint8_t einer, rest, zehner, hunderter;

#define T1 0xFE		// Transistor 1 = ON (T1 = 11111110)
#define T2 0xFD		// Transistor 2 = ON (T2 = 11111101)
#define T3 0xFC		// Transistor 3 = ON (T3 = 11111011)

void wert_zerlegen (uint16_t display_value)
{
	einer = display_value % 10;		// Einer mit Modulo (%) berechnen
	rest = display_value / 10;		// Rest berechnen
	zehner = rest % 10;				// Zehner mit Modulo (%) berechnen
	hunderter = rest / 10;			// Hunderter berechnen
}

void main (void)
{
	DDRD = 0xFF;	// Richtungsregister Port D auf Ausgang
	DDRC = 0xFF;	// Richtungsregister Port C auf Ausgang
	PORTD = 0xFF;	// Port D = High (7-Segm. Anzeige OFF)
	PORTC = 0xFF;	// Port C = High (Transistoren sperren)
	
	/* Wertetabelle der 7-Segmentcodierung (11 Array Felder) */
	const uint8_t segmenttable[11] =
	{
		0x03, 0xF3, 0x25, 0x0D, 0x99, 0x49, 0x41, 0x1F, 0x01, 0x19, 0xFE
		/* 0 1 2 3 4 5 6 7 8 9 dp */
	};
	
	display_value = 279;	// dieser Wert wird am Display angezeigt
	
	while (1)
	{
		wert_zerlegen(display_value);		// display_value an Funktion übergeben
		PORTC = T1;							// Anzeige 1 aktivieren
		PORTD = segmenttable [einer];		// Ausgabe der EINER auf 1. Anzeige
		_delay_ms(5);
		PORTC = T2;							// Anzeige 2 aktivieren
		PORTD = segmenttable [zehner];		// Ausgabe der ZEHNER auf 2. Anzeige
		_delay_ms(5);
		PORTC = T3;							// Anzeige 3 aktivieren
		PORTD = segmenttable [hunderter];	// Ausgabe der HUNDERTER auf 3. Anzeige
		_delay_ms(5);
	}
}