#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h>

#define F_CPU 			 20000000UL  				/* 20.000.000 Hz	*/

#define	IRQS_PER_SECOND	 1000						/*   1ms 			*/

/* Timer1-Werte berechnen */

volatile int timer_ms;
//					 	      Dgfedcba
volatile int Array[18] = {	0b00111111,				// 0
							0b00000110,				// 1
							0b01011011,				// 2
							0b01001111,				// 3
							0b01100110,				// 4
							0b01101101,				// 5
							0b01111101,				// 6
							0b00000111,				// 7
							0b01111111,				// 8
							0b01101111,				// 9

							0b01110111,				// A
							0b01111100,				// B
							0b01011000,				// C
							0b01011110,				// D
							0b01111001,				// E
							0b01110001,				// F
							0b01000000,				// -
							0b00000000};				// " "

volatile int  Stunden, Minuten, Sekunden;
volatile int  Ausgabe[8] = {0,0,16,0,0,16,0,0};
volatile char counts[100];
volatile char status_alt = 0;
volatile int  impulse = 0;
volatile char fertig = 0;

//------------------------------------------------------------------------------
/* Interruptroutine Steuerung 1x pro ms*/
ISR(TIMER1_COMPA_vect)
{
	static int spalte=0;

	PORTD = Array[Ausgabe[spalte]];
	PORTA = spalte + 8;				

	spalte = (spalte + 1) & 7;

	if (timer_ms != 0)
		timer_ms--;

/*
	if (counts[impulse] <= 255)
	{
 	 if ( (PINC&(1<<PC0)) != status_alt)		// Status Taster an PC0 verändert ?
	 {
	  impulse++;
	  status_alt = ~ status_alt;
	 }
	 if (impulse < 100)
	 { 
	  counts[impulse]++; 
	 }
	 else
	 {
	  fertig = 1;
	 }
	}
	else
	{
	fertig = 1;
	}
*/
}

/* diverse Dinge initialisieren */
void init(void)
{
    DDRA  = 0xff;   		// Alle Pin    => Ausgang (Multiplexen der 8 Segmente)         
    DDRD  = 0xff;		// Alle Pin    => Ausgang (Segmentansteuerung)
    DDRC  = 0b11111100;		// Pin C2 - C7 => Ausgang (Pin C0, PIN C1 => Eingang)

	DDRC  &= ~((1<<PC0)|(1<<PC1));           /* PINS PC0+PC1  auf Eingang (Taster)       */
    	PORTC |= (1 <<PC0)|(1<<PC1);            /* Pullup-Widerstände aktivieren            */
//	status_alt = !(PINC&(1<<PC0));

	/* Timer und Interrupt initialisieren*/
	TCCR1A  =  0;																/* keine PWM 						*/
	TCCR1B 	=  (1 << WGM12) | (1 << CS10);										/* kein Vorteiler 0x01 				*/
	OCR1A	=  (unsigned short) ((unsigned long) F_CPU / IRQS_PER_SECOND -1);	/* Zähler-Obergrenze				*/
	TIMSK1 |=  (1 << OCIE1A);													/* OutputCompareA-Interrupt Timer 1 */
	sei();
}

/* Wartezeit in ms 	*/
void Uhr(int warte)
{
 timer_ms = warte;
 while(timer_ms);

 Ausgabe[7]++;
 if (Ausgabe[7] == 10)
 	{
	Ausgabe[7] = 0;
	Ausgabe[6]++;
	if (Ausgabe[6] == 6)
		{
		Ausgabe[6] = 0;
		Ausgabe[4]++;
		if (Ausgabe[4] == 10)
			{
			Ausgabe[4] = 0;
			Ausgabe[3]++;
			if (Ausgabe[3] == 6)
				{
				Ausgabe[3] = 0;
				Ausgabe[1]++;
				if (Ausgabe[1] == 10)
					{
					Ausgabe[1] = 0;
					Ausgabe[0]++;
					if (Ausgabe[0] == 3)
						{
						Ausgabe[0] = 0;
						}
					}
				}
			}
		}
	}
}

int main (void) 
{
	int wert = 0;
	int led = 0;

	init();
	Stunden = 17;
	Minuten = 49;
	Sekunden = 50;

 	Ausgabe[0] = (unsigned short)	Stunden/10;
 	Ausgabe[1] = Stunden - 10*Ausgabe[0];
 	Ausgabe[3] = (unsigned short)	Minuten/10;
 	Ausgabe[4] = Minuten - 10*Ausgabe[3];
 	Ausgabe[6] = (unsigned short)	Sekunden/10;
 	Ausgabe[7] = Sekunden - 10*Ausgabe[6];

	while(1);

}