SprinterSB
18.02.2007, 12:46
Nö, teilweise arbeite ich dann direkt auf der Datei (bmp) und lasse die dann anzeigen, wenn ich spezielle Grafiken erzeuge.
Was du ja wohl schon hast, ist einen Pixel zu malen. Falls nicht, kümmer dich um diese Basics bevor du ein komplettes Bild pinseln willst. Das ist eigentlich alles, was du brauchst...
Das bmp als C-Header zu haben ist nicht so toll, das würde ja bedeuten, daß du entweder die Grafik hart ins Programm reincompilierst oder aber zur Laufzeit den C-Header interpretieren musst.
Zweiteres ist zu vermeisen, ersteres evtl dann angebracht, wenn es sich um immer gleiche Bildchen wie feste Icons handelt, aber ineffizient ist das auch.
Am besten ist, wenn du die bmp irgendwoher binär beziehst (SPI, UART, I2C, Flash, EEPROM, XRAM, ...). Zuerst liest du die Kopfdaten ein (bmih, bmfh) und danach die eigentlichen Bilddaten (Palette + Pixel). Dabei brauchst du das Bild nicht komplett einzulesen, sondern kannst ja pixelweise einlesen/aufs GLCD ausgeben und brauchst den Wust von Daten nicht im µC (zwischen)zuspeichern, wofür der Platz eh nicht reichen würde.
hallo,
hab jetzt noch mal die glcd-libs von avrlibs hergenommen.
darin gibts eine funktion die heißt:
void glcdWriteCharGr(u08 grCharIdx)
{
u08 idx;
u08 grLength;
u08 grStartIdx = 0;
// get starting index of graphic bitmap
for(idx=0; idx<grCharIdx; idx++)
{
// add this graphic's length to the startIdx
// to get the startIdx of the next one
grStartIdx += pgm_read_byte(FontGr+grStartIdx);
}
grLength = pgm_read_byte(FontGr+grStartIdx);
// write the lines of the desired graphic to the display
for(idx=0; idx<grLength; idx++)
{
// write the line
glcdDataWrite(pgm_read_byte(FontGr+(grStartIdx+1)+ idx));
}
}
leider weiß ich nicht was "u08 grCharIdx" sein soll...
eine grafik die dabei ist, sieht so aus:
#ifndef FONTGR_H
#define FONTGR_H
#ifndef WIN32
// AVR specific includes
#include <avr/pgmspace.h>
#endif
static unsigned char __attribute__ ((progmem)) FontGr[] =
{
// format is one character per line:
// length, byte array[length]
0x0B,0x3E,0x41,0x41,0x41,0x41,0x42,0x42,0x42,0x42, 0x3C,0x00,// 0. Folder Icon
0x06,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF // 1. Solid 6x8 block
};
#endif
würd mich über weitere hilfe sehr freuen!!
viele grüße,
manu
2x KS, das sind dann irgendwas um die 64 x 128, richtig?
ich ab gar keine Highlevelbefehle verwendet, sondern hab
eben die Grafik bit für bit zusammengesetzt.
Der Haken ist, dass 8Bit also 1 Byte immer geschrieben wird
und damit eben 8 Pixels gesetzt werden.
Du hast dann 2 Optionen, du schreibst immer eine Zeile durch,
gehst dann zurück zum ausgangspunkt, liest dann wieder die
bytes zurück und setzt die nächsten Linienpunkte, bis dann die
Page wieder durch ist, dann wechsel zur nächsten Page usw. usw.
zu beachten ist, dass Du in der Mitte des Displays eben den CS
wechseln musst ... ist etwas knifflig, aber geht.
Die andere Variante ist, das Du im RAM die Zeilen durchspringst
um das Byte zusammenzusetzen, das spart das rücklesen, ist
dadurch schneller ...
aber mal was Anderes, wo speicherst du die Displaydaten zwischen?
Aber erwarte nicht zu viel von der Graphik, es geht nur
1-Bit, also über Schwellenwert Bit setzen, darunter Bit löschen, also
den Grafikdot versteht sich.
mal schaun, ich schick später mal Bilder nach wie das bei mir aussieht.
ja das display ist 128x64.
habs jetzt endlich geschafft mal die beispiel grafik auszugeben! :)
musste glcdWriteCharGr(1024); schreiben
static unsigned char __attribute__ ((progmem)) FontGr[] =
{
// format is one character per line:
// length, byte array[length]
0x0B,0x3E,0x41,0x41,0x41,0x41,0x42,0x42,0x42,0x42, 0x3C,0x00,// 0. Folder Icon
0x06,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF // 1. Solid 6x8 block
};
leider wars das auch schon. andere grafiken mag er nicht, so wie diese hier:
static unsigned char __attribute__ ((progmem)) grafik[] = {
0x42,0x4D,0xBE,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3E,0x00,0x00,0x00,0x28,0x00,
0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00, 0x01,0x00,0x01,0x00,0x00,0x00,
0x00,0x00,0x80,0x00,0x00,0x00,0xC4,0x09,0x00,0x00, 0xC4,0x09,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xFF,0xFF,0xFF,0x00,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xE0,0xFF,0xFF,0xFF,0xDF,0x7F,
0xFF,0xFF,0xBF,0xBF,0xFF,0xFF,0xB1,0xBF,0xFF,0xFF, 0xB1,0xBF,0xFF,0xFF,0xBF,0xBF,
0xFF,0xFF,0xDF,0x7F,0xFF,0xFF,0xEE,0xFF,0xFF,0xFF, 0xEE,0xFF,0xFF,0xFF,0xEE,0xFF,
0xFF,0xFF,0xE0,0xFF,0xFF,0xFF,0xEE,0xFF,0xFF,0xFF, 0xEE,0xFF,0xFF,0xFF,0xEE,0xFF,
0xFF,0xFF,0xE0,0xFF,0xFF,0xFF,0xEE,0xFF,0xFF,0xFF, 0xEE,0xFF,0xFC,0x1F,0xEE,0xFF,
0xF8,0x1F,0xE0,0xFF,0xF3,0xFF,0xEE,0xFF,0xF3,0xFF, 0xEE,0xFF,0xF3,0xFF,0xEE,0xFF,
0xF3,0xFF,0xE0,0xF0,0x33,0xFF,0xEE,0xF0,0x33,0xFF, 0xEE,0xF3,0x33,0xFF,0xEE,0xF3,
0x38,0x1F,0xF1,0xF0,0x3C,0x1F,0xFF,0xF0,0x3F,0xFF, 0xFF,0xFF,0xFF,0xFF,0x00
};
jemand noch ne idee dazu? warum geht die erste und die zweite nicht?
viele grüße
manu
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.