GLCD mit Text beschreiben

Hemi

Aktives Mitglied
Premium Benutzer
30. Nov. 2008
1.103
19
38
Korntal-Münchingen, Germany
Sprachen
  1. ANSI C
  2. C++
  3. PHP
  4. Java
Hallo zusammen,

ich habe ein DOGL128 GLCD da. Das Ding funktioniert 1A, ich kann Linien zeichnen, Kreise und alles mögliche.

Nun, wie funktioniert das mit dem Text? Muss man die Pixel einzeln setzen bei den Buchstaben? Oder wie funktioniert das?

Kann mir jemand auf die Sprünge helfen? Ich habe mir npaar Beispielimplementierungen angeschaut, aber irgendwie verstehe ich nicht, was da gemacht wird.

Meine Library kann ich zur Verfügung stellen, falls Interesse besteht.

Danke & Grüsse
Heinrich
 
Hallo Heinrich!

Ich habe zwar selbst noch nicht mit dem DOG128 gearbeitet und ich denke mal, dass du bei dem Display auch eine Fontdatei einbinden musst.


Kannst es ja mal ausprobieren mit:

Einmal die Fontdatei auswählen (z.B. die 8x8 Pixel Font).
Dies kannst du oben einmal im Programm machen, wenn du nur die eine Schrift möchtest.
Oder auch mitten im Programm ändern.... falls du mal größere Buchstaben benötigst. ;)
Code:
....
Setfont Font8x8

.....

Lcdat 1 , 1 , "Hallo Hemi"


Nach dem "End" des Programms musst du die Fontdateien dann noch mit einem "$include" einbinden.
Code:
.....
Loop


End

$include "font8x8.font"

$include "font16x16.font"

Die Fontdateien befinden sich bei BASCOM im Verzeichnis:
.....\BASCOM-AVR\SAMPLES\LCDGRAPH
Von dort aus musst du die Dateien dann in das selbe Verzeichnis kopieren, in dem sich dein Programm befindet.
Anderenfalls bekommst du eine Fehlermeldung, weil das "include" die Datei(en) nicht findet. ;)

Ich hoffe, es funktioniert bei einem DOG128 auch auf diese Weise. :)

Gruß,
Cassio
 
Hallo Cassio,

