Forum: PC-Programmierung decimale to ascii


von sasi (Gast)


Lesenswert?

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.

von mischa (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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).

von mischa (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von sasi (Gast)


Lesenswert?

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

von mischa (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von sasi (Gast)


Lesenswert?

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

von Christoph Kessler (Gast)


Lesenswert?

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      ;

;*********************************************************************** 
**

von sasi (Gast)


Lesenswert?

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

von mischa (Gast)


Lesenswert?

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

von sasi (Gast)


Lesenswert?

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

von mischa (Gast)


Lesenswert?

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

von pet (Gast)


Angehängte Dateien:

Lesenswert?

Schau dir mal den angehängten Code an.
Ich benutze ihn um eine Integerzahl (signed) über den Uart mit einem
AVR µC auszugeben.

von sasi (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.