Hallo, ich habe ein Problem mit einem LCD, hier die Daten: 2x16, KS0070B, Displaytech 162C (Standardteil von Reichelt) Mein Programm ist im Anhang. Es soll ein Punktezähler für zwei Personen für "Siedler von Catan" realisiert werden, mit vier Tastern, für jeden Spieler einmal hoch und einmal runter. Ich verwende die "lcd-routines.asm" aus dem Tutorial, wobei der Befehl "lcd_number_no_0" der Abänderung entspricht, die führende Nullen unterdrückt. So weit so gut, das Programm zeigt an Anfang das, was es soll, doch sobald man eine Taste drückt, bricht das Chaos aus. Die Namen verschwinden oder es werden alle möglichen Symbole gezeigt, die Zähler zählen teilweise, wenn der Taster wieder losgelassen wird, teilweise wird z.B. auch statt "5" "05" angezeigt, obwohl die Routine das ja verhindern soll. Insgesamt scheint die Reaktion sehr träge zu sein. Dann habe ich versucht die ersten zwei Zeilen aus dem loop herauszunehmen (davor ausführen), dann sind zwar die Hieroglyphen weg, aber der Zähler zählt dann von alleine, wenn kein Taster gedrückt ist (etwa 2 mal pro Sekunde). So, nun natürlich die Frage, was ich falsch mache, ist da was in der Software oder muss ich die Hardware checken? Gruß und schönen Sonntagabend, Patrick
naja - "Stand" ist eine Zahl ab "0" die Null als ASCII-Zeichen entspricht aber 0x30 (hex 20), also musst Du mindestens 0x30 addieren. Dann geht es von 0-9 Otto
Der Stand an sich wird korrekt dargestellt, nur ändert er sich, ohne dass ein Taster gedrückt wird. Die "Sonderzeichen" treten hauptsächlich in der ersten Zeile auf, gelegentlich aber auch zwischen oder statt der Zahlen.
Sieht so aus:
1 | lcd_number_no_0: |
2 | push temp2 ; die Funktion verändert temp2, also sichern |
3 | ; wir den Inhalt, um ihn am Ende wieder |
4 | ; herstellen zu können |
5 | |
6 | mov temp2, temp1 ; das Register temp1 frei machen |
7 | ; abzählen wieviele Hunderter |
8 | ; in der Zahl enthalten sind |
9 | ldi temp1, '0' |
10 | lcd_number_1_no: |
11 | subi temp2, 100 ; 100 abziehen |
12 | brcs lcd_number_2_no ; ist dadurch ein Unterlauf entstanden? |
13 | inc temp1 ; Nein: 1 Hunderter mehr ... |
14 | rjmp lcd_number_1_no ; ... und ab zur nächsten Runde |
15 | ; |
16 | ; die Hunderterstelle ausgeben |
17 | lcd_number_2_no: |
18 | cpi temp1, '0' |
19 | breq lcd_number_2a_no |
20 | rcall lcd_data |
21 | set ; T-Flag im SREG setzen da 100er Stelle eine 1..9 war |
22 | lcd_number_2a_no: |
23 | subi temp2, -100 ; 100 wieder dazuzählen, da die |
24 | |
25 | |
26 | ; abzählen wieviele Zehner in |
27 | ; der Zahl enthalten sind |
28 | ldi temp1, '0' |
29 | lcd_number_3_no: |
30 | subi temp2, 10 ; 10 abziehen |
31 | brcs lcd_number_4_no ; ist dadurch ein Unterlauf enstanden? |
32 | inc temp1 ; Nein: 1 Zehner mehr ... |
33 | rjmp lcd_number_3_no ; ... und ab zur nächsten Runde |
34 | |
35 | ; die Zehnerstelle ausgeben |
36 | lcd_number_4_no: |
37 | brts lcd_number_4a_no ; Test auf '0' überspringen, da 100er eine |
38 | ; 1..9 war |
39 | cpi temp1, '0' ; ansonsten Test auf '0' |
40 | breq lcd_number_4b_no |
41 | lcd_number_4a_no: |
42 | rcall lcd_data |
43 | lcd_number_4b_no: |
44 | |
45 | subi temp2, -10 ; 10 wieder dazuzählen, da die |
46 | ; vorhergehende Schleife 10 zuviel |
47 | ; abgezogen hat |
48 | |
49 | ; die übrig gebliebenen Einer |
50 | ; noch ausgeben |
51 | ldi temp1, '0' ; die Zahl in temp2 ist jetzt im Bereich |
52 | add temp1, temp2 ; 0 bis 9. Einfach nur den ASCII Code für |
53 | rcall lcd_data ; '0' dazu addieren und wir erhalten dierekt |
54 | ; den ASCII Code für die Ziffer |
55 | |
56 | pop temp2 ; den gesicherten Inhalt von temp2 wieder herstellen |
57 | ret ; und zurück |
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.