Forum: Mikrocontroller und Digitale Elektronik LCD Displaytech 204B (von Reichelt)


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Stefan (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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

von holger (Gast)


Lesenswert?

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
}

von Matthias (Gast)


Lesenswert?

>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

von Stefan (Gast)


Lesenswert?

Hallo,

vielen Dank für die Hilfe. Leider komme ich nicht weiter. Zeile 2 und 4 
bleibt stets leer.

Gruß
Stefan

von Tim (Gast)


Lesenswert?

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!

von Markus R. (maggggus)


Lesenswert?

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

von Andreas K. (a-k)


Lesenswert?

Hat das Reichelt Teil denn einen KS0073 drauf? Eines der bei R dazu 
gezeigten Datasheets jedenfalls zeigt einen KS0076 ohne SPI.

von Manni (Gast)


Angehängte Dateien:

Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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

von holger (Gast)


Lesenswert?

>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

von holger (Gast)


Lesenswert?

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.

von Daniel W. (danie)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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

von Kay I. (imperator)


Lesenswert?

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

von Markus R. (maggggus)


Lesenswert?

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.

von Kay I. (imperator)


Lesenswert?

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

von Tobias Höher (Gast)


Lesenswert?

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?

von ulli (Gast)


Angehängte Dateien:

Lesenswert?

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

von André (Gast)


Lesenswert?

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é

von Klaus (Gast)


Lesenswert?

@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.

von Klaus (Gast)


Lesenswert?

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