Forum: Mikrocontroller und Digitale Elektronik Probleme mit T6963 Display


von Christoph Hess (Gast)


Lesenswert?

Hi,

ich habe ein display vom Typ T6963 an einen AVR angeschlossen. Es
funktioniert ja auch schon so weit ganz gut.
Z.B. möchte ich ein Pixel bzw. meherer Pixel löschen können.
Das mit dem Pixel setzen funktioniert auch super nur die Routine
ClearPixel funktioniert nicht.


void LCD_PutPixel(unsigned char x, unsigned char y, unsigned char Set)
{
unsigned int XY;
unsigned char bitByte;

  XY=0x0000;
  XY=XY+(y*22);
  XY=XY+(x/6);


       out(0x24, XY & 0x00FF, XY>>8);
  bitByte=5-(x % 6);

  if (0 != Set)
   {
          bitByte |= 0xF8;
         }
        else
         {
          bitByte|=0xF0;
         }

  out(bitByte, 0, 0);    //0b1111SXXX , s is set/reset, xxx is bit 
number
xxx
          //(Each memorybyte i six graphics bits (pixels))
}

void lcd_clear_pixel(unsigned char x, unsigned char y)
{
unsigned int XY;
unsigned char bitByte;
unsigned char data;

  XY=0x0000;
  XY=XY+(y*22);
  XY=XY+(x/6);


       out(0x24, XY & 0x00FF, XY>>8);
  data = 5-(x % 6);


    /* Read existing display */
    out(0xC5,0,0);
    data = (~data) & read_data();

    /* Write modified data */
    out(0xC0,0,data);
}

von Christoph Hess (Gast)


Lesenswert?

Gibt es im Forum jemand der schon einmal eine C Routine für Pixel
löschen geschrieben hat?

von thkais (Gast)


Lesenswert?

Die Frage ist wahrscheinlich, ob Deine "read_data" Subroutine
funktioniert, vielleicht wird auch einfach die falsche Speicherstelle
gelesen.
Ich würde hierzu den Speicher des Displays mit einem Muster
beschreiben, und schauen, ob das herauskommt, was erwartet wird.

von Marko B. (Gast)


Lesenswert?

Benutz doch einfach den "Bit Set/Reset" Befehl des T6963. Dann mußt Du
auch vorher nichts vom Display lesen um ein Bit zu löschen. So wie du es
jetzt machst ist es etwas umständlich.

von Christoph Hess (Gast)


Lesenswert?

Hallo Marko,

hast du dazu schon eine C Routine geschrieben?

von Marko B. (Gast)


Lesenswert?

Ja, aber ich dachte Du kommst selber drauf. :P
1
/*
2
** set the pixel at x,y
3
*/
4
void lcd_px_set(unsigned int x, unsigned int y)
5
{
6
  lcd_setptr(GFX_START + (y*LINE_LENGTH) + (x/6));  
7
  lcd_wr_cmd(0xf8 | (5-(x % 6)));
8
}
9
10
11
/*
12
** clear the pixel at x,y
13
*/
14
void lcd_px_clr(unsigned int x, unsigned int y)
15
{
16
  lcd_setptr(GFX_START + (y*LINE_LENGTH) + (x/6));  
17
  lcd_wr_cmd(0xf0 | (5-(x % 6)));
18
}

von Christoph Hess (Gast)


Lesenswert?

Hallo Marko,

danke für den Code.
Für was genau steht GFX_START und LINE_LENGTH?

von Marko B. (Gast)


Lesenswert?

GFX_START = Startaddresse des Grafikspeichers, welche mit dem Befehl
"Set Graphic Home" eingestellt wird.

LINE_LENGTH = Zeilenlänge des Displays (z.B. bei einem 128x64 Display
und 6x8 Font: 22).

von Thomas K. (thkais)


Lesenswert?

@Christoph:

Tja, wenn man nur abschreibt, ohne zu verstehen, dann kommt so etwas
raus.
Deine LCD_PutPixel aus dem allerersten Post benutzt bereits die
internen Befehle des T6963. Mit dem letzten Parameter kannst Du sogar
bestimmen, ob der Pixel gesetzt oder gelöscht werden soll.
Ich habe mich zwar gewundert, warum da zwei Subroutines für den
gleichen Zweck stehen, dachte mir aber, daß es einen Sinn haben müßte.
Zuviel gedacht.

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
Noch kein Account? Hier anmelden.