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
}
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
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
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.
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!