- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 8 von 8

Thema: Integer Variable mit LCD Lib von Peter Fleury

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.02.2005
    Ort
    Hannover
    Beiträge
    174

    Integer Variable mit LCD Lib von Peter Fleury

    Anzeige

    E-Bike
    Hi,
    ich habe jetzt angefangen meinen µC in C zu programmieren und hab das LCD jetzt am laufen.
    Ich habe da jetzt nur ein Problem. Ich weiß nicht wie ich den Inhalt einer Integer oder Float Variable auf dem Display anzeige. Ich muss ja die int Variable in eine String Variable umwandeln. Hab auch bei Google schon gesucht und ausprobiert nur ich habe noch kein brauchbares Ergebnis erziehlt.
    Ich verwende die Lib von Peter Fleury.

    MfG PcVirus

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    06.03.2007
    Beiträge
    176
    itoa ist dein Freund ltoa sollte auch gehen

    char s2[mit_genug_platz_für_die_Zahl];

    itoa( (L_Com&0x7fff),(char *)s2, 10)

    die 10 sagt die Zahlenbasis, hier dezimal
    2 für binär
    8 für oktal
    16 müsste dann hex sein ?
    und bei 21 bin ich grad unsicher

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.02.2005
    Ort
    Hannover
    Beiträge
    174
    Danke funktioniert einwandfrei!

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    für floats habe ich nichts passendes gefunden, ftoa ging bei mir nicht und sprintf verbietet sich, weil es zuviel flashspeicher klaut.

    ich habe das dann so gelöst:

    Code:
    void display(int value)
    {
        char buffer[8];
        float f=((float)value*5)/1023;
        if(f<0)f=0;
        itoa((int)f,buffer,10);
        lcd_puts(buffer);
        lcd_putc(',');
        f=(f-(int)f)*1000;
        if(f<100)lcd_putc('0');
        if(f<10)lcd_putc('0');
        itoa((int)f,buffer,10);
        lcd_puts(buffer);
        return;
    }
    in diesem fall wird eine kommazahl ausgegeben, die sich aus value berechnet. 0->0,000; 1023->5,000.

    besonders elegant ist das ja nicht, und braucht sicher auch eine menge speicher. weiss jemand, wie man das einfacher/besser hinbekommt?

    gruesse von der katz

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    06.03.2007
    Beiträge
    176
    Zitat Zitat von robocat
    ich habe das dann so gelöst:
    ...
    besonders elegant ist das ja nicht, und braucht sicher auch eine menge speicher. weiss jemand, wie man das einfacher/besser hinbekommt?
    gruesse von der katz
    weiss nicht ob das eleganter ist, aber weniger Mathe isses

    strcpy((char *)UI_str,insert_char((char *)trimm_string(' ',itoa( (ReadChannel(0) * _scaler)/10, (char *)s, 10), 2 ), ',', 1));

    // * _scaler gibt die echten Volt ganzahlig hier im Bsp. 500
    // :10 weil mir eine Nachkommastelle reicht, gibt also 50
    // diese 50 wird nun mit itoa in einen String gewandelt
    // und das Komma eingefügt, nach Bedarf auch gerne mit Punkt


    char *insert_char(char *s_string, char ins, UBYTE wo)
    { static char _tmp[32]={0};
    strncpy(_tmp, s_string, wo);
    _tmp[wo]=ins;
    _tmp[wo+1]=0;
    strcat(_tmp, (char *)(s_string+wo));
    //__tmp[3]=0; // nur noch eine Nachkommastelle , wenn 1 Stelle reicht kann man hier Schluss machen
    return _tmp;
    }

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    27.10.2005
    Beiträge
    48
    Hallo !

    Habe dasselbe Problem, eine int oder eine float
    auf einem LCD darzustellen.
    Text geht einwandfrei.

    Eine Frage dazu :
    Was tun, wenn ich kein 'itoa' zur Verfügung habe ?
    Wie kann ich diesen Befehl einbinden ?
    Ich verwende den IAREditor/Compiler in Standard C.

    Danke !

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    itoa ist kein standard. wenn sprintf aus platzgründen ausscheidet, muss man sich selbst eine konvertierung basteln.

    Code:
    #include <stdio.h>
    #include <conio.h>   // nur für getch. kein ansi-standard.
    
    void toascii(int i, char *a)
    {
      short int k=10000,n,pos=0;
    
      if(i<0) // neg. vorzeichen
      {
        a[pos++]='-';
        i*=-1;
      }
      else if (i==0) // wenn i=0 ist
      {
        a[pos++]='0';
        a[pos]=0;
        return;
      }
      while(i/k==0) // fuehrende nullen abschneiden
      {
        k/=10;    
      }
      while(k) // konvertieren
      {  
        n=i/k;
        a[pos++]=n+'0';
        i-=n*k;
        k/=10;
      }
      a[pos]=0;
      return;
    }
    
    int main(void)
    {
      char a[7];
      toascii(-37656,a);
      printf("%s",a);
      getch();
      return(0);
    }
    short ist hier ein 16bit int, das muss man an den controller anpassen. das char-array a muss gross genug sein, dass der int mitsamt vorzeichen und terminierender 0 reinpasst.

    der code ist nur so hingeklatscht und nicht auf sicherheit optimiert (das heisst er läuft, aber bei falscher wahl von a,i,k können probleme auftreten). ist nur zum besseren verständnis gedacht.

    anstelle von printf muss die textausgabe-funktion fürs LCD hin. sonst könnte man ja gleich mit %d den integer ausgeben.

    gruesse von der katz

  8. #8
    Erfahrener Benutzer Begeisterter Techniker Avatar von PCMan
    Registriert seit
    05.08.2006
    Ort
    Munich
    Beiträge
    311
    Die Anzeige von Float variablen hab' ich so gelöst:

    dtostrf(FLOATV,6,3,CHARV);
    llcd_puts(CHARV);

    FLOATV ist einstellig+punkt+3Nachkommastellen. Also 5 Stellen auf dem Display. Dann noch Vorzeichen beachten (+/-) und dann kommen 6 Felder auf dem LCD zustande (daher die 6). CHARV musst du dann natürlich mindestens 6 Felder groß machen. Die 3 gibt die Anzahl der Nachkommastellen an.
    vG Simon

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test