Forum: Mikrocontroller und Digitale Elektronik Register an LCD ausgeben


von HDW (Gast)


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???

von Steffen (Gast)


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

von HDW (Gast)


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?

von HDW (Gast)


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!!!

von Steffen (Gast)


Lesenswert?

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

von Uwe (Gast)


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

von HDW (Gast)


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

von Steffen (Gast)


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

von Uwe (Gast)


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

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.