Hallo zusammen , das ist mein erster Post hier.

Zu meine Problem ich hab hier Zuhaus eine LED-Anzeige liegen für die ich ein Steuerprogramm geschrieben habe.
Wenn ich Zeilen einzeln anspreche funktioniert das auch so wie es soll , nur sobald ich alle Zeilen anspreche "flackert" jede zweite Zeile.
Vieleicht sehr ihr da in meinem Programmcode ihrgend etwas was man anders machen sollte.


main.c
Code:
int main(void)
{
	init_display();
	
	printf("Programm gestartet !\n");
	
	
uint8_t text[7][56] = 
{{0,0,1,1,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}	
,{0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
,{0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}	
,{0,0,0,0,0,1,0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
,{0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
,{0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
,{0,0,0,0,0,1,0,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}	};
	
	
	while(1)
	{
		uint8_t i;
		for(i=0;i<7;i++)
		{
			anzeigen(text[i],i);
		}
	}
		
	return 0;
}
led.c
Code:
/*
7 Zeilen
8 Spalten


14 Segmente:

  0| x x x x x x x x
Z 1| x x x x x x x x
e 2| x x x x x x x x
i 3| x x x x x x x x
l 4| x x x x x x x x
e 5| x x x x x x x x
n 6| x x x x x x x x
  -------------------
   | 0 1 2 3 4 5 6 7 . . .
       Spalten  	


PORTA

PA0 Clock
PA1 Daten

PA2 Enable Zeilen

PA3-PA5 Binär Zeile 1-7 

*/
#include <io.h> 
#include <stdlib.h>
#include <stdio.h>
#include <util/delay.h>


#define CHECKBIT(ADDRESS,BIT) (ADDRESS & (1<<BIT))
#define SETBIT(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define CLEARBIT(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
#define TOGGLEBIT(ADDRESS, BIT) ((ADDRESS) ^= (1 << (BIT)))


#define MAX_ZEICHEN 56

#define CLOCK PA0
#define DATEN PA1
#define ENABLE PA2 
#define ZEILE2_0 PA3
#define ZEILE2_1 PA4
#define ZEILE2_2 PA5


void init_display()
{
	// Pin 0 bis 5 als Ausgangdefinieren
	DDRA = (1<<DDA0) | (1<<DDA1) | (1<<DDA2) | (1<<DDA3) | (1<<DDA4) | (1<<DDA5);
	
	CLEARBIT(PORTA,ENABLE);// Enable auf 0 setzen  -> Zeilen deaktiviert.
	CLEARBIT(PORTA,CLOCK); // Clock auf 0 
	CLEARBIT(PORTA,DATEN); // Daten auf 0 
	
	SETBIT(PORTA,ZEILE2_0); //1
	CLEARBIT(PORTA,ZEILE2_1); //0  Zeile 0 ausgewählt
	CLEARBIT(PORTA,ZEILE2_2); //0  
	
}

void select_zeile(uint8_t zeile)
{
	if(zeile == 0)
	{
	SETBIT(PORTA,ZEILE2_0); //1
	CLEARBIT(PORTA,ZEILE2_1); //0  Zeile 0 ausgewählt
	CLEARBIT(PORTA,ZEILE2_2); //0 
	}
	
	if(zeile == 1)
	{
	CLEARBIT(PORTA,ZEILE2_0); //0
	SETBIT(PORTA,ZEILE2_1); //1  Zeile 1 ausgewählt
	CLEARBIT(PORTA,ZEILE2_2); //0 
	}
	
	if(zeile == 2)
	{
	SETBIT(PORTA,ZEILE2_0); //1
	SETBIT(PORTA,ZEILE2_1); //1  Zeile 2 ausgewählt
	CLEARBIT(PORTA,ZEILE2_2); //0 
	}

	if(zeile == 3)
	{
	CLEARBIT(PORTA,ZEILE2_0); //0
	CLEARBIT(PORTA,ZEILE2_1); //0  Zeile 3 ausgewählt
	SETBIT(PORTA,ZEILE2_2); //1 
	}
	
	if(zeile == 4)
	{
	SETBIT(PORTA,ZEILE2_0); //1
	CLEARBIT(PORTA,ZEILE2_1); //0  Zeile 4 ausgewählt
	SETBIT(PORTA,ZEILE2_2); //1 
	}
	
	if(zeile == 5)
	{
	CLEARBIT(PORTA,ZEILE2_0);//0
	SETBIT(PORTA,ZEILE2_1); //1  Zeile 5 ausgewählt
	SETBIT(PORTA,ZEILE2_2); //1 
	}
	
	if(zeile == 6)
	{
	SETBIT(PORTA,ZEILE2_0); //1
	SETBIT(PORTA,ZEILE2_1); //1  Zeile 5 ausgewählt
	SETBIT(PORTA,ZEILE2_2); //1 
	}

}



void anzeigen(uint8_t data[], uint8_t zeile)
{
	uint8_t k;
	
	//Daten in Register laden
	for (k = MAX_ZEICHEN; k!=0; k--) 
	{	
		
		if (data[k] !=0) 				//Welchen Status hat das nächste Bit
		{
			SETBIT(PORTA,DATEN); 		//PORT high, falls Bit == 1;
		}
		else
		{
			CLEARBIT(PORTA,DATEN); 		//PORT low, sonst
		}	
		
		SETBIT(PORTA,CLOCK);  			//CLOCK AN, Pegel übernehmen
		_delay_us(20);
		CLEARBIT(PORTA,CLOCK);	  		//CLOCK AUS
	}

	
	//Zeile wählen und anzeigen
	
	select_zeile(zeile);			//Zeile wählen
	_delay_ms (20);
	SETBIT(PORTA,ENABLE);			//Gewählte Zeile einschalten	
	_delay_ms (20);
	CLEARBIT(PORTA,ENABLE);			//Gewählte Zeile ausschalten
}
Es funktioniert alles soweit, es geht halt nur um "logischefehler" die ich so nicht sehe.

Wäre nett wenn sich das mal jemand mit mehr ahnung als ich ansehen könnte.