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
Hei vielen Dank! Ich habe da ne Funktion gefunden. Leider verstehe ich nicht richtig wie die Funktion funktioniert. void LoadBitmap(unsigned char *bitmap,unsigned char xpos , unsigned char ypos, unsigned char width, unsigned char height) { unsigned char bwidth,i,j,k,yp,xp; unsigned char by,mask; unsigned int xend; //xpos + width kann größer als 255 werden xend=(unsigned int)xpos + (unsigned int)width; if(xend>LCD_WIDTH) xend=LCD_WIDTH; //Bitmap abschneiden wenn außerhalb des Displays bwidth=width/8; //Anzahl Bytes horizontal if((width%8)!=0) bwidth++; //Bei Rest noch ein Byte mehr yp=ypos; for(i=0; i<height; i++) //Über die gesamte Höhe { xp=xpos; //Zum Beginn der Zeile for(j=0; j<bwidth; j++) //Über die gesamte Breite in Bytes { by=PRG_RDB(bitmap); #ifdef PIXPERBYTE_8 if((xp % 8 ==0) && (xp < LCD_WIDTH-8)) //Die schnelle Methode { SetPixel(xp,yp,0); WriteData1(by,0xC0); //write 8 pixel with one command xp+=8; } else //Die langsame Methode { #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 #ifdef PIXPERBYTE_8 }//else if((xp % 8 ==0) && (xp <..... #endif bitmap++; } //for j yp++; //Nächste Zeile } //for i }
Hallo thkais ! Welche Methode würdest du mir empfehlen? Was ist leichter und schneller zu realisieren? Hast du ein Beispiel?
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
Hallo Ralf! Weisst du wie man 8Pixel blockweise auf ds Display bekommt. Wie muss ich die C Funktion dazu schreiben?
Ä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++;
Hallo Rufus! Den Ausdruck "PRG_RDB" gibt es bei CodeVisionAVR nicht. Wie kann müsste ich es dort machen?
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.
So Leute nun Ist es geschaft Codevision kann nun auch grafiken wiedergeben.! www.EFichte.de MFG: Fichte
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.