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
Lesezeichen