mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD zeigt Hieroglyphen


Autor: Patrick (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> entspricht aber 0x30 (hex 20),

sollte "hex 30" heissen

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeig mal Dein "lcd_number_no_0"

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieht so aus:
lcd_number_no_0:
           push  temp2            ; die Funktion verändert temp2, also sichern
                                  ; wir den Inhalt, um ihn am Ende wieder
                                  ; herstellen zu können
 
           mov   temp2, temp1     ; das Register temp1 frei machen
                                  ; abzählen wieviele Hunderter
                                  ; in der Zahl enthalten sind
           ldi   temp1, '0'
lcd_number_1_no:
           subi  temp2, 100       ; 100 abziehen
           brcs  lcd_number_2_no     ; ist dadurch ein Unterlauf entstanden?
           inc   temp1            ; Nein: 1 Hunderter mehr ...
           rjmp  lcd_number_1_no     ; ... und ab zur nächsten Runde
;
                                  ; die Hunderterstelle ausgeben
lcd_number_2_no:
           cpi   temp1, '0'
           breq  lcd_number_2a_no
           rcall lcd_data
           set                    ; T-Flag im SREG setzen da 100er Stelle eine 1..9 war
lcd_number_2a_no:
           subi  temp2, -100      ; 100 wieder dazuzählen, da die

 
                                  ; abzählen wieviele Zehner in
                  ; der Zahl enthalten sind
           ldi   temp1, '0'
lcd_number_3_no:
           subi  temp2, 10        ; 10 abziehen
           brcs  lcd_number_4_no     ; ist dadurch ein Unterlauf enstanden?
           inc   temp1            ; Nein: 1 Zehner mehr ...
           rjmp  lcd_number_3_no     ; ... und ab zur nächsten Runde
 
                              ; die Zehnerstelle ausgeben
lcd_number_4_no:
           brts  lcd_number_4a_no    ; Test auf '0' überspringen, da 100er eine
                                  ; 1..9 war
           cpi   temp1, '0'       ; ansonsten Test auf '0'
           breq  lcd_number_4b_no
lcd_number_4a_no:
           rcall lcd_data
lcd_number_4b_no:

           subi  temp2, -10       ; 10 wieder dazuzählen, da die
                              ; vorhergehende Schleife 10 zuviel
                  ; abgezogen hat
 
                                  ; die übrig gebliebenen Einer
                  ; noch ausgeben
           ldi   temp1, '0'       ; die Zahl in temp2 ist jetzt im Bereich
           add   temp1, temp2     ; 0 bis 9. Einfach nur den ASCII Code für
           rcall lcd_data         ; '0' dazu addieren und wir erhalten dierekt
                                  ; den ASCII Code für die Ziffer
 
           pop   temp2            ; den gesicherten Inhalt von temp2 wieder herstellen
           ret                    ; und zurück 

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.