okay danke

jetzt habe ich dazu mal einen Code aufgesetzt
die Spalten sind PD0 bis PD3 und die Zeilen sind PD4 bis PD6 (momentan nur 4*3 Matrix)

wäre nett, wenn da mal jemand drüberschaut (noch nicht getestet, compiliert aber fehlerfrei)
vllt fällt ja was auf oder es gibt vorschläge zur optimierung

Code:
void tastaturabfrageLow()
{
	DDRD = 0x00; 									/* PD als Eingaenge */
	//DDRA &= ~(1<<PA1) ;  							
	PORTD |= (1<<PD4) | (1<<PD5) | (1<<PD6);      /* Interne Pull-Up einschalten */
	//PORTA |= (1<<PA1);
	
	while(1)
	{
		//Zeile A
		DDRD &= ~( 1 << DDD3 );			//alten Ausgang wieder auf Eingang schalten
		PORTD |= (1<<PD3);					//Widerstand aktivieren
		DDRD = (1 << DDD0);				//neuen Ausgang definieren
		PORTD &= ~(1<<DDD0);				//neuen Ausgang auf low schalten
		
		if ( !(PIND & (1<<PINB4)) ) 		// Spalte 1 prüfen
		{
		lcd_clrscr();
        lcd_puts("7");
		}
		if ( !(PIND & (1<<PINB5)) ) 		// Spalte 2 prüfen
		{
		lcd_clrscr();
        lcd_puts("8");
		}
		if ( !(PIND & (1<<PINB6)) ) 		// Spalte 3 prüfen
		{
		lcd_clrscr();
        lcd_puts("9");
		}	

		//Zeile B
		DDRD &= ~( 1 << DDD0 );			//alten Ausgang wieder auf Eingang schalten
		PORTD |= (1<<PD0);					//Widerstand aktivieren
		DDRD = (1 << DDD1);				//neuen Ausgang definieren
		PORTD &= ~(1<<DDD1);				//neuen Ausgang auf low schalten
		
		if ( !(PIND & (1<<PINB4)) ) 		// Spalte 1 prüfen
		{
		lcd_clrscr();
        lcd_puts("4");
		}
		if ( !(PIND & (1<<PINB5)) ) 		// Spalte 2 prüfen
		{
		lcd_clrscr();
        lcd_puts("5");
		}
		if ( !(PIND & (1<<PINB6)) ) 		// Spalte 3 prüfen
		{
		lcd_clrscr();
        lcd_puts("6");
		}		
		
		//Zeile C
		DDRD &= ~( 1 << DDD1 );			//alten Ausgang wieder auf Eingang schalten
		PORTD |= (1<<PD1);					//Widerstand aktivieren
		DDRD = (1 << DDD2);				//neuen Ausgang definieren
		PORTD &= ~(1<<DDD2);				//neuen Ausgang auf low schalten
		
		if ( !(PIND & (1<<PINB4)) ) 		// Spalte 1 prüfen
		{
		lcd_clrscr();
        lcd_puts("1");
		}
		if ( !(PIND & (1<<PINB5)) ) 		// Spalte 2 prüfen
		{
		lcd_clrscr();
        lcd_puts("2");
		}
		if ( !(PIND & (1<<PINB6)) ) 		// Spalte 3 prüfen
		{
		lcd_clrscr();
        lcd_puts("3");
		}	
		
		//Zeile D
		DDRD &= ~( 1 << DDD2 );			//alten Ausgang wieder auf Eingang schalten
		PORTD |= (1<<PD2);					//Widerstand aktivieren
		DDRD = (1 << DDD3);				//neuen Ausgang definieren
		PORTD &= ~(1<<DDD3);				//neuen Ausgang auf low schalten
		
		if ( !(PIND & (1<<PINB4)) ) 		// Spalte 1 prüfen
		{
        lcd_puts("0");
		}
		if ( !(PIND & (1<<PINB5)) ) 		// Spalte 2 prüfen
		{
        lcd_puts(".");
		}
		if ( !(PIND & (1<<PINB6)) ) 		// Spalte 3 prüfen
		{
		lcd_clrscr();
		}	
	}
}
lcd_puts() und lcd_clrscr() sind von der LCD lib

Danke