- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 7 von 7

Thema: LCD Statusbalkenerstellen, aber wie

  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    73
    Beiträge
    1.175
    Blog-Einträge
    1

    LCD Statusbalkenerstellen, aber wie

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo Freunde ,

    Die Tomaten sind ausgesät, mein "Garduino" soll in die in die Version 1.01 gehen und da möchte ich einen Statusbalken 16-teilig auf einem 20x4 I2C Display erstellen, der bei Messungen den Status der Abarbeitung einzelener Messungen anzeigt. Vielmehr bin ich mir nicht so klar darüber, wie ich das Zeichen erstelle...in einer Schleife erstelle ich die jeweilige Anzeigeposition..alles klar..aber eben wie ich ein"volles Zeichen" erstelle...da muss es doch wo ne Info geben welches Char, bzw welchen hex-WEert ich da schreiben muss...kan mal wer ein wenig nachhelfen..ich bin da noch zu neu in der LCD Branche.

    GRuss und Dank Gerhard
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    33
    Beiträge
    1.192
    Hallo Gerhard,
    den Zeichensatz findet man im Datenblatt des HD44780 bzw in http://de.wikipedia.org/wiki/Hd44780...nd_Zeichensatz
    Um einen vollen Block auf dem Display auszugeben, muss FF (hex) bzw. 255(dezimal) bzw. 11111111(binär) gesendet werden.
    Viele Grüße,
    Bernhard
    "Im Leben geht es nicht darum, gute Karten zu haben, sondern auch mit einem schlechten Blatt gut zu spielen." R.L. Stevenson

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    73
    Beiträge
    1.175
    Blog-Einträge
    1
    Danke Bernhard

    mit lcd.write(0xff) bekomme ich ein volles Zeichen, nun will ich oben und unten je zwei reichen im Zeichen leer haben , habe do soche Bit-Berechnungstabelle , aber es will mir nicht gelingen..
    Vielleicht kannst Du noch mal helfend einspringen...
    Danke und Gruss

    Gerhard
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    33
    Beiträge
    1.192
    Eine Kurzanleitung, wie neue Zeichen erstellt werden gibt es u.a. hier http://www.lcd-module.de/fileadmin/p...blueline-w.pdf auf Seite 2.
    Zunächst muss "CG RAM Address Set" also z.B. 01000000 gesendet werden (RS=low). Damit wird das erste von acht möglichen benutzerdefinierten Zeichen angewählt.
    Ab dann werden das neue Zeichen Zeile für Zeile gesendet. Die fünf niederwertigsten Bits entsprechen den Pixeln. Für ein Rechteck wo oberste und unterste Zeile fehlen ist das
    00000000
    00011111
    00011111
    00011111
    00011111
    00011111
    00011111
    00000000, währenddessen muss RS=high sein.
    Ab dann "kennt" das Display dieses neue Zeichen. Um es auf dem Display anzuzeigen, muss dann zuerst "DD RAM Address Set" mit 1xxxxxxx (x=je nach Position) gewählt werden und dann erfolgt die Ausgabe mit lcd.write(0x00);

    Für Arduino gibt es in der LiquidCrystal auch "createChar", Beispiel http://arduino.cc/en/Reference/Liqui...r#.UxB73qzy1Dk

    Grüße, Bernhard
    "Im Leben geht es nicht darum, gute Karten zu haben, sondern auch mit einem schlechten Blatt gut zu spielen." R.L. Stevenson

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    73
    Beiträge
    1.175
    Blog-Einträge
    1
    Hallo Bernhard !
    Erst einmal vielen , vielen Dank für Deine Bemühungen !!! Wie gesagt ich befasse mich zum ersten Male mit der Erstellung eigener Zeichen. Um mit meinen Garduino erst mal weiter zukommen habe ich einfach mal das "#" Zeichen verwendet. Wie mir scheint muss man das "eigene Zeichen " erst in den Speicher schreiben um es anschliessend aufrufen zu können ??
    Nun ja das hatte ich wohl bei meinen Gedankengängen übersehen....man lernt ja nie aus...auch wenn die Haus(Ehe-)frau es nicht begreifen kann, das man am PC auch lernt und nicht nur "dumme Spielereien" macht
    Ich werde mich mit meinem Erfolg dann hier wieder melden....oder aber meine Niederlage verkünden...

    Besten Dank und Gruss
    Gerhard

    Anhang : Mit dem Arduino Bsp. klappt's wunderprächtig..., nun ja, muss mich dann mal später auch damit in C und AVR auseinandersetzen..habe ja nicht nur Arduinos in Verwendung.
    Geändert von oderlachs (28.02.2014 um 13:56 Uhr)
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.652
    ... einen Statusbalken 16-teilig auf einem 20x4 I2C Display erstellen ...
    BMS hat´s Dir ja schon schön gezeigt. Noch´n Vorschlag, oder ne Frage, von mir. Ich verwende so einen Bargraph-Zappelphillipp in EINEM Zeichen. Da läuft halt der "Füllstand" rauf und runter, Beispiel hier, bei Sekunde 8. Und die Programmiererei der Sonderzeichen mache ich entweder "graphisch" - da sieht man gleich im Kommentar des Quelltextes was für ein Zeichen das ist, oder z.B. für den Bargraph als Linienzahl - ein Byte als Strich hat nämlich den Wert 39. Zur Erläuterung der Code (ok ok, Du hast kein C sondern Arduino - aber für die Sonderzeichen wirds wohl recht C-nahe werden *gg*.

    Code:
    // ============================================================================== =
    //  Generierung von LCD-Sonderzeichen für DEM162xx, Satz 1 = Balken vertikal
    // ============================================================================== =
      void LCD_SZ1(void)            // Generiere LCD-Sonderzeichen, Satz 1 = Balken
     {                              //   vertikal, 7 Zeichen
    // - - - - - - - - - - - - - - - -// Es folgen LCD-Daten für den Balken 1 bis 7 Pixelreihen hoch
    //      der "Balken8" ist DEM-Code 255, der leere Balken ist DEM-Code 254
      uint8_t LCD_c_1[8] =          // LCD-Character 1, unterste Linie
        { 0,  0,  0,  0,  0,  0,  0,  31 };
      lcd_generatechar(LCD_GC_CHAR1, LCD_c_1);
      uint8_t LCD_c_2[8] =          // LCD-Character 2
        { 0,  0,  0,  0,  0,  0, 31,  31 };
      lcd_generatechar(LCD_GC_CHAR2, LCD_c_2);
      uint8_t LCD_c_3[8] =          // LCD-Character 3
        { 0,  0,  0,  0,  0, 31, 31,  31 };
      lcd_generatechar(LCD_GC_CHAR3, LCD_c_3);
      uint8_t LCD_c_4[8] =          // LCD-Character 4
        { 0,  0,  0,  0, 31, 31, 31,  31 };
      lcd_generatechar(LCD_GC_CHAR4, LCD_c_4);
      uint8_t LCD_c_5[8] =          // LCD-Character 5
        { 0,  0,  0, 31, 31, 31, 31,  31 };
      lcd_generatechar(LCD_GC_CHAR5, LCD_c_5);
      uint8_t LCD_c_6[8] =          // LCD-Character 6
        { 0,  0, 31, 31, 31, 31, 31,  31 };
      lcd_generatechar(LCD_GC_CHAR6, LCD_c_6);
      uint8_t LCD_c_7[8] =          // LCD-Character 7
        { 0, 31, 31, 31, 31, 31, 31,  31 };
      lcd_generatechar(LCD_GC_CHAR7, LCD_c_7);
      return;                       //
     }              // Ende void LCD_SZ1(void)
    // === Ende
    // ============================================================================== =
    
    // ============================================================================== =
    //  Generierung von LCD-Sonderzeichen für DEM162xx, Satz 4 = RETURN
    // ============================================================================== =
      void LCD_SZ4(void)            // LCD-Sonderzeichen, Satz 4, Return, Pfeile etc.
     {                              //   3 Zeichen : 0, 1 und 2
    // - - - - - - - - - - - - - - - -
    //      Returnzeichen
      uint8_t LCD_c_0[8] = {     // LCD-Character 0 => RETURN
            0b00000000,     //  -----
            0b00000010,     //  ---X-
            0b00000001,     //  ----X
            0b00000101,     //  --X-X
            0b00001001,     //  -X--X
            0b00011110,     //  XXXX-
            0b00001000,     //  -X---
            0b00000100      //  --X--
            };
      lcd_generatechar(LCD_GC_CHAR0, LCD_c_0);
    // - - - - - - - - - - - - - - - -
    //      Pfeil auf
      uint8_t LCD_c_1[8] = {     // LCD-Character 1 => Pfeil-auf
            0b00000000,     //  -----
            0b00000000,     //  -----
            0b00000100,     //  --X--
            0b00001110,     //  -XXX-
            0b00010101,     //  X-X-X
            0b00000100,     //  --X--
            0b00000100,     //  --X--
            0b00000000      //  -----
            };
      lcd_generatechar(LCD_GC_CHAR1, LCD_c_1);
      
    // - - - - - - - - - - - - - - - -
    //      Pfeil ab
      uint8_t LCD_c_2[8] = {     // LCD-Character 2 => Pfeil-ab
            0b00000000,     //  -----
            0b00000000,     //  -----
            0b00000100,     //  --X--
            0b00000100,     //  --X--
            0b00010101,     //  X-X-X
            0b00001110,     //  -XXX-
            0b00000100,     //  --X--
            0b00000000      //  -----
            };
      lcd_generatechar(LCD_GC_CHAR2, LCD_c_2);
      
    // - - - - - - - - - - - - - - - -
    //      Plus-Minus  ±
      uint8_t LCD_c_3[8] = {     // LCD-Character 3 => ±
            0b00000000,     //  -----
            0b00000100,     //  --X--
            0b00001110,     //  -XXX-
            0b00000100,     //  --X--
            0b00000000,     //  -----
            0b00001110,     //  -XXX-
            0b00000000,     //  -----
            0b00000000      //  -----
            };
      lcd_generatechar(LCD_GC_CHAR3, LCD_c_3);
      
    // - - - - - - - - - - - - - - - -
    //      Doppelpfeil ´ schräg linksunten<=>rechtsoben
      uint8_t LCD_c_4[8] = {     // LCD-Character 4 => Pfeil-lu-ro
            0b00000000,     //  -----
            0b00000111,     //  --XXX
            0b00000011,     //  ---XX
            0b00010101,     //  X-X-X
            0b00011000,     //  XX---
            0b00011100,     //  XXX--
            0b00000000,     //  -----
            0b00000000      //  -----
            };
      lcd_generatechar(LCD_GC_CHAR4, LCD_c_4);
      
    // - - - - - - - - - - - - - - - -
    //      linke Hälfte Copyright  ©
      uint8_t LCD_c_5[8] = {     // LCD-Character 5 => © linke Hälfte
            0b00000011,     //  ---XX
            0b00000100,     //  --X--
            0b00001001,     //  -X--X
            0b00001010,     //  -X-X-
            0b00001010,     //  -X-X-
            0b00001001,     //  -X--X
            0b00000100,     //  --X--
            0b00000011      //  ---XX
            };
      lcd_generatechar(LCD_GC_CHAR5, LCD_c_5);
      
    // - - - - - - - - - - - - - - - -
    //      Rechte Hälfte Copyright  ©
      uint8_t LCD_c_6[8] = {     // LCD-Character 6 => © rechte Hälfte
            0b00011000,     //  XX---
            0b00000100,     //  --X--
            0b00010010,     //  X--X-
            0b00000010,     //  ---X-
            0b00000010,     //  ---X-
            0b00010010,     //  X--X-
            0b00000100,     //  --X--
            0b00011000      //  XX---
            };
      lcd_generatechar(LCD_GC_CHAR6, LCD_c_6);
      
    // - - - - - - - - - - - - - - - -
    //      Rechte Hälfte Copyright  ©
      uint8_t LCD_c_7[8] = {     // LCD-Character 7 => Delta 
            0b00000000,     //  -----
            0b00000100,     //  --X--
            0b00000100,     //  --X--
            0b00001010,     //  -X-X-
            0b00001010,     //  -X-X-
            0b00010001,     //  X---X
            0b00011111,     //  XXXXX
            0b00000000      //  -----
            };
      lcd_generatechar(LCD_GC_CHAR7, LCD_c_7);
      return;                       //
     }              // Ende void LCD_SZ4(void)
    // === Ende
    // ============================================================================== =

    Dazu noch der Zappelphilip-Testloop aus dem Video - und im Code sieht man, dass so ein Sonderzeichensatz auch mittendrin einfach neu generiert wird.

    Code:
      LCD_SZ1 ();                   // Eigene Sonderzeichen generieren, Satz 1      kal
      for ( u8 ll=1; ll<16; ll++ )  // Zappelphilip-Testloop
      {                             //
        SetCursor (2, 5);
        if ( llptr <  8 ) lcd_data ( llptr );
        if ( llptr == 8 ) lcd_data ( 255 );
        if ( llptr == 8 ) wms (  200);
        llptr  = llptr  + llinc;
        if ( llptr == 8 ) llinc = -1;
        if ( llptr == 1 ) llinc =  1;
        wms (   40);
      }             // Ende for ( u8 ll=1; ll<16; ll++ )
      LCD_SZ4 ();                   // Eigene Sonderzeichen generieren, Satz 4      kal
    Ciao sagt der JoeamBerg

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    73
    Beiträge
    1.175
    Blog-Einträge
    1
    Hallo OllG !

    nein jetzt ärger ich mich am Arduino Code, aber ich habe ja nicht nur Arduino Boards also werde ich schon mich auch in C abplagen damit, nur sehe zwar wie du da Zeichen erstellst, aber sowas wie :
    lcd_generatechar(LCD_GC_CHAR6, LCD_c_6);
    sind für mich böhm'sche oder auch bayrische Berge
    Sö ähnlich kenn ich das Erstellen von Icons für GEOS unter C64 in ASSR...mit der "binären Zeichnung" aus 0 und 1...
    Habe hier nur noch nicht recht kapiert wie ich die einzelnen Bitfolgen ans LCD senden muss...aber das macht mich jetzt erst mal nicht ärgerlich. Bei meinem Projekt habe ich ein Arduino und kann dan später in reinem C und dem STK500 mir den Kopf zermartern...
    Ich habe ja auch noch ein anderes LCD Display bestellt, so Handyähnlich, wer weiss wie ich da dann progranmmieren muss, aber jetzt reicht erst mal dies was ich habe um alles anzuzeigen, vorerst mal...

    Gruss und Dank
    Gerhard
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

Ähnliche Themen

  1. Wie LCD Modul befestigen?? Und woher Orangenes LCD??
    Von astro9481 im Forum Konstruktion/CAD/3D-Druck/Sketchup und Platinenlayout Eagle & Fritzing u.a.
    Antworten: 5
    Letzter Beitrag: 30.10.2007, 07:28
  2. Tiny26 ADc servo LCD funzt aber?
    Von magic33 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 20.02.2007, 12:21
  3. programmiere I²C-LCD, funktioniert aber nicht immer
    Von Skynet im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 6
    Letzter Beitrag: 31.10.2006, 18:53
  4. LCD geht in Bascom, in C aber nicht
    Von R2D3212 im Forum C - Programmierung (GCC u.a.)
    Antworten: 7
    Letzter Beitrag: 05.08.2006, 20:12
  5. Schrittmotoransteuerung aber wie??
    Von Elektronikus im Forum Motoren
    Antworten: 5
    Letzter Beitrag: 01.02.2005, 13:36

Berechtigungen

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

Solar Speicher und Akkus Tests