danke für die Hilfte erstmal. Leider habe ich nichts mit Bascom am Hut :(

Ich war die Tage nicht untätig und habe herumprobiert. Das Ergebnis ist im Anhang. Diese senkrechte Linie ist nicht gewollt. Und das Dumme ist, ich finde nicht, wo sie herkommt.

Hier sind die Ausschnitte aus dem Projekt:

Mein Font:

Code:
unsigned char PROGMEM HeaderFont[] =  {
		0xF6, 0x01, 0x0E, 0x08, 0x01, 0x1A, 0x7F,
		    0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00, 0x03, 0x05, 0x00, 0x07, 0x07, 0x0D, 0x03, 0x03,
		    0x00, 0x05, 0x01, 0x04, 0x01, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
		    0x03, 0x00, 0x00, 0x04, 0x04, 0x04, 0x00, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x03,
		    0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
		    0x05, 0x00, 0x05, 0x00, 0x03, 0x04, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x02, 0x04, 0x04, 0x01,
		    0x02, 0x04, 0x01, 0x05, 0x04, 0x04, 0x04, 0x04, 0x03, 0x04, 0x02, 0x04, 0x04, 0x05, 0x04, 0x04,
		    0x04, 0x05, 0x05, 0x01, 0x04, 0x05,
		    0x7E, 0x09, 0x09, 0x7E, 0x7F, 0x49, 0x49, 0x36, 0x3E, 0x41, 0x41, 0x22, 0x7F, 0x41, 0x22, 0x1C,
		    0x7F, 0x49, 0x49, 0x41, 0x7F, 0x09, 0x09, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x14, 0x7F,
		    0x14, 0x7F, 0x14, 0x02, 0x25, 0x12, 0x08, 0x24, 0x52, 0x20, 0xC3, 0xA5, 0xD9, 0xB9, 0xD9, 0xA5,
		    0xC3, 0x7C, 0x28, 0x6C, 0x45, 0x87, 0x81, 0x87, 0x85, 0xE8, 0x28, 0x6C, 0x44, 0x7C, 0x1C, 0x22,
		    0x41, 0x41, 0x22, 0x1C, 0x08, 0x08, 0x3E, 0x08, 0x08, 0xC0, 0x08, 0x08, 0x08, 0x08, 0x40, 0x60,
		    0x1C, 0x03, 0x3E, 0x41, 0x41, 0x3E, 0x04, 0x02, 0x7F, 0x00, 0x62, 0x51, 0x49, 0x46, 0x22, 0x49,
		    0x49, 0x36, 0x1F, 0x10, 0x7E, 0x10, 0x27, 0x45, 0x45, 0x39, 0x3E, 0x49, 0x49, 0x32, 0x01, 0x71,
		    0x09, 0x07, 0x36, 0x49, 0x49, 0x36, 0x26, 0x49, 0x49, 0x3E, 0x00, 0x24, 0x00, 0x14, 0x14, 0x14,
		    0x14, 0x41, 0x22, 0x14, 0x08, 0x02, 0x51, 0x09, 0x06, 0x7E, 0x09, 0x09, 0x09, 0x7E, 0x7F, 0x49,
		    0x49, 0x49, 0x36, 0x3E, 0x41, 0x41, 0x41, 0x22, 0x41, 0x7F, 0x41, 0x41, 0x3E, 0x7F, 0x49, 0x49,
		    0x49, 0x41, 0x7F, 0x09, 0x09, 0x09, 0x01, 0x3E, 0x41, 0x41, 0x49, 0x7A, 0x7F, 0x08, 0x08, 0x08,
		    0x7F, 0x41, 0x7F, 0x41, 0x20, 0x40, 0x40, 0x3F, 0x7F, 0x08, 0x14, 0x22, 0x41, 0x7F, 0x40, 0x40,
		    0x40, 0x40, 0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x7F, 0x02, 0x0C, 0x10, 0x7F, 0x3E, 0x41, 0x41, 0x41,
		    0x3E, 0x7F, 0x09, 0x09, 0x09, 0x06, 0x3E, 0x41, 0x51, 0x61, 0xBE, 0x7F, 0x09, 0x19, 0x29, 0x46,
		    0x26, 0x49, 0x49, 0x49, 0x32, 0x01, 0x01, 0x7F, 0x01, 0x01, 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x03,
		    0x1C, 0x60, 0x1C, 0x03, 0x1F, 0x60, 0x3C, 0x60, 0x1F, 0x63, 0x14, 0x08, 0x14, 0x63, 0x03, 0x04,
		    0x78, 0x04, 0x03, 0x61, 0x51, 0x49, 0x45, 0x43, 0x08, 0x08, 0x3E, 0x1C, 0x08, 0x3E, 0x1C, 0x08,
		    0x40, 0x40, 0x40, 0x40, 0x1C, 0x1C, 0x00, 0x20, 0x54, 0x54, 0x78, 0x7F, 0x44, 0x44, 0x38, 0x38,
		    0x44, 0x44, 0x28, 0x38, 0x44, 0x44, 0x7F, 0x38, 0x54, 0x54, 0x18, 0x7E, 0x09, 0x98, 0xA4, 0xA4,
		    0x7C, 0x7F, 0x08, 0x04, 0x78, 0x7D, 0x80, 0x7D, 0x7F, 0x10, 0x28, 0x44, 0x7F, 0x7C, 0x04, 0x7C,
		    0x04, 0x78, 0x7C, 0x04, 0x04, 0x78, 0x38, 0x44, 0x44, 0x38, 0xFC, 0x24, 0x24, 0x18, 0x18, 0x24,
		    0x24, 0xFC, 0x7C, 0x08, 0x04, 0x48, 0x54, 0x54, 0x24, 0x3E, 0x44, 0x3C, 0x40, 0x40, 0x7C, 0x1C,
		    0x60, 0x60, 0x1C, 0x1C, 0x60, 0x18, 0x60, 0x1C, 0x6C, 0x10, 0x10, 0x6C, 0x9C, 0xA0, 0xA0, 0x7C,
		    0x64, 0x54, 0x54, 0x4C, 0x08, 0x0C, 0x7E, 0x0C, 0x08, 0x10, 0x30, 0x7E, 0x30, 0x10, 0x00, 0x06,
		    0x09, 0x09, 0x06, 0x04, 0x04, 0x00, 0x02, 0x0F, 0x00
};

Hier ist die Funktion, die den Fon lädt:

Code:
void glcd_fontInit (unsigned char *ptr) {
	glcd.Char_First  = pgm_read_byte(&((TFONTHEAD *)ptr)->Font_FirstChar);
	glcd.Char_Last   = pgm_read_byte(&((TFONTHEAD *)ptr)->Font_LastChar);
	glcd.Font_Height = pgm_read_byte(&((TFONTHEAD *)ptr)->Font_Height);

	glcd.fontwidth = ptr + sizeof(TFONTHEAD);
	glcd.fontdata =   glcd.fontwidth + (glcd.Char_Last - glcd.Char_First + 1);

	glcd.xPos = 0;
	glcd.yPos = 0;
	glcd.xMax = 131;
}

Und hier die Funktion, die den Text (einen Buchstaben) ausgibt:

Code:
void glcd_fontPrintChar (char c) {
	unsigned char x, y, i = 0;
	unsigned int idx = 0;
	unsigned char BitCount;
	unsigned char width = glcd_fontCharWidth(c);
	unsigned char FData;
	unsigned char tx, ty;

	if(width == 0) {
		return;
	}

	if((glcd.xPos + width) > glcd.xMax) {
		return;
	}

	c -= glcd.Char_First;

	while(i < c) {
		idx += pgm_read_byte(&glcd.fontwidth[i++]);
	}

	idx = idx * glcd.Font_Height;

	BitCount = idx & 0x07;
	idx >>= 3;
	FData = pgm_read_byte(&glcd.fontdata[idx++]) >> BitCount;

	for(x = 0; x < width; x++) {
	    for(y = 0; y < glcd.Font_Height; y++) {
	      if(BitCount > 7) {
	        FData = pgm_read_byte(&glcd.fontdata[idx++]);
	        BitCount = 0;
	      }
	      if(FData & 0x01) {
	    	  tx = glcd.xPos + x;
	    	  ty = glcd.yPos + y;
	    	  glcd_drawPixel(tx, ty);
	      }
	      FData >>= 1;
	      BitCount++;
	    }
	}
	glcd.xPos += width + 1;
}

TFONTHEAD und glcd sind wie folgt definiert:

Code:
typedef struct {
  unsigned char  Font_Size_Lo;       // Font size in Bytes LOW
  unsigned char  Font_Size_Hi;       // Font size in Bytes HIGH
  unsigned char  Font_Width;         // Font Width in Pixels
  unsigned char  Font_Height;        // Font Height in Pixels
  unsigned char  Font_BitsPerPixels; // Font Bits per Pixels (nur 1 erlaubt)
  unsigned char  Font_FirstChar;     // Font first char
  unsigned char  Font_LastChar;      // Font last char
} TFONTHEAD;

typedef struct {
	unsigned char myBuffer[GLCD_HEIGHT][GLCD_PAGES];
	unsigned char Char_First;
	unsigned char Char_Last;
	unsigned char Font_Height;
	unsigned char *fontwidth;
	unsigned char *fontdata;
	unsigned char xPos;
	unsigned char xMax;
	unsigned char yPos;
} STGLCD;

Sieht jemand vielleicht auf Anhieb den Fehler.

EDIT: Ich bin ein Idiot. Wenn man schon das Abbild vom Display in den Speicher legt, sollte man es doch auch mal richtig definieren und nicht mit 64 Byte x 8 Pages, sondern 128 Byte x 8 Pages.

EDIT2: Wenn Interesse besteht, kann ich das gesamte Projekt (Hardware + Library) zur Verfügung stellen.

Danke & Grüsse
Heinrich
 

Anhänge

  • glcd.jpg
    glcd.jpg
    65,4 KB · Aufrufe: 28
  • glcd2.jpg
    glcd2.jpg
    83,3 KB · Aufrufe: 29
danke für die Hilfte erstmal. Leider habe ich nichts mit Bascom am Hut :(

Hallo Heinrich!

Wie kam ich nur darauf, dass du mit BASCOM.......

OK, Schwamm drüber!
So langsam komme ich hier wohl durcheinander. :rolleyes: ;)

Vielleicht sollte jeder User mindestens ein farbiges Fähnchen an sein Profil bekommen.....
Rot=ASM, Blau=C und Grün=BASCOM....... oder so ähnlich. :)
Eine Möglichkeit wäre ja noch, es in der Signatur mit zu vermerken. :hmmmm:

Ist aber schön zu lesen, dass du den Fehler dann doch selbst entdeckt hast.
Manchmal sind es eben Kleinigkeiten, die einen das Leben schwer machen. ;)

Viel Spaß weiterhin,
Cassio
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)