Forum: Mikrocontroller und Digitale Elektronik variable auf lcd ausgeben (assembler)


von Pe D. (pdk)


Lesenswert?

hallo zusammen,

erstmal ein lob an diese page, sie hat mir schon oft geholfen (und ihre 
user)

aber nun hab ich mal wieder ein problem:

wie gebe ich eine variable an mein lcd aus?
also das lcd läuft, ich kann auch feste werte und texte ausgeben, aber
ich will u.a. eine counter ausgeben.
wie muss ich dass machen?

schonmal im voraus danke

gruß
philipp

von Hauke R. (lafkaschar) Benutzerseite


Lesenswert?

Sinnvoll zu wissen wäre, in welcher Sprache du programmierst ...

PS: falsches Forum

von Pe D. (pdk)


Lesenswert?

siehe überschrift: assembler

von Christoph Kessler (db1uq) (Gast)


Lesenswert?

Cursor positionieren und Zeichen ausgeben, das unterscheidet sich nicht 
von festem Text. Für Ziffern kan es sinnvoll sein, von rechts nach links 
zu schreiben, da z.B. eine Hex-zu-Dezimal-Wandlung die Einer zuerst 
ausgibt. Also Cursor auf "Position dekrementieren" einstellen.

von Hauke R. (lafkaschar) Benutzerseite


Lesenswert?

Oh entschuldige, ich hab mich einfach so durch die Threads geklickt und 
beim Thread lesen nich mehr auf die Überschrift geachtet.
Christoph hat das ja schon gut erklärt. Wenn du nur den Inhalt einer 
Variable  auf das LCD schreibst bekommst du nur ein Zeichen, welches 
diese Zahl representiert. D.h. du musst deine Zahl so Wandeln, damit sie 
auf dem LCD darstellbar ist. Dazu gibts verschiedene Ansätze.
Wenn du schon Texte ausgegeben hast sollte dir auch klar sein, dass LCDs 
meistrens keinen ASCII schriftsatz haben, deswegen musst du fertige 
Routinen vll anpassen.

von Pe D. (pdk)


Lesenswert?

dankeschön

von kattoaster (Gast)


Lesenswert?

versteh ich net ganz,
habe das gleiche problem, hab in einem register eine zahl stehen(max 
8bit)
und möchte die ausgeben. meine texte gebe ich folgendermaßen aus:

text6:

.db "Auswahl: "

das is meine textmarke, und so wird es ausgegeben:

ldi  LCD_out,zeile1
  rcall  sendebefehl
  mov   temp, temp4_LCD
  ldi  temp,9
  mov   temp4_LCD, temp
  ldi  zl,low(text6*2)
  ldi  zh,high(text6*2)
loop_msg17:
  lpm
  mov  LCD_out,r0
  rcall  write_LCD_data
  inc  zl
  brcc  no_carry17
  inc  zh
no_carry17:
  dec  temp4_LCD
  brne  loop_msg17
  ldi  LCD_out,zeile2
  rcall  sendebefehl

sieht vielleicht komisch aus, funktioniert aber!
ausgegeben wir nun am Display: Auswahl
und das ganze in der ersten zeile.
wie kann ich jetzt dadurch ein register ausgeben?

von Christoph Kessler (db1uq) (Gast)


Lesenswert?

Die 8 Bit in 3 BCD Ziffern umwandeln, also 3 Byte zwischen 00 und 09, 
dann mit 30 hex verODERn, das ergibt ASCII-Ziffern 30-39 hex, und 
nacheinander ausgeben.
Die Umwandlung besteht aus mehreren Divisionen, deren Rest jeweils die 
BCD-Zahl enthält.

von Christoph Kessler (db1uq) (Gast)


Lesenswert?

Aus dem ersten Trampert-Buch habe ich folgendes Unterprogramm zur 
Division  eines 16Bit-Worts entnommen und kommentiert:

;*********************************************************************** 
**
;* subroutine: divide 16bit word in TempH/TempL by 10,
;* results: quotient in TempH/TempL, remainder in Temp1 = decimal digit
;* taken from "Trampert, AVR-RISC-Mikrocontroller"
;* Franzis-Verlag www.franzis.de ISBN 3772354742 pg. 327
;*********************************************************************** 
**
Div10:
  push  Cnt    ;
  clr  Temp1    ;
  lsl  TempL    ; input word is shifted out to the left
  rol  TempH    ; filled up with zeroes from the right
  rol  Temp1    ;
  lsl  TempL    ;
  rol  TempH    ; most significant 3 bits are always < 10
  rol  Temp1    ; so just shift out and in via Cy 3 times
  lsl  TempL    ;
  rol  TempH    ;
  rol  Temp1    ;
  ldi  Cnt,13    ; start loop for next 13 bits
Div10a:
  lsl  TempL    ;
  rol  TempH    ;
  rol  Temp1    ;
  subi  Temp1,10  ; remainder >10 ? -> subtract 10
  brlo  Div10b    ; was <10, LSB of output word = 0
  inc  TempL    ; LSB of output word = 1
  rjmp  Div10c
Div10b:
  subi  Temp1,-10  ; back to old value <10
Div10c:
  dec  Cnt    ; next bit
  brne  Div10a    ;
  pop  Cnt    ;
  ret      ;

das muß für jede Ziffer einmal aufgerufen werden.

von kattoaster (Gast)


Lesenswert?

danke für die division, hab sogar schon eine.

aber wie geb ich nun die variable auf das lcd aus?

die texte geb ich ja mit meiner schleife aus und geladen wird es
aus der textmarke mit .db "wort"
wie geht das nun mit einem register?

von Karl H. (kbuchegg)


Lesenswert?

Indem du Stelle für Stelle ausgibst.

Wenn du in einem Register die Zahl 178 stehen hast,
dann musst du 3 Ausgaben machen. Einmal eine '1', dann
eine '7' und zuletzt eine '8'.

Da gibt es mehrere Möglichkeiten. Ein davon ist
die angesprochene Division.

178 / 10  ->  17
178 - 17 * 10  -> 8
                    das gibt schon mal die letzte Stelle
                    Noch hex 30 dazuaddiert und du hast das
                    ASCII Zeichen, dass als letztes ausggeben
                    werden muss

17 / 10  ->  1
17 - 1 * 10 -> 7   die nächste Stelle

1           -> 1   die erste Stelle


Eine andere Möglichkeit:
Da ein Register einen rel. kleinen Wertebereich hat.
kann man auch folgendes machen.

Für die Hunderterstelle:
    Ist die Zahl kleiner 100  -> tue nichts
    ist die Zahl größer 200  ->  eine '2' ausgeben, von der Zahl
                                 200 abziehen
               andernfalls   ->  eine '1' ausgeben, von der Zahl
                                 100 abziehen

    --- an dieser Stelle ist die Zahl auf jeden Fall kleiner 100

    einen Zähler mit 0 initialisieren
 -> ist die Zahl kleiner 10     ja ----------------+
 |  von der Zahl 10 abziehen                       |
 |  Zähler um 1 erhöhen                            |
 +  und weiter                                     |
                                                   |
    +----------------------------------------------+
    |
    v
    Zähler enthält die Anzahl der Zehner
    zum Zähler '0' addieren und ausgeben
    |
    |
    v
    In der Zahl sind nur noch die Einer verblieben
    '0' dazuaddieren und ausgeben


Die Schleife in der Mitte realisiert im Grunde die Division
mit Restbildung, die man benötigt um eine 2-stellige Zahl
in Zehner und Einer zu trennen.


von kattoaster (Gast)


Lesenswert?

vielen dank,

es funktioniert :-)

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.