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
lcd_puts() und lcd_clrscr() sind von der LCD libCode: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(); } } }
Danke







Zitieren

Lesezeichen