Forum: Mikrocontroller und Digitale Elektronik LCD-ansteuerung mit µ-controller


von Florian (Gast)


Angehängte Dateien:

Lesenswert?

hallo

wir wollen das LCD 161A von displaytech ansteuern.
in einem 8-bit modus.
die programmiersprache ist c

wir brauchen hilfe bei den datenleitungen
also wir haben rausgefunden das d0 bis d7 für die asci code
zuständigsind oder?
aber mit den datenleitungen en, rs, rw kommen wir nicht zurecht
bitte um hilfe

guten leitwert prof. dr. muchel
danke

von Chriss (Gast)


Lesenswert?

Geht es um die Hardwareanbindung?

Die Specs zur ANsteuerung stehn doch in Datenblatt zum Controller

z.B. KS0066 oder HD44780

von Wolle (Gast)


Lesenswert?

Datenblatt Seite 9 von 17 : Interface PIN Connctions => Erklärung !

von Florian (Gast)


Lesenswert?

hallo

wir wissen nicht wie die  en, rs, rw  "benutzen sollen"
wir haben auch kein datenblatt gefunden zum LCD-display

also wofür und wie benutzt man  en, rs, rw???

danke für die hilfe

guten leitwert flo

von Florian (Gast)


Lesenswert?

ergenzung

wir haben nur das datenblatt im anhang

guten leitwert flo

von Sebastian (Gast)


Lesenswert?

en --> wenn der EN Pin von H nach L geht werden die daten/kommandos die

       zu dem zeitpunkt am lcd anliegen "gelesen/verarbeitet"
rs --> damit wählst du ob du daten (also ascii zeichen) oder einen

       befehl an das lcd sendest
rw --> wenn du keine daten vom lcd lesen willst, dann rw auf gnd

von raoul (Gast)


Lesenswert?

auf seite 4 des pdf's ist doch alles erklärt...rtfm ;)

mfg

von Florian (Gast)


Lesenswert?

weiß jemand etwas über die Inizialisierung des LCD's??? Man muss woll
auch erst mal denn Speicher anfordern und dann kann man erst das
Display und denn Code eingeben.

Kann uns da jemand helfen ??? Danke
guten leitwert flo

von Gerhard (Gast)


Lesenswert?

... Grundlagen zu LCD's siehe auch hier:
http://www.sprut.de/electronic/lcd/index.htm

mfg Gerhard

von Doran S. (utzer)


Angehängte Dateien:

Lesenswert?

Hallo,

ich bins mal wieder...
Ich versuche gerade ein Display, das den KS0066U verwendet anzusteuern.
Allerdings zeigt das Display nur 8 Schwarze Balken an.
Es handelt sich um ein 1x16 Char Display.
Ich verwende den 8-bit Mode.
DB0...DB7 vom Display hängen an PB0...PB7 am µC (Mega32)
RS ist am PD0, R/W am PD1 und E am PD2.
Bei dem Display handelt es sich um das gleiche, wie beim OP.
Anbei habe ich meinen Sourcecode (C-Code).
Die Hintergrundbeleuchtung geht leider auch nicht...
hab an LED- GND angeschlossen und an LED+ ca. 2,2Volt.
VO hab ich mit so einem Poti fast ganz auf Masse eingestellt, damit der 
Kontrast stimmt.
PORTC, steuert nur LEDs, damit man sieht, wenn das Programm irgendwo 
"hängt" :-)

Doran

von Εrnst B. (ernst)


Lesenswert?

Hier
http://www.geocities.com/dinceraydin/djlcdsim/djlcdsim.html
kannst du dir ein LCD simulieren lassen, und per Mausklick an den 
Datenleitungen rumspielen.

von Doran S. (utzer)


Lesenswert?

ok, danke, das ist echt gut, ich schaffs auch, das Display so zu 
bedienen, aber ich Wirklichkeit gehts halt nicht... Findet Jemand einen 
Fehler im Code?

Doran

von Doran S. (utzer)


Lesenswert?

