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
1
and r19, r1
mit ANDI (UND Register -> Konstante) direkt mit der Konstante:
1
andi r19, 0b00000010
dann funktioniert es. Diese Feststellung habe ich am Mega328P gemacht
und auf einem anderen Controller noch nicht getestet.
Kann mir Jemand ein Tipp geben?
Warum?
Weil es nicht sehr smart ist, irgendwelche register (und insbesondere
r0/r1) mit konstanten Werten zu laden und somit vom späteren
Gebrauch auszuschließen.
Und dann folgendes:
1
in r19, PINB ; Status einlesen
2
and r19, r1 ; gezieltes Bit auf High setzen
3
cpi r19, 0b00000010 ; War sie gedrueckt?
4
brne row1_ende
mit folgendem ersetzen:
1
KeyChk_B:
2
in r19, PINB ; Status einlesen
3
andi r19, AnyKey ; War überhaupt irgendeine Taste gedrückt?
4
breq row1_ende ; Keine Taste gedrückt, überspringe alle weiteren prüfungen für PINB
5
;*** Irgendeine Taste in 3 Reihen für PINB war gedrückt
6
in r19, PINB ; Nochmal Status einlesen
7
andi r19, Spalte1 ; War sie gedrueckt?
8
breq row1_ende
Nicht ausprobiert, keine Garantie.
CopyLeft by ich, All Wrongs Reserved.
Eine eigene Frage?
Dieser Thread ist über 4 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.