Forum: Mikrocontroller und Digitale Elektronik LCD zeigt Hieroglyphen


von Patrick (Gast)


Angehängte Dateien:

Lesenswert?

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

von Otto (Gast)


Lesenswert?

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

von Otto (Gast)


Lesenswert?

> entspricht aber 0x30 (hex 20),

sollte "hex 30" heissen

von Patrick (Gast)


Lesenswert?

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.

von Otto (Gast)


Lesenswert?

Zeig mal Dein "lcd_number_no_0"

von Patrick (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.