Wenn Du mit Pull-Up Widerständen arbeitest, musst Du die Ausgänge auf
LOW setzen und die Eingänge auf LOW prüfen. Dein Code funktioniert nur
mit Pull-Down Widerständen.
Korrekturvorschlag:
1 | uint8_t key_check2() {
|
2 | // Ein/Ausgänge konfigurieren
|
3 | DDRA = (1<<PA0) | (1<<PA1) | (1<<PA2) | (1<<PA3);
|
4 |
|
5 | // erste Reihe ansteuern
|
6 | PORTA = ~PA3;
|
7 |
|
8 | for (uint8_t row=1; row<5; row++) {
|
9 |
|
10 | // Rückgabewert entsprechend der gedrückten Spalte berechnen
|
11 | if (!(PINA & (1<<PA6))) {
|
12 | delay(100);
|
13 | result=1*row;
|
14 | }
|
15 | else if (!(PINA & (1<<PA5))) {
|
16 | delay(100);
|
17 | return 2*row;
|
18 | }
|
19 | else if (!(PINA & (1<<PA4))) {
|
20 | delay(100);
|
21 | return 3*row;
|
22 | }
|
23 |
|
24 | // nächste Reihe ansteuern
|
25 | PORTA = (PORTA>>1) | 128;
|
26 | }
|
27 |
|
28 | // keine Taste gedrückt
|
29 | return 0;
|
30 | }
|
Als Nebeneffekt aktiviert dieser Code die internen Pull-Up Widerstände.
Ich hoffe, das stört Dich nicht. Wenn Du ein bisschen Zeit zwischen dem
Setzen der Ausgänge und dem Lesen der Eingänge einfügst, kannst Du auf
externe Pull-Up's verzichten:
1 | for (uint8_t row=1; row<5; row++) {
|
2 |
|
3 | // Ein bisschen Zeit verplempern
|
4 | (PINA); (PINA);
|
5 |
|
6 | // Rückgabewert entsprechend der gedrückten Spalte berechnen
|
7 | ...
|
8 | }
|
Diese beiden Lesezugriffe auf PINA werden vom Compiler nicht weg
optimiert.