PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD Statusbalkenerstellen, aber wie



oderlachs
28.02.2014, 09:31
Hallo Freunde ,

Die Tomaten sind ausgesät, mein "Garduino" (http://oderlachs.de/gartenwunder/index.html) soll in die in die Version 1.01 (http://robot.oderlachs.de/garduino_wmr/) 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

BMS
28.02.2014, 09:38
Hallo Gerhard,
den Zeichensatz findet man im Datenblatt des HD44780 bzw in http://de.wikipedia.org/wiki/Hd44780#Schrift_und_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

oderlachs
28.02.2014, 10:31
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

BMS
28.02.2014, 12:10
Eine Kurzanleitung, wie neue Zeichen erstellt werden gibt es u.a. hier http://www.lcd-module.de/fileadmin/pdf/doma/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/LiquidCrystalCreateChar#.UxB73qzy1Dk

Grüße, Bernhard

oderlachs
28.02.2014, 13:40
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.

oberallgeier
28.02.2014, 13:48
... 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. (http://www.youtube.com/watch?v=e9BL4yV9dsg&feature=player_embedded) 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*.


// ================================================== ============================ =
// 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.


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

oderlachs
28.02.2014, 17:45
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