Forum: Mikrocontroller und Digitale Elektronik Variable zu ASCII umwandeln in C


von Jakob (Gast)


Lesenswert?

Hallo
Gibt es eine Möglichkeit, wie ich den Inhalt einer Variable zu seinem 
ASCII-Code umwandeln kann? (ohne printf!)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Jakob schrieb:
> Gibt es eine Möglichkeit, wie ich den Inhalt einer Variable zu seinem
> ASCII-Code umwandeln kann?
Ja.
Welchen Datentyp hat die Variable?

von Jakob (Gast)


Lesenswert?

unsigned char

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?


von DS (Gast)


Lesenswert?

>>unsigned char

und was steckt drin. eine bcd oder binärzahl?

DS

von dadada (Gast)


Lesenswert?

Jakob schrieb:
> ohne printf!)

klar! mit sprintf. Sag uns doch mal, was Du machen möchtest. Was ist 
eine Eingabevariable (unsigned char); aber wohin möchtest Du das 
ausgegeben/übertragen oder sonst was bekommen. Falls Dein output wieder 
unsigned char sein sollte schlage ich den Identitätsoperator vor :

unsigned char uc2ascii (unsigned char input){
   unsigned char asciiOutput;
   asciiOutput=input;
   return asciiOutput;
}

(diese Code kann noch optimiert werden :-) :-) )

von Jakob H. (abdu)


Lesenswert?

Ich will von einer Tastaturmatrix (0-F), über einen uC, auf ein 
VFD-Display herausgeben.
Ich will ein einfaches Programm schreiben, wobei ich die  2 char 
Variablen(z.b Sammand1 und Summand2)  mit der Tastaturmatrix eingebe und 
dann auf dem Display: "Summand1" + "Summand2" = "Resultat" ausgebe.

Ps: bin ein Lehrling im 2. Lehrjahr als Elektroniker und hatte noch 
keine grosse Ehrfahrung mit programmieren! :-)

von dadada (Gast)


Lesenswert?

Jakob Hertz schrieb:
> "Summand1" + "Summand2" = "Resultat"

Es ist immer noch unklar. Gib doch mal ein konkretes Beispiel. Meinst Du 
so etwas. Ich char1 ist der Wert 10 und in char2 der Wert 11 und Du 
möchtest 'AB' im Display sehen?

Und genauso wichtig : über welche Schnittstelle (Software/Hardware) ist 
das Display angeschlossen?

von Jakob H. (abdu)


Lesenswert?

Ich möchte das ich nur die Werte für char1(z.B. 4) und char2(z.B. 3), 
das Programm das dann übersetzt und das Diplay dann : 4 + 3 = 7 
anzeigt...

dadada schrieb :
> über welche Schnittstelle (Software/Hardware) ist
>
> das Display angeschlossen?

über eine serielle COM Schnittstelle falls du das meinst^^

von Jakob H. (abdu)


Lesenswert?

Jakob Hertz schrieb :
> Ich möchte das ich nur die Werte für char1(z.B. 4) und char2(z.B. 3),

Ich möchte das ich nur mit der Tastaturmatrix für char1(z.B. 4) und 
char2(z.B. 3) eingeben kann, ***

von DS (Gast)


Lesenswert?

uint8_t zahl1=3;
uint8_t zahl2=4;
uint8_t erg=0;

erg=zahl1*zahl2;

ausgabe:

...zahl1|0x30, zahl2|0x30, erg|0x30...

wie auch immer die lcd ausgabe aussieht...

solange die zahlen und ergebnisse zwischen 0-9 sind geht das.

DS

von DS (Gast)


Lesenswert?

ich meinte natürlich:

erg=zahl1+zahl2;

und nicht:

erg=zahl1*zahl2;

DS

von Phantomix X. (phantomix)


Lesenswert?

1
void small_utoa(uint32_t val, char* buffer, uint8_t radix)
2
{
3
  char temp[10];
4
  uint8_t index = 0;
5
  uint32_t val2;
6
  uint8_t digit;
7
8
  do
9
  {
10
    val2 = val / radix;
11
    digit = (uint8_t) (val - val2 * radix);
12
    temp[index++] = (char) (digit > 9 ? digit + 'A' - 10 : digit + '0');
13
    val = val2;
14
    if(index > 9) break;  //safety; should never happen
15
  } while(val > 0);
16
17
  while(index--) *(buffer++) = temp[index];
18
  *(buffer) = 0;  //C-String termination
19
}
20
21
void small_itoa(int32_t val, char* buffer, uint8_t radix)
22
{
23
  if(val < 0)
24
  {
25
    *(buffer++) = '-';
26
    val = -val;
27
  }
28
  small_utoa((uint32_t) val, buffer, radix);
29
}

