Forum: Mikrocontroller und Digitale Elektronik Char vs. Hex


von Tom (Gast)


Lesenswert?

Hallo,
ich hoffe ihr könnt mir diesmal wieder helfen, ich glaube es ist nur 
eine Kleinigkeit aber ich komm einfach nicht drauf.
Ich habe eine Funktion die einen Charakter an einer bestimmten Position 
auf meinem Display ausgibt (dank eurer Mithilfe funktioniert dies auch 
nun wunderbar).
So nun möchte ich Werte z.b. vom ADC oder ähnlichem ausgeben können.
Hierbei existiert eine funktion welche die Zahl einliest in z.b. 
Tausneder Hunderter Zehner und Einer zerlegt in ein Array speichert und 
dann über die charakter ausgabe ausgibt.
Leider funktioniert das ganze nicht.

Daher meine Frage einmal sage ich der sendefunktion sende '1' und ein 
zweites mal sende 0x31, muss ich hier noch anpassungen vornehmen, denn 
0x31 enspricht doch laut asciicode der "1"

ich danke euch =)

von Thomas K. (rlyeh_drifter) Benutzerseite


Lesenswert?

Vorsicht! Die Frage ist schon schwammig.

1 != "1" != '1' = 0x31 = 49

1    .. Zahl (mit einer Ziffer)
"1"  .. String mit Länge 2 und dem Inhalt {'1', '\0'}
'1'  .. Der Wert des ASCII Einser-Zeichens
0x31 .. hexadezimale Darstellung des ASCII Wertes
49   .. dezimale Darstellung des ASCII Wertes

Bau die Funktion so, dass sie den Wert des ASCII Zeichens erwartet, dann 
ists egal welche der drei letzten Varianten du der Funktion übergibst.

von ... .. (docean) Benutzerseite


Lesenswert?

Zeile 42!

(zeig deinen Code)

von Tom (Gast)


Lesenswert?

Kleiner Hinweis noch, wenn ich die 0x31 in meine lcd_draw_char Funktion 
eingebe erhalte ich die "1" auf meinem Display sprich das Funktioniert.
1
void lcd_draw_double (FONT_P font, uint8_t u8_Style, double dbl_value, uint8_t u8_length, uint8_t u8_decimals, uint8_t u8_x_pos, uint8_t u8_y_pos, uint8_t u8_Brightness)
2
{
3
  uint32_t u32_converted_value;
4
  uint8_t u8_output_data[16];
5
  uint8_t u8_x = 0;
6
  uint32_t u32_factor = 0;
7
  uint8_t u8_leading_zeros_over = false;
8
  
9
  uint8_t u8_ColCount = 0;
10
  uint8_t char_width = 0;
11
12
  u32_factor = 1;
13
  for (u8_x = 0 ; u8_x < u8_decimals ; u8_x++)
14
  {
15
    u32_factor *= 10;
16
  }
17
18
  u32_converted_value = u32_factor * dbl_value;
19
  
20
21
  // -> Zahl ausgeben
22
  if (u8_decimals == 0)
23
  {
24
    // -> Keine Dezimalstellen
25
    // -> Vollen Platz für Zahl nutzen
26
27
    u32_factor = 1;
28
    for (u8_x = 0; u8_x < u8_length ; u8_x++)
29
    {
30
      u8_output_data[u8_x] = (u32_converted_value % (10 * u32_factor)) / u32_factor;
31
      u32_factor *= 10;
32
    }
33
34
    
35
    // -> Führende Nullen löschen
36
    // -> Zu ASCII aufbereiten
37
    // -> Zeichen ausgeben
38
    for (u8_x = 0; u8_x < u8_length ; u8_x++)
39
    {
40
      if ( (u8_output_data[u8_length - 1 - u8_x] == 0) && (u8_leading_zeros_over == false) )
41
      {
42
        u8_output_data[u8_length - 1 - u8_x] = ' ';
43
      }
44
      else
45
      {
46
        u8_output_data[u8_length - 1 - u8_x] |= 0x30;
47
        u8_leading_zeros_over = true;
48
      }
49
50
      if ( (u8_x == u8_length - 1) && (u8_leading_zeros_over == false) )
51
      {
52
        u8_output_data[u8_length - 1 - u8_x] = 0x30;
53
      }
54
      
55
      // Buchstaben ausgeben
56
      lcd_draw_char(font, u8_Style, u8_output_data[u8_length - 1 - u8_x], (u8_x_pos + u8_ColCount), u8_y_pos, u8_Brightness);
57
  
58
      // Zeichenende berechnen
59
      char_width = font_get_char_width(font,u8_output_data[u8_length - 1 - u8_x]);
60
  
61
      // Zähler auf Leerstelle hinter Zeichen setzen
62
      u8_ColCount += char_width + 1;
63
    }
64
}

von Karl H. (kbuchegg)


Lesenswert?

Tom schrieb:

> So nun möchte ich Werte z.b. vom ADC oder ähnlichem ausgeben können.

OK

> Hierbei existiert eine funktion welche die Zahl einliest in z.b.
> Tausneder Hunderter Zehner und Einer zerlegt in ein Array speichert und
> dann über die charakter ausgabe ausgibt.

Ich habe das Gefühl du machst dir hier viel zu viel Arbeit. Und die dann 
auch noch fehlerhaft.

Fang damit an, dir eine Funktion zu schreiben, die Strings ausgibt. Dann 
formst du deinen Wert in einen String um und gibst den String aus.

Damit bist du universeller, denn Stringausgabe braucht man genauso 
ständig.

von ... .. (docean) Benutzerseite


Lesenswert?

u8_output_data[u8_length - 1 - u8_x] |= 0x30;


wenn das das konvertieren in ascii sein soll. würde +0x30 besser 
passen...

von Karl H. (kbuchegg)


Lesenswert?

Tom schrieb:
> Kleiner Hinweis noch, wenn ich die 0x31 in meine lcd_draw_char Funktion
> eingebe erhalte ich die "1" auf meinem Display sprich das Funktioniert.

Dachte ichs mir doch.

Betreib Arbeitsteilung!

Zahl -> String
String ausgeben

von Tom (Gast)


Lesenswert?

ist es denn Ratsam die bereits vorhandenen Funktionen wie sprintf zu 
benutzen oder raubt mir das zuviel Speicherplatz?

von Karl H. (kbuchegg)


Lesenswert?

Tom schrieb:
> ist es denn Ratsam die bereits vorhandenen Funktionen wie sprintf zu
> benutzen oder raubt mir das zuviel Speicherplatz?

Das kannst nur du wissen, ob das zuviel Speicher braucht.
Wenn du aber sowieso wegen Speicher Sorgen hast, frag ich mich, wozu du 
dann überhaupt Gleitkomma im System hast

(Anstelle der eierlegenden Wollmilchsau sprintf, gibt es dann ja auch 
noch dtostrf)

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.