#include <avr/io.h>		// Definitionen laden
#include <util/delay.h>	// Delay-Bibliothek laden
#include <avr/interrupt.h>

const unsigned char daten[2][5]={{0x08,0x04,0x7e,0x04,0x08},
                                 {0x10,0x20,0x7e,0x20,0x10}};

//volatile unsigned char spalte=1,dzeiger=0,zeichen=0,durchlauf=0;
volatile unsigned char zeichen=0;

ISR(TIMER0_OVF_vect){
  static unsigned char spalte=1,dzeiger=0,durchlauf=0;
    PORTA = daten[zeichen][dzeiger++]; // Zeile laden
	PORTC = (PORTC & 0b11100000) | spalte; // Spalte anschalten
    spalte *= 2;	// naechste Spalte
	if (spalte > 0b00010000){
	  spalte = 1;
	  dzeiger = 0;
	  durchlauf++;
	  if (durchlauf > 50){
        durchlauf = 0;
		zeichen = 1 - zeichen;
	  }
	}
}

int main(){
  unsigned char led =0;
  TCCR0 = 3;	// Systemtakt / 64
  TIMSK |= (1<<TOIE0); // Timerinterrupt frei geben
  DDRA=0xff;	// PA als Ausgang
  DDRC=0xff;	// PC als Ausgang
  sei();		// globale Interruptfreigabe
  while(1){		// Endlosschleife
  	led++;
	led &= 7;
  	PORTC = (PORTC & 0b00011111) | (led<<5);
	_delay_ms(150);	// warte 6ms
  }
  return 0;
}
