Guten Morgen!
Ich möchte mit diesem Diplay eine Grafik (Bitmap) darstellen.
Ich konvertiere das RAW File mit dem Tool BIN2C.
Leider weiss ich nicht wie ich jetzt meinem Display erklären soll, dass
er blockweise die Pixel drstellen lassen soll.
Hat jemand für so was schon einen C-Code?
Da gibt es zwei Möglichkeiten:
A: Die Grafikdatei einlesen, die einzelnen Bits herausisolieren und je
nachdem einen Pixel auf dem Display setzen.
Vorteil: Die Grafik kann Pixelgenau gesetzt werden.
Nachteil: Langsam.
B: Die Grafikdatei Byteweise übertragen. Das T6963 ist Byteweise
organisiert (s.Datenblatt, da ist das sehr schön erklärt).
Vorteil: Wesentlich schneller.
Nachteil: Kann nicht (oder nur mit Aufwand) Pixelgenau gesetzt werden.
Software: Schau mal bei Holger Klabunde vorbei, er hat C-Code für das
T6963-Display auf seiner Homepage:
http://home.t-online.de/home/holger.klabunde/avr/avrboard.htm
Man kann die Schriftgröße beim T6963 Display Controller per Hardware
einstellen, z.B. 6x8 Pixel pro Buchstabe oder 8x8 usw. Das wirkt sich
auf die Grafik so aus, dass bei 6x8 Pixel auch nur 6 Bits eines Bytes
verwendet werden, um Grafik darzustellen. D.h. um acht Pixel
darzustellen, brauchst du 1 volles Byte für die ersten 6 Pixel, und 2
Bits vom nächsten Byte.
Daher die Anpassung mit dem #ifdef.
Gruß Ralf
Ähm, Schwarz, bitte nicht böse sein, aber wenn Du den Code von Holger
nicht verstehst, dann wirst Du auch keinen anderen Code verstehen. Viel
einfacher und universeller gehts kaum. Ich würde Dir empfehlen, Dich
erst einmal mit den Grundlagen des Controllers und der Sprache C
vertraut zu machen - insbesondere die Besonderheiten von C auf
µControllern - und dann, mit genügend Hintergrundwissen, kann man sich
an die Königsklasse "Grafik-LCD" wagen.
Schließlich kannst Du ja auch nicht direkt nach dem Führerschein einen
Formel-1 Wagen fahren...
Hi Schwarz,
du musst den Beginn des Grafik-Bereichs im Display-RAM festlegen.
Danach den Adress-Pointer des Displays auf eben diesen RAM-Bereich
setzen. Dann kannst du 8 Pixel jeweils auf einmal setzen, indem du
einfach das entsprechende Byte dorthin schreibst.
Prinzipiell lässt sich sagen, dass der RAM auf dem Display = den
angezeigten Pixeln entspricht.
Nicht vergessen, den Grafik-Modus anzuschalten.
Angaben dazu findest du im Datenblatt zum Display bzw. zum T6963.
Gruß Ralf
In der Funktion "LoadBitmap" steht dieser Ausdruck
--> by=PRG_RDB(bitmap);
PRG_RDB kann ich aber nirgends finden. Was bedeutet PRG_RDB?
Wenn der Code ausgeführt wird, wird dieser Abschnitt nicht
ausgeführt,oder?
#endif //#ifdef PIXPERBYTE_8
mask=0x80; //Fängt bei MSB an
for(k=0; k<8; k++) //Über ein Byte
{
//Nur vorhandene und keine Füllpixel,-bytes zeichnen
if(xp < (unsigned char)xend)
{
SetPixel(xp,yp,(by & mask) );
xp++;
}
mask>>=1; //Nächstes Bit
}//for k
PRG_RDB ist ein AVR-spezifischer Ausdruck, der einen Byte-Wert aus dem
Flash-ROM liest. Das hat mit der Harvard-Architektur der ARs zu tun.
Wieso sollte der Abschnitt nicht ausgeführt werden?
Ich verwende CodeVisionAVR. Das kann ich nicht "PRG_RDB" benutzen.
Wie müsste ich dann den Ausdruck bei CodeVisionAVR
"by=PRG_RDB(bitmap);" abändern?
Vielleicht so:
by = bitmap[i];
i++;
PRG_RDB ist nur dann erforderlich, wenn konstante Daten aus dem
Flash-ROM gelesen werden sollen. Sollte die Bitmap im RAM liegen,
einfach
by = *bitmap;
schreiben.
(bitmap ist ein Pointer, der anderswo in der Schleife inkrementiert
wird, daher ist kein Array-Zugriff à la bitmap[i] erforderlich),
Auf welche Art und Weise man Bytes aus dem Code-Speicher Deines
Prozessors extrahieren kann, sollte im Handbuch Deines Compilers
stehen.
Und wie muss ich dann dies hier schreiben? --> bitmap++
Kann ich da dann auch *bitmap++ schreiben?
Das Display zeigt nurSchrott bei mir an, anstatt ein Bild.
Meinen Code habe ich auf 8x8 eingestellt.