GLCD T6963

Gast #149002
Lesenswert?
• ▲
▼
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?
Gast #149003
Lesenswert?
• ▲
▼
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
Gast #149004
Lesenswert?
• ▲
▼
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
}
Gast #149007
Lesenswert?
• ▲
▼
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
Gast #149009
Lesenswert?
• ▲
▼
Ä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...
Gast #149010
Lesenswert?
• ▲
▼
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
Gast #149011
Lesenswert?
• ▲
▼
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
Gast #149016
Lesenswert?
• ▲
▼
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.
Gast #149017
Lesenswert?
• ▲
▼
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren