Hallo zsm,
ich habe mir eine Routine fuer eine 4x4 Tasten Matrix geschrieben welche
funktioniert und im Einsatz ist. Nun bin ich am Optimieren meiner Zeilen
und habe keine Erklaerung dafuer warum ich den Befehl AND nicht so
anwenden kann wie er gedacht ist.
Hier ein kleiner Auszug bei dem ich Reihe 1 auf High schalte und Spalte
1 (Taste "1") abfrage ob sie gedrueckt worden ist, nach dieser Taste
springe ich dann zur Abfrage Taste "2", "3", "A", .. naechste Reihe,
etc:
1 | ; Bitmuster laden
|
2 | lds r1, 0b00000010 ; PORTB - PIN 1
|
3 | lds r2, 0b00000100 ; PORTB - PIN 2
|
4 | lds r3, 0b00001000 ; PORTB - PIN 3
|
5 | lds r4, 0b00000001 ; PORTC - PIN 0
|
6 | ; /Bitmuster laden Ende
|
7 |
|
8 | Start_Scan:
|
9 | sbi PORTB, 0 ; Erste Reihe (1, 2, 3, A) auf high setzen
|
10 | nop
|
11 | nop
|
12 | nop
|
13 |
|
14 | in r19, PINB ; Status vom Port einlesen
|
15 | and r19, r1 ; Nur wenn Taste auf High war, dann ist Bit 2 nun auch High
|
16 | cpi r19, 0b00000010
|
17 | brne row1_ende ; BRanche if Not Equal
|
18 | rcall delay5ms ; kurz warten
|
19 |
|
20 | in r19, PINB ; Nochmal Status einlesen
|
21 | and r19, r1 ; gezieltes Bit auf High setzen
|
22 | cpi r19, 0b00000010 ; War sie gedrueckt?
|
23 | brne row1_ende
|
24 |
|
25 | ldi r16, '1' ; Dann machen wir was, wenn nicht dann restliche Tasten abfragen
|
26 | rcall LCD_DATA
|
27 |
|
28 | row1_ende:
|
29 |
|
30 | cbi PORTB, 0
|
31 | rcall D250_ms ; Kleine Verzoegerung um doppeltes Druecken zu vermeiden
|
32 |
|
33 | rjmp Start_Scan
|
Ziel ist es flexibel zu sein und anhand der Verdrahtung das jeweiligen
Bitmuster oben in vier untere Register zu laden. Doch der AND Befehl
funktioniert nicht, es findet keine uebereinstimmung statt brne springt
immer zum Punkt "row1_ende"
Ersetze ich
mit ANDI (UND Register -> Konstante) direkt mit der Konstante:
dann funktioniert es. Diese Feststellung habe ich am Mega328P gemacht
und auf einem anderen Controller noch nicht getestet.
Kann mir Jemand ein Tipp geben?