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.