hi, ich versuche gerade einen t6963c mit 240x128 display anzusprechen. das ding ist richtig angeschlossen, steuerbefehle, data und commands schreiben und der statuscheck funktionieren auch. probleme hab ich allerdings noch mit der initialisierung. ich kann zwar den grafikmodus einstellen und sogar den cursor blinken lassen, allerdings haut irgendwas mit den speicherbereichen oder so noch nicht hin - auf jeden fall kann ich keine zeichen ausgeben... weiß jemand, wie das richtig geht? // Cursor Pointer writedata($01); writedata($01); writecmd($21); // Text Home Address writedata($00); writedata($08); writecmd($40); // Text Area Set writedata($1e); writedata($00); writecmd($41); // Graphics Home Address writedata($00); writedata($00); writecmd($42); // Graphics Area Set writedata($1e); writedata($00); writecmd($43); // Mode Set writecmd($80); // OR, internal CG ROM // Display Mode writecmd($97); // Text on, Grafik off, Cursor, Blinken // Cursorgröße writecmd($A7); // 8 Linien groß // Address Pointer writedata($00); writedata($08); writecmd($24); // 'hallo' schreiben writedata($48); writecmd($c0); writedata($41); writecmd($c0); writedata($4c); writecmd($c0); writedata($4c); writecmd($c0); writedata($4f); writecmd($c0); Gruß, David
Hi David, vielleicht hilft dir meine Initialisierung weiter (auch 240x128): // Mode set: use CG ROM, OR text and graphics 0x80 LCDWriteCommand(0x80); // Set text home address to $0000 LCDWriteData(0x00); LCDWriteData(0x00); LCDWriteCommand(0x40); // Set text number of columns to 40. LCDWriteData(40); LCDWriteData(0); LCDWriteCommand(0x41); // Set graphics home address LCDWriteData(0x00); LCDWriteData(0x02); LCDWriteCommand(0x42); // Make sure the number of graphics "columns" is 40 LCDWriteData(40); LCDWriteData(0); LCDWriteCommand(0x43); //Siehe Datenblatt ;-) LCDWriteCommand(0x9C);
hi andreas, danke für die schnelle antwort :). funzt leider trotzdem noch nicht. was machst du denn, um was zu schreiben? ich versuche einfach den address pointer auf den anfang des textbereichs zu setzen, also 00 00 bei deiner init und dann z.b. mit writedata($01) und writecmd($c0) ein ! an diese stelle zu schreiben. das müsste dann ja ganz links oben im lcd erscheinen?!
Meine Funktionen zum Text schreiben: void LCDSetCursor(u08 x, u08 y) { LCDWriteData((30*y+x)&0xFF); LCDWriteData((30*y+x)>>8); LCDWriteCommand(0x24); } void LCDPutc(u08 c) { //Nicht vergessen: 0x20 vom ASCII-Wert abziehen! LCDWriteData(c - 0x20); LCDWriteCommand(0xC0); } Wenn es damit nicht funktioniert, liegt es vielleicht an den Schreib/Lese-Befehlen. Bist du sicher dass du das Timing genau einhälst?
Hallo ihr lieben Leute hab' auch ein Problem mit meinem Grafik LCD - wollt allerdings keinen neuen Beitrag aufmachen. Ich hab' auch eine Ansteuerung für mein t6963c Controller geschrieben - das dumme ist: wenn ich ein einziges A sende ist mein ganzes Display voller A's, die alle ganz schnell laufen und plötzlich zu 1sen und Hyroglyphen werden - weiß jemand wie ich mein Display wieder zum stehen bringe???? mfg Christian PS: bei Intresse poste ich meinen Source (vielleicht hilfts ja dem David)
hast du vielleicht den automode angeschaltet? wegen dem source: gerne :)
@andreas: kannst du mir das LCDWriteData((30*y+x)&0xFF); LCDWriteData((30*y+x)>>8); mal genauer erklären? ich kenn mich mit c leider nicht so gut aus... was soll das "(30*y+x)&0xFF" ("&" ??) und warum machst du danach ein bitshift um 8 nach rechts? du rechnest da mit 30 spalten, oder? weil in der initialisierung bist du noch von 40 ausgegangen... beim timing steht in einem tutorial, das ich hier hab, dass man beim lesen oder schreiben von daten 80 oder 150 ns warten muss. ich warte an den stellen eigentlich immer 1ms. muss man sonst noch irgendwo warten? vielleicht kannst du mir ja mal deinen source code schicken. mein writedata und writecmd stehen unten, die müssten doch eigentlich stimmen?! const port : dword = $0378; WR_Lo : byte = $01; // 0000 0001 take PC 1 Lo Strobe WR WR_Hi : byte = $fe; // 1111 1110 take PC 1 Hi Strobe WR CE_Lo : byte = $02; // 0000 0010 take PC 14 LO Autofeed CE CE_Hi : byte = $fd; // 1111 1101 take PC 14 HI Autofeed CE CD_Lo : byte = $fb; // 1111 1011 take PC 16 LO init C/D CD_Hi : byte = $04; // 0000 0100 take PC 16 HI init C/D RD_Lo : byte = $08; // 0000 1000 take PC 17 LO SLCT IN RD RD_Hi : byte = $f7; // 1111 0111 take PC 17 Hi SLCT IN RD procedure tform1.writedata(data: byte); begin while (readstatus <> 3) do begin end; // auf ready warten portwriteb(port+2, ONE_DIRECT_PORT); // direktionaler Port portwriteb(port, data); // Daten schreiben portwriteb(port+2, CD_Lo); // Data Read/Write portwriteb(port+2, CE_Lo); // Chip aktivieren portwriteb(port+2, WR_Lo); // Schreibmodus aktivieren sleep(1); // mind. 80ns warten portwriteb(port+2, CE_Hi); // Chip deaktivieren portwriteb(port+2, WR_Hi); // Schreibmodus deaktivieren end; procedure tform1.writecmd(cmd: byte); begin while (readstatus <> 3) do begin end; // auf ready warten portwriteb(port+2, ONE_DIRECT_PORT); // direktionaler Port portwriteb(port, cmd); // Command schreiben portwriteb(port+2, CD_Hi); // Command/Status portwriteb(port+2, CE_Lo); // Chip aktivieren portwriteb(port+2, WR_Lo); // Schreibmodus aktivieren sleep(1); // mind. 80ns warten portwriteb(port+2, CE_Hi); // Chip deaktivieren portwriteb(port+2, WR_Hi); // Schreibmodus deaktivieren end; gruß, david
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.