von dadada (Gast)


Lesenswert?

Gut. Warum keine Verwendung von sprintf?

von Jakob H. (abdu)


Lesenswert?

Vielen Dank Phantomix! :-D

von Jakob H. (abdu)


Lesenswert?

Wie würde es denn mit sprintf aussehen?

von Jakob H. (abdu)


Lesenswert?

Und was ist der untershied zwischen printf und sprintf?

von Karl H. (kbuchegg)


Lesenswert?

Jakob

Kauf dir ein C-Buch!
Das ist wichtig. Deine Fragen sind von der allereinfachsten Sorte. Da 
warten noch 1000-ende große und kleine Probleme und Wissensbrocken auf 
dich, die du ALLE kennen musst, wenn du ernsthaft programmieren willst. 
In einem C-Buch stehen die ALLE drinnen (und noch viel mehr) und das 
Buch führt dich systematisch durch die Materie. Vom Einfachen zum 
Schwierigen. Unter Berücksichtigung und Erörterung all der kleinen 
Fallen, die auf dich warten.

Ein Einsteiger-C-Buch für deinen µC wirst du selten finden. Das macht so 
gesehen aber auch nichts. Installier dir auf deinem PC ein PC-taugliches 
Entwicklungssystem und arbeite trotzdem das C-Buch durch (denn dafür 
funktioniert dein C-Buch dann perfekt). Dein C wird sich, selbst wenn es 
nicht µC-spezifisch ist, vom ersten Tag an, an dem du auf dem PC 
systematisch die C Grundlagen durcharbeitest und Übungen machst, 
schlagartig verbessern. Und zwar nicht nur in der PC-Programmierung 
sondern auch speziell in der µC Programmierung. In deinem Buch findet 
sich zwar nichts über Portzugriffe und Timer und dergleichen. Das macht 
aber nichts. Denn selbst wenn man diese µC-spezifischen Dinge 
ausklammert, bleibt noch genug übrig, damit du das nächste halbe Jahr 
mehr als beschäftigt bist. Und für den µC-spezifischen Rest sind dann 
wir da, bzw. mit mehr Erfahrung wird dann das Datenblatt dein bester 
Freund.


zb:
1
  char output[30];
2
 
3
  sprintf( output, "%d + %d ergibt %d\n", (int)zahl1, (int)zahl2, (int)erg );
4
  lcd_string( output );

sprintf verwendet einen String, in den Formatieranweisungen (nach dem %) 
eingebettet sind. sprintf setzt dann an diesen Stellen die restlichen 
Argumente ein, wobei man umfangreiche Möglichkeiten für die Formatierung 
hat.


printf, sprintf, fprintf machen in dieser Hinsicht alle das gleiche. 
UNterschiedlich ist nur, was dann mit dem Ergebnis gemacht wird.
printf     gibt an der Standard Ausgabe aus
fprintf    schreibt das ganze in eine Datei
sprintf    schreibt das ganze als String in ein char-Array


Auf einem AVR-µC macht nur sprintf Sinn, weil es ja so etwas wie eine 
Standard-Ausgabe in dem Sinne nicht gibt.

von Jakob H. (abdu)


Lesenswert?

Hallo Karl

wie schon gesagt ich bin ein Lehrling als Elektroniker und in der 
Berufsschule hatten wir diese Thema noch nicht! :-)

Ich danke dir viel mal für deine Hilfe!! :-D

von B. S. (bestucki)


Lesenswert?

Wenn du sprintf nicht verwenden willst, dann musst du die Konvertierung 
manuell machen. Schau dir dazu zuerst den ASCII-Code an. Du wirst 
feststellen, dass alle Ziffern hintereinander sind und du zu einer 
einstelligen Zahl nur eine Konstante addieren musst, um das gewünschte 
ASCII-Zeichen zu erhalten.
Wenn deine Zahl mehrere Stellen hat, musst du zuerst die einzelnen 
Ziffern isolieren (Biärzahl zu einer BCD-Zahl umwandeln), bevor du jede 
Ziffer einzeln in ein ASCII-Zeichen konvertieren kannst. Ein allfälliges 
Minuszeichen muss natürlich auch beachtet werden.

EDIT:
Wenn du noch nie in C programmiert hast, wird die Sache natürlich 
schwierig. Es gibt auch einige gute C Tutorials im Internet. Für die 
Berufsschule musst du früher oder später ein Buch kaufen, erkundige dich 
welches verwendet wird, kauf es und lerne in C programmieren.

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.