Register an LCD ausgeben

Gast #29666
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???
Gast
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
Gast
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?
Gast
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!!!
Gast
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
Gast
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
Gast
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
Gast
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

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.