Forum: Mikrocontroller und Digitale Elektronik T6963C mit 240x128 Display


von David Geiger (Gast)


Lesenswert?

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

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

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);

von David Geiger (Gast)


Lesenswert?

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?!

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

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?

von Christian (Gast)


Lesenswert?

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)

von David Geiger (Gast)


Lesenswert?

hast du vielleicht den automode angeschaltet?

wegen dem source: gerne :)

von David Geiger (Gast)


Lesenswert?

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