hallo an alle ich will temepraturwerten auf lcd anzeigen. die temepatur ausgabe sind decimale werte, und will das auf dem lcd anzeigen . ich brauche ein routine die von dec zu ascii wandelt oder? kann jemanden mir weiter helfen bitte. grüsee sasi.
so natürlich hast du mitgeschrieben ob pc µc ... oder auch programmiersprache naja das ist zB ein vorschlag für C void LCD_ZAHL4 (unsigned short int Zahl ) { // für zahlenausgaben bis 99.999 stellen unsigned char Stelle [6]; unsigned char St ; for (St=5 ; St>0 ; St--){ Stelle[St]=(Zahl % 10)+48; Zahl = Zahl / 10; } for (St=1 ; St<6 ; St++){ d_lcd (Stelle[St]); } return ; } ja wie alle erkennen, bin ich nicht der große programmierer. aber ich habe heute meinen sozialen Mischa ps: ich denke das das prinzip aufgezeigt wird
Das Prinzip ist schon ok. Nur eine kleine Anmerkung: Stelle[St]=(Zahl % 10)+48; Wieso 48? Denkt sich der unbedarfte Porgrammierer. Stelle[St]=(Zahl % 10) + '0'; macht genau dasselbe, nur sieht man hier besser was passiert: Zum ASCII Code von '0' wird die Ziffer addiert. Da die Codes fuer die Ziffern '0', '1', '2', ... '9' aber aufsteigend sind kriegt man als Ergebnis den ASCII Code der der errechneten Ziffer entspricht. (Das macht Dein Code auch, nur verwende ich halt keine magische Zahl wie 48, sondern sag klip und klar, dass ich den Code für '0' brauche).
hmm das is durchaus plausibel. wahrscheinlich bin ich zu bedarft ;-) und habe mich der acii tabelle bedient um die 48 zu finden. so gehts natürlich eleganter. jaja man ist eben noch am lernen bei so manchen sachen. Mischa
Du musst Dir nur merken, dass in C ein char auch nur ein kleiner Integer ist. Mit den Dingern kann man genauso rechnen und fuhrwerken wie mit allem anderen.
danke euch (mischa u kbuchegg) ich habe es nicht so verstanden wie diese routine läuft, da ich kein ich anfänger bin. naja nehmen wir an dass meine thermometer z.B(20 °) anzeigt. wie wird das noch mal fonktionieren jetzt. d_lcd (Stelle[St]); was ist d _lcd sasi
d_lcd(... ) ist der funktionsaufruf damit meine lcd routine ein datenbyte überträgt, (nämlich genau das an der stelle st ). wie der bei dir heist kann ich nicht sagen. wir wissen ja noch immer nicht welche programiersprache und wenn welche source dateien (*.h) du nutzt. generell ich schreibe ja auch kein perfektes deutsch. aber irgendwo fehlen bei dir worte und das macht es verdammt schwierig was heraus zu finden. noch nichtmal ob du nun anfänger bist oder nicht.
d_lcd ist eine Funktion die ein einzelnes Zeichen an das LCD ausgibt. Bei Dir mag diese Funktion anders heissen. Dann musst Du halt Deinen Funktionsnamen dafuer einsetzen. Wie gesagt: Die Funktion muss nur ein einzelnes Zeichen (wie 'a', 'b' oder aber auch '1', '2' ...) ausgeben koennen. Zur Funktion selbst: Ist im Grunde ganz einfach. Wenn Du eine Zahl hast, sagen wir mal 5873. Wie kriegst Du dann die einzelnen Ziffern dieser Zahl (also 5, 8, 7 und 3). Hmm. Wenn Du die Zahl durch 10 teilst (so wie in der Grundschule), dann wird das 5873 durch 10 ergibt 587 und 3 Rest. Hmm. Noch mal 587 durch 10 ergibt 58 und 7 Rest Noch mal 58 durch 10 ergibt 5 und 8 Rest 5 durch 10 ergibt 0 und 5 Rest Und jetzt schau Dir mal die Reste genauer an. Das waren 3 7 8 5. Wie waren noch mal die einzelnen Ziffern der Zahl? 5 8 7 3 Aha. Die Reste sind also genau die Ziffern, nur halt in umgekehrter Reihenfolge. Tja. Jetzt musst Du nur noch rausfinden, wie man den Rest einer Ganzzahldivision in C berechnet. Genau das mach %. % funktioniert wie /, nur wird halt der Rest geliefert und nicht der Quotient. Bis jetzt sind alles noch Zahlen. Schoen. Nur moechte das Display Character haben. Wenn Du haben moechtest, dass das Display ein 'a' anzeigt, dann musst Du ihm den Code fuer 'a' schicken. Wenn es 'b' anzeigen soll, dann eben den Code fuer 'b' und wenn es '0' anzeigen soll, dann musst Du ihm den Code fuer '0' schicken. Nun ist der Code fuer '0' aber nicht 0. Das waer zu einfach. Der Code fuer '0' ist 48. Daher hat mischa zum Ergebnis der Restbildung ganz einfach 48 dazugezaehlt. Kommt bei der Restbildung eine 0 heraus, so wird im Array eine 48 gespeichert. Kommt 1 heraus dann wird 49 gespeichert (welches 'zufaellig' der Code fuer '1' ist), bei 2 eine 50 ( Code fuer '2'), ... etc. Das war die erste Schleife. In der 2.ten Schleife werden dann ganz einfach die ermittelten Codes in der richtigen Reihenfolge (von hinten nach vorne) ans Display ausgegeben.
danke kbuchegg das war sehr gut detaiert. eingentlich müsste ich allein darauf gekommen.aber naja ... ich propiere es morgen,und melde mich morgen noch mal gruss sasi
Hier meine Konvertierungsroutine in AVR-Assembler, ich brauche sie um Vekorgrafik in HPGL auszugeben: ;*********************************************************************** ** ;* subroutine: convert 16bit-word -> decimal -> ASCII -> plot HPGL ;*********************************************************************** ** DecOut: rcall Div10 ; get "ones" digit ori Temp1,$30 ; convert to ASCII push Temp1 ; and save it rcall Div10 ; get "tens" digit ori Temp1,$30 ; convert to ASCII push Temp1 ; and save it rcall Div10 ; get "hundreds" digit ori Temp1,$30 ; convert to ASCII push Temp1 ; and save it rcall Div10 ; get "thousands" digit tst Temp1 ; omit leading zero breq DecOu1 ; ori Temp1,$30 ; convert to ASCII rcall Serout ; print thousands DecOu1: pop Temp1 ; fetch hundreds rcall Serout ; and print it pop Temp1 ; fetch tens rcall Serout ; and print it pop Temp1 ; fetch ones rcall Serout ; and print it ret ; ;*********************************************************************** ** ;* 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 ; ;*********************************************************************** **
ich danke euch alle Endlich die routine hat fonktioniert.für die positiven werten läuft alles reibungslos. ich soll nur die negativen temperaturenwerten anpassen. soll ich auch extra eine routine dafür schreiben ??. oder nur die obere anpassen. a propos ich programmiere in C; ich danke euch nochmal für eurer hilfe . sasi
ich würde den aufruf der routine anpassen so nach dem motto wenn kleiner null: ein - auf lcd schreiben, dann mit -1 multiplizieren und routine aufrufen sonst nur routine aufrufen Mischa
ich habe es jetzt probiert aber das klappt immer noch nicht mit der negativen zahlen .d.h ich hab irgendwie 1 softwarefehler. kanst du mir bitte deine routine für negative Zahlen schicken.?? sasi
is das dein ernst ?? if (var<0) {d_lcd ('-'); var=*-1; LCD_ZAHL4 (var);} else {LCD_ZAHL4 (var);} das is aus der kalten heraus kann atürlich sein das ich mich jetzt wieder irgendwo verballert habe aber lerne er proggen Mischa
Schau dir mal den angehängten Code an. Ich benutze ihn um eine Integerzahl (signed) über den Uart mit einem AVR µC auszugeben.
danke euch alle bosenders Mischa nun läuft alles richtig wie ich wollte. ich weiss jetzt woran lag . ich habe vergissen die datentype meiner funktion anzupassen, deswegen waren falsche ausgaben bei negativen temepraturen. aber ich hab das gleiche prinzip wie du beuntzt um die negativen auf dem lcd anzuzeigen . gruss sasi
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.