vielleicht LCD kaputt??? kann das sein? die 8 Balken, gehen nicht weg...

von spess53 (Gast)


Lesenswert?

Hi

Meine C-Kenntnisse sind zwar nur rudimentär, aber bist du sicher das das 
richtig ist:

>_delay_us(0.01);

?

MfG Spess

von Doran S. (utzer)


Lesenswert?

sry, hatte ich experimentell geändert - welcher Wert ist denn zu 
empfehlen?

von spess53 (Gast)


Lesenswert?

Hi

>sry, hatte ich experimentell geändert - welcher Wert ist denn zu
>empfehlen?

Im einfachsten Fall mach 2 oder 3 ASM-Nops rein.

MfG Spess

von Doran S. (utzer)


Lesenswert?

ok, hab jetzt nop's drinne(3), aber es funktioniert immernoch nicht.....

von Doran S. (utzer)


Lesenswert?

hab gerade noch gemessen: Wenn ich den Mega32 abklemme, dann liegen an 
den Anschlüssen vom Display (DB0...DB7) 5V an. Normal?

Doran

von Doran S. (utzer)


Lesenswert?

Leute, es geht jetzt.........
Ich hatte nur den Kontrast zu arg aufgedreht, darum hat das LCD nur so 
Balken angezeigt............. :-(

Doran

von Doran S. (utzer)


Lesenswert?

Hallo,

jetzt fällt mir gerade ein neues Problem auf...
Das Display schneidet alles nach dem 8. Zeichen ab... :-(
Was kann man da machen?

Doran

von skriptkiddy (Gast)


Lesenswert?

Das liegt wahrscheinlich daran, dass ab dem 9.Zeichen ein anderer 
Adressbereich im CG-RAM benutzt wird. Schau mal in das Tutorial von 
Ulrich Radig. 
http://www.ulrichradig.de/home/uploads/images/Daten_Infos_Anleitungen/LC.pdf 
Auf Seite 4 siehst du genaueres.

von holger (Gast)


Lesenswert?

>Das Display schneidet alles nach dem 8. Zeichen ab... :-(
>Was kann man da machen?

Das Display ist real ein 2x8 Zeichen Display.
Wenn du Zeichen 9 beschreiben willst mußt du
in die zweite Zeile wechseln. Mit lcd_gotoxy()
oder sowas.

von skriptkiddy (Gast)


Lesenswert?

holger schrieb:
> Das Display ist real ein 2x8 Zeichen Display.
> Wenn du Zeichen 9 beschreiben willst mußt du
> in die zweite Zeile wechseln. Mit lcd_gotoxy()
> oder sowas.

Er hat doch nur eine Zeile im Display. Wie kann er da in die 2. 
wechseln?

von holger (Gast)


Lesenswert?

>Er hat doch nur eine Zeile im Display.

Das ist nur eine räumliche Anordnung.
Es ist ein zweizeiliges Display.

von skriptkiddy (Gast)


Lesenswert?

holger schrieb:
> Das ist nur eine räumliche Anordnung.
> Es ist ein zweizeiliges Display.

Alles klar jetzt weiß ich wie du das meinst.

von holger (Gast)


Lesenswert?


von Doran S. (utzer)


Lesenswert?

cool, danke, jetzt geht es..... freu

Doran

von Doran S. (utzer)


Lesenswert?

So, jetzt habe ich aber doch nochmal eine Frage: Ich möchte in der 
Funktion write() erkennen, dass wenn Zeichen 8 schon beschrieben wurde, 
dass dann automatisch Zeichen 9 beschrieben wird (Also automatischer 
"Zeilenwechsel")
Wie kann ich das machen?
hab es schon mit der Funktion visible():
1
void visible()
2
{
3
  PORTD = 0b00000011;     //RS und R/W = hight
4
  PORTB = 0x00;
5
  DDRB = 0x00;   //PINB als Eingang
6
  enable();   //"E" von low hach high, dann wieder nach low
7
  
8
  if((PINB & 0b00001000) == 1) //Abfragen, ob Zeichen 8 schon beschrieben.... (liest DD-RAM ein, da RS und R/W high)
9
  {
10
    DDRB = 0xFF;  //PORTB wieder als Ausgang
11
    PORTD = 0x00;  //RS und R/W auf low
12
13
    //Courser verschieben (DD-RAM)
14
    PORTB = 0b11000000;  //setzt DB7+DB6 auf high, setzt DD-RAM auf 0x40
15
    enable();
16
    _delay_ms(10);
17
    PORTB = 0x00;
18
  }
19
20
  PORTD = 0x00;
21
  DDRB = 0xFF;
22
  PORTB = 0x00;
23
}

versucht... funktioniert leider nicht..... was kann ich machen?
Meine Funktion visible() wird gleich zum Anfang von write() aufgerufen.


Doran

von Doran S. (utzer)


Lesenswert?

keiner ne Idee?

von Doran S. (utzer)


Lesenswert?

Hallo,

Wie kann ich vor einer weiteren Ausgabe auf dem Display überprüfen, 
wieviele Zeichen gerade auf dem Display sind und wo die stehen?

Über etwas Hilfe würde ich mich freuen!

Doran

von spess53 (Gast)


Lesenswert?

Hi

>Wie kann ich vor einer weiteren Ausgabe auf dem Display überprüfen,
>wieviele Zeichen gerade auf dem Display sind und wo die stehen?

Einfach mitzählen. Oder du legst dir für jede Zeile einen Puffer im Ram 
an.

MfG Spess

von Doran S. (utzer)


Lesenswert?

ok, wie mach ich das mit dem Puffer im RAM? kenn mich da nicht so aus...
Kann ich nicht einfach so wieder aus dem Display "lesen"?

Doran

PS: funktioniert eigentlich meine Funktion "Busy()"? Benötige ich noch 
eine Flanke an "E"???
1
void busy()  //soll einfach nur warten, bis das Display bereit ist...
2
{
3
  int BF = 1;
4
5
  //Read Busy-Flag
6
  PORTD = 0b00000010;
7
  DDRB = 0x00;
8
  while(1)
9
  {
10
    BF = (PINB & 0b10000000);
11
12
    if(BF==0)
13
    break;
14
  }
15
  BF=1;
16
  DDRB = 0xFF;
17
  PORTD = 0x00;
18
}

von Doran S. (utzer)


Lesenswert?

Hallo,

mir ist gerade aufgefallen, dass das Senden an das Display hervoragend 
klappt - nur ich schaffe es nicht, Daten von dem Display abzurufen (Auch 
das mit dem Busy-Flag klappt nicht so richtig).
Wie muss ich grundsätzlich bei Lesen vorgehen? (insbesondere bezogen auf 
das "Enable")?

Doran

von spess53 (Gast)


Lesenswert?

Hi

>Wie muss ich grundsätzlich bei Lesen vorgehen? (insbesondere bezogen auf
>das "Enable")?

Was sagt dir das Datenblatt des Displaycontrollers dazu?

MfG Spess

von Doran S. (utzer)


Lesenswert?

spess53 schrieb:
> Was sagt dir das Datenblatt des Displaycontrollers dazu?

Das Datenblatt versteh ich noch nicht 100%... außerdem find ich dazu 
keine Informationen im Datenblatt!

Doran

von Dr.Siemens (Gast)


Lesenswert?

moin

Ich bin ja auch dafür das Datenblätter endlich wieder in Deutsch 
gedruckt zur Verfügung gestellt werden ;-)

aber bis es soweit ist ,würde ich an deiner Stelle mal hier nachlesen

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung

mfg

von spess53 (Gast)


Lesenswert?

Hi

>Das Datenblatt versteh ich noch nicht 100%... außerdem find ich dazu
>keine Informationen im Datenblatt!

Dann sieh mal in deinem geposteten Datenblatt des Displays unter 'Read 
Mode' nach. Unter 'READ BUSY FLAG & ADDRESS' findest du dann auch in der 
Befehls-Tabelle die Pegel für RS und R/W.

Das sollte eigentlich reichen.

MfG Spess

von Doran S. (utzer)


Lesenswert?

spess53 schrieb:
> Dann sieh mal in deinem geposteten Datenblatt des Displays unter 'Read
> Mode' nach. Unter 'READ BUSY FLAG & ADDRESS' findest du dann auch in der
> Befehls-Tabelle die Pegel für RS und R/W.

Ja, das ist mir klar soweit. Aber was muss ich bei der "Read operation" 
mit "Enable" machen???

Doran

von skriptkiddy (Gast)


Lesenswert?

Ich hab grad folgende Information beim lycosen gefunden:

Busy-Flag und Adress-Zähler auslesen
RS   R/W   D7   D6   D5   D4   D3   D2   D1   D0
0   1   BF   A6   A5   A4   A3   A2   A1   A0

http://www.a-netz.de/lcd.de.php

Heißt für mich soviel wie RS=0 und R/W=1 kurz warten(wie kurz weiß ich 
nicht) und D7 ist das busyflag. Weiter ober steht E=1 beim lesen und 
schreiben.
Bin mir aber nicht sicher. Am besten einfach mal testen.

von Doran S. (utzer)


Lesenswert?

Ich versuche es gerade so:
1
int g=0;
2
3
  PORTD = 0b00000010;   //Nur R/W high
4
  PORTB = 0x00;
5
  DDRB = 0x00;  //PINB als Eingang
6
  
7
  PORTD |= (1<<PD2);  //E high
8
  asm("nop");
9
  asm("nop");
10
  asm("nop");
11
12
  g=PINB;   //Pegel (aktuelle DD-RAM Adresse???) von PINB nach g speichern
13
14
  PORTD &= ~(1<<PD2);  //E low
15
  
16
  if(g == 8)  //Wenn an position 8, dann DD-RAM-Adresse nach 0x40 - 9. Zeichen
17
  {
18
    DDRB = 0xFF;
19
    PORTD = 0x00;
20
21
    //Courser verschieben (DD-RAM)
22
    PORTB = 0b11000000;
23
    enable();
24
    _delay_ms(10);
25
    PORTB = 0x00;
26
  }
27
28
  PORTD = 0x00;
29
  DDRB = 0xFF;
30
  PORTB = 0x00;
geht aber nicht, es wird einfach nicht eingelesen... wo könnte der 
Fehler liegen? Bin an verzweifeln...

Doran

von spess53 (Gast)


Lesenswert?

Hi

>Ja, das ist mir klar soweit. Aber was muss ich bei der "Read operation"
>mit "Enable" machen???

In dem Diagramm siehst du eine Kurve, die mir 'E',wie Enable, 
beschriftet ist. Genau das was dort steht musst du programmtechnisch 
umsetzen.

Entschuldige wenn ich dir keine fertige Lösung anbieten will. Aber 
erstens könnte ich das nur in Assembler und zweitens ist weder dir noch 
dem Forum geholfen, wenn du nicht verstanden hast was du da 
programmierst (oder kopiert hast).

MfG Spess

von skriptkiddy (Gast)


Lesenswert?

Doran S. schrieb:
> geht aber nicht, es wird einfach nicht eingelesen... wo könnte der
> Fehler liegen? Bin an verzweifeln...

Sieht vom Prinzip her in Ordnung aus.
Reichen die 3 nops vielleicht nicht?

von Doran S. (utzer)


Lesenswert?

wie ist das eigentlich, was für einen Wert lese ich da ein?
Wenn ich z.B. 7 Zeichen in der 1. Zeile auf dem Display habe. Dann ist 
DD-RAM=0x07. Wenn ich dann einlese, dann müssten doch diese ACx-Register 
den Wert 0x07 haben - oder wie ist das?

Doran

von spess53 (Gast)


Lesenswert?

Hi

>wie ist das eigentlich, was für einen Wert lese ich da ein?
>Wenn ich z.B. 7 Zeichen in der 1. Zeile auf dem Display habe. Dann ist
>DD-RAM=0x07. Wenn ich dann einlese, dann müssten doch diese ACx-Register
>den Wert 0x07 haben - oder wie ist das?

Das hängt von der Initialisierung 'Entry Mode Set' ab.

MfG Spess

von Doran S. (utzer)


Lesenswert?

spess53 schrieb:
> Entschuldige wenn ich dir keine fertige Lösung anbieten will. Aber
> erstens könnte ich das nur in Assembler und zweitens ist weder dir noch
> dem Forum geholfen, wenn du nicht verstanden hast was du da
> programmierst (oder kopiert hast).

Da hast Du echt recht, ich will es ja auch selbst verstehen.

Habe gerade die Spannung an DB0...DB7 gemessen, während R/W=1 und E=1 
war: 2,2Volt konstant!!! ist das normal?
sind da vielleicht Pullups aktiv?

Doran

von spess53 (Gast)


Lesenswert?

Hi

>Habe gerade die Spannung an DB0...DB7 gemessen, während R/W=1 und E=1
>war: 2,2Volt konstant!!! ist das normal?

Das Display reagiert nicht so richtig auf ein statisches E-Signal. Das 
Kriterium ist die H-L-Flanke. Damit werden z.B. anliegende Daten 
geschrieben. Beim Lesen sind die Daten erst nach der Flanke gültig.

MfG Spess

von Doran S. (utzer)


Angehängte Dateien:

Lesenswert?

Hallo,

ich glaub, ich verstehe hier was nicht richtig...
Mein Display besteht ja aus 2x8Char. Nur mechanisch sind die eben wie 
1x16Char angeordnet. Die Adressen für die Zeichen sind im Anhang. (Hab 
sie aus dem Datenblatt)
Nun möchte ich also automatisch in der Funktion, die auf das Display 
schreibt, erkennen, wann das 8. Zeichen(DD-RAM-Adresse = 0x07) 
beschrieben wurde, sodass dann automatisch das 9. Zeichen(DD-RAM-Adresse 
= 0x40) beschrieben wird.
Dazu habe ich ja, wie bereits geschrieben, diesen Code...
1
int g = 0;
2
3
  PORTD = 0b00000010;
4
  PORTB = 0x00;
5
  DDRB = 0x00;
6
  
7
  PORTD |= (1<<PD2);  //E high
8
  _delay_us(2);
9
  PORTD &= ~(1<<PD2);  //E low
10
11
  g = PINB & 0b01111111;  //Busy-Flag maskieren, sodass nur die Adresse gelesen wird
12
  
13
  if(g == 7)  //Wenn cursor an position 8, dann...
14
  {
15
    DDRB = 0xFF;
16
    PORTD = 0x00;
17
18
    //Courser verschieben (DD-RAM)  //Dieser Teil des Codes funktioniert...
19
    PORTB = 0b11000000;    //Sprung nach Position 9 (DD-RAM Adresse für Pos 9 = 0x40=0b11000000)
20
    enable();  //
21
    _delay_ms(10);
22
    PORTB = 0x00;
23
  }
24
25
  PORTD = 0x00;
26
  DDRB = 0xFF;
27
  PORTB = 0x00;
...vor der Funktion, die auf das Display schreibt. Der Code soll einfach 
die aktuelle Cursor Position auslesen und wenn sie = 0x08 (also 8. 
Zeichen bereits beschrieben, dann soll die DD-RAM-Adresse auf 0x40 
gesetzt werden. Also 9. Zeichen)
Das mit dem Setzen des DD-RAMs funktioniert auch, nur das erkennen, wann 
das 8. Zeichen beschrieben wurde klappt nicht.

Ich weiß, das ist alles etwas schwer zu verstehen, aber ich hoffe, jetzt 
kann man mir helfen.

Also: Wie kann ich die aktuelle Cursor Position erkennen/ermitteln 
(außer dem Mitzählen)?

Doran

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.