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 =)
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.
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 | }
|
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.
u8_output_data[u8_length - 1 - u8_x] |= 0x30; wenn das das konvertieren in ascii sein soll. würde +0x30 besser passen...
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
ist es denn Ratsam die bereits vorhandenen Funktionen wie sprintf zu benutzen oder raubt mir das zuviel Speicherplatz?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.