www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Register an LCD ausgeben


Autor: HDW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ích möchte den Inhalt eines Registers an ein LCD ausgeben.

Direkt ist dies ja nicht möglich. Der Inhalt des Registers muss erst 
umgewandelt werden.


z.B. die Zahl 59 ist ins Register "reg1" geschrieben worden und soll am 
LCD ausgegeben werden.
Es soll nun so lange rumgerechnet werden, bis man 5 Zehner und 9 Einer 
in zwei temporären Registern stehen hat.

Das ist ja schön und gut. Aber wie gehts dann weiter?

Das Problem ist, dass ich im PIC den Wert, den ich am LCD ausgeben will, 
in Anführungstriche setzen muss.

movlw  '5'
movwf  LcdDATEN    ;Datenregister
call   LcdAusgabe    ;Ausgabe-Routine


Wie kann ich denn den errechneten Wert nun am LCD ausgeben???

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hoffe mal, dass die Routine noch erkennbar ist. Die auszgebenden 
Zahl (0..99, in register HexZahl) wird in Zehner und Einer 
aufgesplittet. Es wird so lange vom Register HexZahl 10 subtrahiert bis 
ein Übertrag auftritt. Damit habe ich die Zehner. Der Rest vor dem 
Übertrag entspricht den Einern. Einfach 0x30 dazuaddiert und man hat den 
ASCII-Wert für das Display.

!!! Die Routine funktioniert nur im Wertebereich von 0..99

; HexZahl in Zehner und einer aufsplitten Ergebnis in Zehner und Einer 
+0x30
; --> ASCII Code für Display

HexDec    movlw  0xff            ; Zehner-Stelle = -1
    movwf  Zehner
    movf  HexZahl,w       ; Umzuwandelnde Zahl in w
NextSub    incf  Zehner,f        ; Zehner erhöhen
    movwf  HexZahl         ; w wieder zurück in HexZahl
    movlw  0x0A
                subwf   HexZahl,w       ; 10 abziehen, Erg. in w

                btfsc  c               ; Übertrag ?
    goto  NextSub

    movf  HexZahl,w       ; Divissionsrest
    movwf  Einer
    movlw  0x30
    addwf  Einer,f
    addwf  Zehner,f
                return

MfG

Autor: HDW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja...

Wenn ich dann durch diese Routine eine eine 5 im Zehner-Register stehen 
habe, was mache ich dann damit?

Ich kann ja dann nicht einfach das Zehner-Register ins LcdDATEN-Register 
kopieren.

Mein Problem ist, dass ich nicht weiss, wie die errechneten Zahlen ins 
LcdDATENRegister reinkriege. Mittels der Anführungstriche geht das ja 
dann wohl nicht, oder?

Autor: HDW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Hat sich erledigt.

Ich habe die Routine einfach mal übernommen und die Register Zehner und 
Einer ins Lcd-Datenregister geladen.

Funktioniert einwandfrei.
Die Register Einer, Zehner und HexZahl habe ich vorsichtshalber vorher 
noch auf Null gesetzt.


Danke für die Code!!!

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Am Anfang hatte ich ähnliche Probleme, damals gab es aber noch keine 
Foren wie dieses.
MfG

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Wolfram!
Wolltest du eigentlich die Zahl als Hex oder Dez.darstellen?

Hex ist doch ganz einfach:
Zahl -> ASCII_H und ASCII_L /2 Register oder 1x sichern
ASCII_H & $0f /High-Nibbel ausfiltern
ASCII_H 4 x rechtsschieben (oder swap)
ASCII_H + $30 /aus Wert wird ASCII
ASCII_H an LCD ausgeben

ASCII_L & $f0 /Low-Nibbel ausfiltern
ASCII_L + $30 /ASCII
ASCII_L an LCD ausgeben

fertig

Wenn dez. musst du natürlich umwandeln, dann aber eigentlich
3 Stellen oder nur bis 99

Gruss Uwe

Autor: HDW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Die Zahl sollte als Dezimalzahl dargestellt werden.
Mit der Routine von Steffen funktioniert das Umwandeln ganz gut. Das LCD 
akzeptiert die Daten nun endlich.

Die Idee mit den Hexzahlen werde ich mir mal abspeichern. Vielleicht 
brauche ich das ja mal irgendwann.
Danke dafür.


mfg   Wolfram Hildebrandt

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Hex-Umwandlung von Uwe funktioniert so nicht ganz richtig. 0x9A wird 
nach dieser Funktion als "9:" dargestellt und 0xBE ergibt ";>". Der 
ASCII-Code von A ist 0x41 also muss man bei Werten >9 (ASCII_H,ASCIIL in 
Uwes Routine) nicht 0x30 sondern 0x37 dazuaddieren.

MfG
Steffen

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!
War mir in der Eile doch entfallen Und noch ein Fehler hat sich 
eingeschlichen, Mist!

Sollte also so aussehen:

Zahl -> ASCII_X und ASCII_L /2 Register oder 1x sichern
ASCII_H & $f0 /High-Nibbel ausfiltern
ASCII_H 4 x rechtsschieben (oder swap)

Call Test
ASCII_L ->ASCII_X  /ASCII_X auf Ausgangswert laden

ASCII_X & $0f /Low-Nibbel ausfiltern
Call Test
.
.
.

Test:
ASCII_X + $30 /aus Wert wird ASCII
ASCII_X > $39 /??? Ist es ein Buchstabe???
ja ASCII_H + $07 /aus Sonderzeichen wird Buchstabe
ASCII_X an LCD ausgeben
Ret

MFG Uwe

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.