Anleitung für S/W Pixel Bitmaps ------------------------------- Das Konsolenprogramm -- bmpsw2havr -- liest eine s/w *.bmp Datei ein und erzeugt auf dem Standardausgabegerät (in aller Regel der Konsole selbst) eine Headerdatei, die den Pixelwerten der Bitmap entspricht. Das Standardausgabegerät kann in eine Datei umgeleitet werden, bspw.: bmpsw2havr girlie.bmp > girlie_avrpix.txt Hierbei entsteht dann eine Textdatei "girlie_avrpix.txt" die durch den AVR-GCC verarbeitet werden kann. Die Textdatei stellt ein einziges Datenarray mit dem Namen -- bmppic -- zur Verfügung. Soll diese Textdatei für einen anderen Controller erzeugt werden, so dürfte die Quelldatei bmpsw2havr.c leicht anpassbar sein ( Anpassung wäre besonders im Bezug auf das Lesen aus einem Array welches im Codespeicher abgelegt ist wichtig). bmpsw2havr.c kann folgenderweise übersetzt werden: (Windows) gcc bmpsw2havr.c -Os -o bmpsw2havr.exe (Linux) gcc bmpsw2havr.c -Os -o bmpsw2havr chmod +x bmpsw2havr Aufrufen mit: ./bmpsw2havr girlie.bmp > girlie_avrpix.txt Der Inhalt der entstandenen Datei ist: static const unsigned char bmppic [] PROGMEM = { 0x54, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ... weitere Bytes Die ersten beiden Bytes geben hier die Dimension des Pixelbitmaps an und weil es nur ein Byte für die X-Dimension und eines für die Y-Dimension gibt, darf ein Pixelbild hier maximal die Ausmaße 256 * 256 Bildpunkte haben. In einem AVR-Programm --------------------- Mit dem Texteditor der Wahl oder der verwendeten IDE wird die erstellte Textdatei in das zu erstellende Programm eingefügt: /* ---------------- sw_pixeldemo.c ---------------- anzeigen eines sw-Pixelbildes auf einem LCD ------------------------------------------------ */ static const unsigned char bmppic [] PROGMEM = { 0x54, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC7, 0xBF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0xC0, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x60, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xDC, 0x30, 0x1C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x70, 0x18, 0x7C, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x7E, 0x0F, 0xEC, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x81, 0x1F, 0xCE, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xBE, 0x0E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x06, 0x27, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x38, 0xF3, 0x86, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x40, 0x0F, 0xC7, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x40, 0x00, 0xC3, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x0E, 0x42, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x78, 0x30, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x04, 0x40, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0xA0, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x38, 0x3F, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0C, 0x47, 0xA0, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x14, 0x0C, 0xE0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x1C, 0x0F, 0xC0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x1C, 0x0F, 0xC0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x4C, 0x07, 0xC0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x38, 0x7F, 0x70, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x02, 0x00, 0x30, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x04, 0x00, 0x18, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x03, 0x00, 0x30, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x30, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x03, 0xE0, 0xC0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x80, 0x00, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x40, 0x00, 0xC0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0xF0, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x30, 0x03, 0xD8, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x18, 0x0C, 0xC0, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1C, 0x31, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x0B, 0xC3, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x0E, 0x02, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x8E, 0x02, 0x3E, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x9E, 0x02, 0x43, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x1B, 0x0E, 0x49, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0xF2, 0x32, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x07, 0x04, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xE8, 0x01, 0x80, 0x00, 0x00 }; ... // für das Anzeigen des Pixelbildchens muss logischerweise ein Display // bereits initialisiert sein. Die folgende Funktion zum Anzeigen eines // Pixelbildes benötigt eine weitere Funktion, die in der Lage ist, // einen einzelnen Bildpunkt auf das Display zu setzen. Sie muß lauten // function putpixel (unsigned char x, unsigned char y, unsigned char f); // Die Argumente der Funktion dürften selbst erklärend sein. // nachfolgende Funktion ist die Funktion, die die Bytes im Header anzeigen // kann. /* ---------------------------------------------------------- SHOWIMAGE Zeigt ein im Flash abgelegtes s/w Bitmap auf einem LCD an. Das Bitmap muss byteweise in Zeilen gespeichert vorliegen Hierbei entspricht 1 Byte 8 Pixel. Bsp.: eine Reihe mit 6 Bytes entsprechen 48 Pixel in X-Achse ox,oy => linke obere Ecke an der das Bitmap angezeigt wird image => das anzuzeigende Bitmap ---------------------------------------------------------- */ void showimage(char ox, char oy, const unsigned char* const image) { int x,y; uint8_t b,bp; uint8_t resX, resY; resX= pgm_read_byte(&(image[0])); resY= pgm_read_byte(&(image[1])); if ((resX % 8) == 0) { resX= resX / 8; } else { resX= (resX / 8)+1; } for (y=0;y< resY;y++) { for (x= 0;x0;bp--) { if (b& 1<