LCD Displaytech 204B (von Reichelt)

Gast #858446
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;
}
Gast #858454
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
Gast #858496
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
}
Gast #858509
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
Gast #858734
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!
#858806
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
Gast #858944
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
Persönliche Seite #858951
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
Gast #859077
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
Gast #859083
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.
#859107
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
Gast #859235
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
#870808
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 ! ;)
#870811
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.
#870896
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
Gast #1193806
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?
Gast #1212240
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
Angehängte Dateien:
Gast #2081386
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren