Ok, hier mein (im Simulator getesteter) Alternativvorschlag:
Bei dir divergieren Text und Code bezüglich Spalten und Zeilen. Ich lege es für meinen Code wie folgt fest:
Die oberen 4 Pins (PD4-PD7) sind die Ausgänge (Zeilen), die unteren 4 (PD0-PD3) die Eingänge (Spalten).
(ich glaube, bei dir ist es gerade anders herum)
Der Code funktioniert ungeändert für 4x4 und 4x3, bei 4x3 bleibt einfach nur einer der Eingänge offen.
Das keys-Array enthält im Augenblick nur Platzhalter und muss natürlich angepasst werden. Einfach Taste drücken, schauen welcher Buchstabe kommt, und den Buchstaben im Array durch das für die Taste gewünschte Symbol ersetzen.
Code:
void tastaturabfrageLow() {
static const uint8_t keys[16] = {'a','b','c','d',
'e','f','g','h',
'i','j','k','l',
'm','n','o','p'};
static uint8_t last_key = 0;
uint8_t cur_key;
uint8_t line, row;
DDRD = 0x10;
PORTD = 0x0f;
for (line=0;line<4;line++) {
cur_key = ~PIND & 0x0f;
row = 0;
while (cur_key) {
row++;
cur_key >>= 1;
}
if (row) {
cur_key = keys[line*4+row-1];
if (cur_key != last_key) {
lcd_putc(cur_key);
last_key = cur_key;
return;
}
}
DDRD <<= 1;
}
last_key = 0;
}
Und in main dann:
Code:
while(1) {
tastaturabfrageLow();
_delay_ms(50);
}
Lesezeichen