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
Sinnvoll zu wissen wäre, in welcher Sprache du programmierst ... PS: falsches Forum
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.
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.
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?
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.
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.
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.