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); }
Gibt es im Forum jemand der schon einmal eine C Routine für Pixel löschen geschrieben hat?
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.
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.
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 | }
|
Hallo Marko, danke für den Code. Für was genau steht GFX_START und LINE_LENGTH?
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).
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.