mikrocontroller.net

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


Autor: Pe Dk (pdk)
Datum:

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

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sinnvoll zu wissen wäre, in welcher Sprache du programmierst ...

PS: falsches Forum

Autor: Pe Dk (pdk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
siehe überschrift: assembler

Autor: Christoph Kessler (db1uq) (Gast)
Datum:

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

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

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

Autor: Pe Dk (pdk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dankeschön

Autor: kattoaster (Gast)
Datum:

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

Autor: Christoph Kessler (db1uq) (Gast)
Datum:

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

Autor: Christoph Kessler (db1uq) (Gast)
Datum:

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

Autor: kattoaster (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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


Autor: kattoaster (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen dank,

es funktioniert :-)

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.