Hallo, auch ich scheitere, wie so viele vor mir, an der Ansteuerung eines LCDs. Mit Hilfe der bereits existierenden Beiträge im Forum ist schon mal eine prinzipielle Funktion vorhanden. Leider habe ich ein Problem mit dem 2 Zeilen Modus. Ist er erst einmal aktiviert, dann geht nichts mehr. Mit nur einer Zeile läuft es prima, d.h. von den 20x4 Zeichen kann ich die Zeilen 1 und 3 ansprechen. Die Zeilen 2 und 4 bleiben leer. Eigenartig ist auch, dass im 2 Zeilen Mode nach dem flashen per ISP nichts zu sehen ist. Wenn ich per Hand einen Resets auslöse, dann toggelt es zwischen go und no go, wobei wiederum nur 1 und 3 sichtbar ist, 2 und 4 nicht. Kann mir jemand helfen? Wer arbeitet erfolgreich mit diesem Display? Gruß Stefan Hier mein Code: void LCDinit( void ) { PORTA = 0x02; // set display to 4 bit mode PORTA |= (1<<LCD_E); // still 8 bit access, PORTA &= ~(1<<LCD_E); // only one E pulse _delay_us(50); // wait after transmission LCDwriteCmd( 0x20 ); // set display to 4 bit mode:001DNF00 LCDwriteCmd( 0x08 ); // DISPLAY OFF: 0000HDCB LCDwriteCmd( 0x06 ); // Entry Mode: 00000HIS LCDwriteCmd( 0x10 ); // SHIFT: Cursor move + left shift LCDclear(); // Clear Screen LCDwriteCmd( 0x0c ); // DISPLAY ON: 0000HDCB } void LCDsetCurPos( unsigned char zeile, unsigned char spalte ) { unsigned char cmd; switch( zeile ) { case 0: cmd = 0x80 + 0x00 + spalte; break; // 1. Zeile case 1: cmd = 0x80 + 0x40 + spalte; break; // 2. Zeile case 2: cmd = 0x80 + 0x14 + spalte; break; // 3. Zeile case 3: cmd = 0x80 + 0x54 + spalte; break; // 4. Zeile default: cmd = 0x80 + 0x00 + 0x00; break; // 1. Zeile, 1. Spalte } LCDwriteCmd( cmd ); } void LCDwriteCmd( unsigned char b ) { PORTA = (b>>4); PORTA |= (1<<LCD_E); PORTA &= ~(1<<LCD_E); _delay_us(50); PORTA = b & 0x0f; PORTA |= (1<<LCD_E); PORTA &= ~(1<<LCD_E); _delay_us(50); } int main( void ) { int m, n; char temp[10]; DDRA = 0xff; PORTA = 0x00; _delay_ms( 30 ); LCDinit(); for(;;) { LCDclear(); LCDsetCurPos( 0, 0); for( m = 0; m < 10; m++ ) { for( n = 0; n < 30; n++ ) _delay_ms( 10 ); //LCDhome(); //LCDsetCurPos( 0, 1); itoa(m, temp, 10); LCDprint( temp ); } } return 0; }
Nachtrag: Die Zeile LCDwriteCmd( 0x20 ); // set display to 4 bit mode:001DNF00 gilt natürlich für N=0. Für das zweizeilige Display hatte ich es so eingestellt: LCDwriteCmd( 0x28 ); // set display to 4 bit mode:001DNF00 Gruß Stefan
Versuchs mal so: void LCDinit( void ) { PORTA = 0x03; PORTA |= (1<<LCD_E); // still 8 bit access, PORTA &= ~(1<<LCD_E); // only one E pulse _delay_ms(5); // wait after transmission PORTA = 0x03; PORTA |= (1<<LCD_E); // still 8 bit access, PORTA &= ~(1<<LCD_E); // only one E pulse _delay_ms(1); // wait after transmission PORTA = 0x03; PORTA |= (1<<LCD_E); // still 8 bit access, PORTA &= ~(1<<LCD_E); // only one E pulse _delay_ms(1); // wait after transmission PORTA = 0x02; // set display to 4 bit mode PORTA |= (1<<LCD_E); // still 8 bit access, PORTA &= ~(1<<LCD_E); // only one E pulse _delay_ms(1); // wait after transmission LCDwriteCmd( 0x28 ); // set display to 4 bit mode:001DNF00 LCDwriteCmd( 0x08 ); // DISPLAY OFF: 0000HDCB LCDwriteCmd( 0x06 ); // Entry Mode: 00000HIS LCDwriteCmd( 0x10 ); // SHIFT: Cursor move + left shift LCDclear(); // Clear Screen LCDwriteCmd( 0x0c ); // DISPLAY ON: 0000HDCB }
>case 0: cmd = 0x80 + 0x00 + spalte; break; // 1. Zeile >case 1: cmd = 0x80 + 0x40 + spalte; break; // 2. Zeile >case 2: cmd = 0x80 + 0x14 + spalte; break; // 3. Zeile >case 3: cmd = 0x80 + 0x54 + spalte; break; // 4. Zeile Könnten falsche Zeilenadressen sein, probier mal diese, damit läuft mein DIP 204 jedenfalls im 4x20 Mode: case 0: cmd = 0x80; break; // Zeile 1 case 1: cmd = 0xA0; break; // Zeile 2 case 2: cmd = 0xC0; break; // Zeile 3 case 3: cmd = 0xE0; break; // Zeile 4
Hallo, vielen Dank für die Hilfe. Leider komme ich nicht weiter. Zeile 2 und 4 bleibt stets leer. Gruß Stefan
Habe das LCD 204B LED hier auch erst nach einigem kämpfen zum laufen bekommen... Der 1. Teil vom Init mache ich wie holger, aber mit 15ms pause stats 5ms. Der 2. Teil: lcd_command(0x28); lcd_command(0x08); lcd_command(0x0F); lcd_command(0x06); lcd_command(0x01); lcd_command(0x02); Als Zeilenadressen habe ich: 0-> 0x80 1-> 0xC0 2-> 0x94 3-> 0xD4 Viel Erfolg!
Ich betreibe dieses Display ohne Probleme, allerdings im SPI Mode, nicht im herkömmlichen Ansteuerungsmodus so wie du, denn da hatte ich exkat die gleichen Probleme, die ich nicht lösen konnte. Wenn du die SPI Ansteuerung (braucht nur 2 Pins!) mal probieren willst: Hier steht wie mans anschließt, Beispiel-SW ist auch dabei: http://tobias.schroepf.de/doku/doku.php?id=garage:atmel_avr#lcd
Hat das Reichelt Teil denn einen KS0073 drauf? Eines der bei R dazu gezeigten Datasheets jedenfalls zeigt einen KS0076 ohne SPI.
Versuch es mal mit dieser Codesammlung in C (one main programm), sonst aber selbsterklärend. In der Funktion "LCD_SendLineText" ist definiert, wie die Zeilen 2 und 4 angesprochen werden. Gruß Manni
Hallo zusammen, nochmals vielen Dank für eure Mühe. @Tim: Mit deinem Vorschlag klappt es bei einer Zeile prima, bei 2 Zeilen bleibt das Display leer. @Markus: Laut Reichelt ist ein KS0066 drin. Das het kein SPI. @Manni: So habe ich es auch gemacht. Ohne Erfolg. Ich glaube, ich hau das Ding in die Tonne und bestelle mir eines mit SPI. Viele Grüße Stefan
Stefan wrote: > Hallo zusammen, > > nochmals vielen Dank für eure Mühe. > > @Tim: Mit deinem Vorschlag klappt es bei einer Zeile prima, bei 2 Zeilen > bleibt das Display leer. > > @Markus: Laut Reichelt ist ein KS0066 drin. Das het kein SPI. > > @Manni: So habe ich es auch gemacht. Ohne Erfolg. > > Ich glaube, ich hau das Ding in die Tonne und bestelle mir eines mit > SPI. Tztz... da steht doch sicher drauf das man das nicht in den Hausmüll geben darf! Schicks lieber mir :D
>Laut Reichelt ist ein KS0066 drin.
Dann versuchs mal so:
PORTA = 0x02;
PORTA |= (1<<LCD_E); // still 8 bit access,
PORTA &= ~(1<<LCD_E); // only one E pulse
PORTA = 0x02; // set display to 4 bit mode
PORTA |= (1<<LCD_E); // still 8 bit access,
PORTA &= ~(1<<LCD_E); // only one E pulse
PORTA = 0x0C; // 2 Line, display on
PORTA |= (1<<LCD_E); // still 8 bit access,
PORTA &= ~(1<<LCD_E); // only one E pulse
_delay_ms(1); // wait after transmission
LCDwriteCmd( 0x0c ); // DISPLAY ON: 0000HDCB
LCDclear(); // Clear Screen
LCDwriteCmd( 0x06 ); // Entry Mode: 00000HIS
Nachtrag: Statt PORTA |= (1<<LCD_E); PORTA &= ~(1<<LCD_E); nimm lieber _delay_us(1); PORTA |= (1<<LCD_E); _delay_us(1); PORTA &= ~(1<<LCD_E); Der Enable Puls könnte sonst zu kurz sein wenn die Prozessorfrequenz >=8Mhz ist.
also ich hatte keine probleme mit dem teil (wenn ich mich recht erinnere) so kurz aus dem kopf: um in die 2.zeile zu kommen musste man in die erste zeile an position 16 schreiben... wenn das auf die schnelle nicht hilft kann ich nochmal den code raussuchen. (falls das nötig ist bitt PN) grüße danie
Hallo, auch mit den letzten Hilfestellungen komme ich nicht weiter. :-( Interessant ist, dass jeder seine eigene Initialisierung hat. Die verschiedenen Datenblätter unterscheiden sich, bzw. widersprechen sich selbst. Oft sind sie nicht verständlich und eindeutig. Ich vermute, die Hardware ist schon ok, nur mangelt es an der Dokumentation. Viele Grüße Stefan
Moin zusammen, ich habe leider genau das gleiche Problem: Display: "LCD 204B LED" von Reichelt http://www.reichelt.de/?;ACTION=3;LA=4;GROUP=A5211;GROUPID=3005;ARTICLE=31660;START=0;SORT=artnr;OFFSET=16;SID=32rQcetKwQASAAADDckdI6eeb5286e5562e9c817836710ddedf85 Datenblatt: http://www.electronic-assembly.de/deu/pdf/doma/4_20.pdf Die Beispiele folgender Seiten haben leider nicht geholfen: Beitrag "LCD EA DIP204-4 Initialisieren" Beitrag "LCD Displaytech 204B & ATmega32" http://tobias.schroepf.de/doku/doku.php?id=garage:atmel_avr#lcd Die Zeilen 0 und 2 lassen sich ansteuern, die anderen nicht. Das Ding ist mir echt ein Rätsel - ist nicht gerade mein erstes 4-zeiliges LCD.
1 | DD-Ram-Adressen (hex): |
2 | Line0: [00][01][02]...[13] |
3 | Line1: [40][41][42]...[53] |
4 | Line2: [14][15][16]...[27] |
5 | Line3: [54][55][56]...[67] |
Dabei habe Initialisierungen mit delay und busy-abfrage versucht ... erfolglos. verschiedenste Intitialisierungsreihnfolgen z.B.:
1 | // 0x01 Clear
|
2 | // 0x34 8-Bitmodus, RE=1
|
3 | // 0x0f Display ON, Cursor ON, Blink ON
|
4 | // 0x30 8-Bitmodus, RE=0
|
5 | // 0x06 Segment Bidirectional Function (Seg1->Seg60)
|
6 | // 0x34 8-Bitmodus, RE=1
|
7 | // 0x09 5-Dot Fontwidth, Normal Cursor, 4 Lines
|
8 | // 0x30 8-Bitmodus, RE=0
|
9 | // 0x01 Clear
|
oder wie es in mehreren Datenblättern vorgeschlagen wird:
1 | // 0x38 8-Bitmodus, (2 bzw.4 Zeilen)
|
2 | // 0x0f Display ON, Cursor ON, Blink ON
|
3 | // 0x01 Clear
|
4 | // 0x06 Segment Bidirectional Function (Seg1->Seg60)
|
Ich habe auch schon versucht,einfach alles DD-RAM-Adresse von 0x00 bis 0x7f zu beschreiben (naturlich immer | 0x80): dabei sind wieder nur die beiden ansteuerbaren Zeilen beschireben worden. Der Fehler ist also wahrscheinlich in der Initialisierung zu suchen, sodass das Diplay gar nicht weiß, dass es mehr als Zeile 0 und 2 hat. Vielleicht muss man ja auch noch irgend eine Brücke setzen ... aber sowas habe bisher nur im SPI-Modus gelesen. Bitte helft mir, mit dem Haarraufen aufzuhören ! ;)
Welchen Controller hat denn dein Display? Wenns der KS0073-Controller ist, dann empfehle ich, mal die SPI-Ansteuerung zu versuchen, anstatt der herkömmlichen Ansteuerung mit 4 oder 8 Datenleitungen. Dies hat bei mir geholfen, habe es mit der herkömmlichne Ansteuerung auch nicht hingebracht... Hatte dasselbe Problem wie du.
Jetzt funktioniert's ... das einzige was ich jetzt nochmal geändert hab (@maggggus: bevor ich auf SPI umsteige) sind zwei weitere Befehle am Ende der Initialisierung:
1 | // 0x01 Clear
|
2 | // 0x34 8-Bitmodus, RE=1
|
3 | // 0x0f Display ON, Cursor ON, Blink ON
|
4 | // 0x30 8-Bitmodus, RE=0
|
5 | // 0x06 Segment Bidirectional Function (Seg1->Seg60)
|
6 | // 0x34 8-Bitmodus, RE=1
|
7 | // 0x09 5-Dot Fontwidth, Normal Cursor, 4 Lines
|
8 | // 0x30 8-Bitmodus, RE=0
|
9 | // 0x01 Clear
|
10 | |
11 | // neu:
|
12 | |
13 | // 0x38 8-Bitmodus, 2 or 4 lines
|
14 | // 0x01 Clear
|
allerdings habe ich den Erfolg nicht sofort bemerkt, weil das Display (scheinbar) nichts mehr anzeigt -> das liegt am Multiplexing. Die Hersteller wollen das Wiring auf dem Modul nicht verdoppeln und deswegen bedienen sie abwechselnd die eine oder andere Hälfte des Displays. Dabei nimmt der Kontrast stark ab. Bei mir kam noch hinzu, dass die versorgende Spannungsquelle von 5V auf 4V gesunken ist.
1 | Fazit:
|
2 | 5V Spannung garantieren |
3 | maximalen Kontrast einstellen |
4 | zum Schluss nochmals mit 0x38 initialisieren (für den 2 bzw. 4-Zeilenmodus) |
Gruß, Kay
Hallo Leute, Ich habe gestern das Display 204B von Displaytech geschenkt bekommen. heute bin ich auf dieses Forum gestoßen, da ich auf der suche nach einer Beschreibung und Anleitung für Dummys bin. :-) folgende Sachen sind für mich noch unklar. (alles) :-) nee Schmarrn. 1. mit was wird das 204b programmiert? 2. gibt es hierfür Codes? (Anleitungen, oder fertige Sachen)? also genau genommen, hapert es doch an allem. Ich würde mich über eure Hilfe sehr freuen. Gruß Tobi. P.S. das 204b ist schon einsatzbereit, d.h. ich muß nix mehr löten, hoffe ich zumindest :-) Läuft es über com (RS232) oder über LPT, da ich ein 25pol. D-sub Stecker dran habe?
Hallo zusammen, wie ich gesehen habe, besteht bei vielen Leuten das Problem, das Display 204B von displaytech (Reichelt) korrekt zum Laufen zu bringen. Der Grund ist, dass die Initialisierungsroutine im Datenblatt von Displaytech sich auf den KS0076B und nicht auf den wirklich vorhandenen Controller KS0066B bezieht. Die Initialisierungsroutine ist anders und auch die einzuhaltenden Zeiten. Nachdem ich die korrekten Befehle des Datenblattes vom KS0066B eingegeben hatte, funktionierte alles perfekt. Das Datenblatt ist im Anhang. Ulli
I want to thank you all for this post. I am a novice in programming Microprocessors. This post has helped me a lot. I have used a part of Manni's example program for my project. regards André
@Stefan und andere! Meint ihr das EA DIP204B-4NLW Display mit dem KS0073 drauf? Wenn ja! Dann ist bei der Initialisierung folgendes zu beachten: 1. Die Adressen für die Zeilenanfang sind etwas anders. 00h EADIP204-4 Zeile 1 20h EADIP204-4 Zeile 2 40h EADIP204-4 Zeile 3 60h EADIP204-4 Zeile 4 2. Gibt es ein Erweiterungsbit RE 0x2C und den muss man zwingend setzen bevor dann in den 4-Bit-Modus geschaltet wird mit 0x09. Sonst funktioniert die Sache nicht und das Display bleibt im 2 Zeilen modus.
Klaus schrieb: > 2. Gibt es ein Erweiterungsbit RE 0x2C und > > den muss man zwingend setzen bevor dann in den 4-Bit-Modus > > geschaltet wird mit 0x09. Erweiterungsbit RE = 0x24 wäre richtig sorry!
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.