Forum: Mikrocontroller und Digitale Elektronik "Schönste" Lösung int und float rechtsbündig im LCD darzustellen


von Peter (Gast)


Lesenswert?

Hallo

ich habe ein Atmega2560 und ein LCD 204.
Ich will einen 12 Bit Analogwert rechtsbündig darstellen. am liebsten 
auch maximal 4 Zeichen. Mit der itoa funktion wird der String immer nur 
linksbündig im char array...

Meine erste Idee:
1
void itoa_(unsigned char stellen, int16_t zahl) {
2
  int i;
3
  char lcd_str[20]="";
4
  lcd_str[stellen]='\0';
5
  for(i=(stellen-1); i>=0; i--)
6
  {
7
    lcd_str[i]=(zahl % 10) +'0';     // Modulo rechnen, dann den ASCII-Code von '0' addieren
8
    zahl /= 10;
9
  }
10
  for(i=0;i<=(stellen-1);i++)
11
  {
12
    if(lcd_str[i]=='0')
13
    {
14
      lcd_str[i]=' ';
15
    }
16
    else
17
    {
18
      i=stellen;
19
    }
20
  }
21
}

Aber wenns was fertiges gibt was weniger speicher und zeit benötigt bin 
ich gerne für Vorschläge offen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Peter schrieb:
> Mit der itoa funktion wird der String immer nur linksbündig im char
> array...

Und? Länge des Strings bestimmen, diese von der Anzahl der gewünschten 
Stellen abziehen, und schon weißt Du, wieviele Leerzeichen Du vor dem 
String ausgeben musst, damit er rechtsbündig ist.

Und wenn das ein bisschen dauert: Macht nichts. Das ist eine Ausgabe für 
den Benutzer, also nichts, wo es auf das letzte Fitzelchen Zeit ankommt 
(wie z.B. bei Aktionen in einer ISR o.ä.).

Der Dein Gerät bedienende Mensch kann sowieso nicht mehr als eine 
bestimmte Anzahl von Ausgaben pro Zeit erfassen, daher ist's wurscht, ob 
Deine Ausgabe nun 2000 mal oder nur 500 mal pro Sekunde erfolgen kann 
...

von Das Netzteil (Gast)


Lesenswert?

Und wenn die Ausgabe immer gleich lang ist, kann man ja auch den Cursor 
der LC-Anzeige entsprechend setzen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Es ist die Frage, was für dich die „schönste“ Lösung darstellt.

stdio (sprintf &co) ist natürlich auf sowas spezialisiert, aber nun
nicht gerade „billig“ (im Hinblick auf Speicherverbrauch).

Andererseits hast du einen ATmega2560.

von hinzkunz (Gast)


Lesenswert?

1
char *
2
utodw(unsigned n, char *buf, int width)
3
{
4
    char *p = buf + width;
5
6
    *p = 0;
7
    while (p > buf) {
8
        *--p = '0' + n % 10; 
9
        n /= 10; 
10
        if (n == 0)
11
            while (p > buf)
12
                *--p = ' ';
13
    }   
14
    return p;
15
}

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.