www.mikrocontroller.net

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


Autor: Florian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Chriss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht es um die Hardwareanbindung?

Die Specs zur ANsteuerung stehn doch in Datenblatt zum Controller

z.B. KS0066 oder HD44780

Autor: Wolle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Datenblatt Seite 9 von 17 : Interface PIN Connctions => Erklärung !

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ergenzung

wir haben nur das datenblatt im anhang

guten leitwert flo

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: raoul (Gast)
Datum:

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

mfg

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gerhard (Gast)
Datum:

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

mfg Gerhard

Autor: Doran S. (utzer)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Εrnst B✶ (ernst)
Datum:

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

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Doran S. (utzer)
Datum:

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

>_delay_us(0.01);

?

MfG Spess

Autor: Doran S. (utzer)
Datum:

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Doran S. (utzer)
Datum:

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

Autor: Doran S. (utzer)
Datum:

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

Doran

Autor: Doran S. (utzer)
Datum:

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

Doran

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: skriptkiddy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/Date... 
Auf Seite 4 siehst du genaueres.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: skriptkiddy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Er hat doch nur eine Zeile im Display.

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

Autor: skriptkiddy (Gast)
Datum:

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

Alles klar jetzt weiß ich wie du das meinst.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
cool, danke, jetzt geht es..... freu

Doran

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht 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():
void visible()
{
  PORTD = 0b00000011;     //RS und R/W = hight
  PORTB = 0x00;
  DDRB = 0x00;   //PINB als Eingang
  enable();   //"E" von low hach high, dann wieder nach low
  
  if((PINB & 0b00001000) == 1) //Abfragen, ob Zeichen 8 schon beschrieben.... (liest DD-RAM ein, da RS und R/W high)
  {
    DDRB = 0xFF;  //PORTB wieder als Ausgang
    PORTD = 0x00;  //RS und R/W auf low

    //Courser verschieben (DD-RAM)
    PORTB = 0b11000000;  //setzt DB7+DB6 auf high, setzt DD-RAM auf 0x40
    enable();
    _delay_ms(10);
    PORTB = 0x00;
  }

  PORTD = 0x00;
  DDRB = 0xFF;
  PORTB = 0x00;
}

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


Doran

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
keiner ne Idee?

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht 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"???
void busy()  //soll einfach nur warten, bis das Display bereit ist...
{
  int BF = 1;

  //Read Busy-Flag
  PORTD = 0b00000010;
  DDRB = 0x00;
  while(1)
  {
    BF = (PINB & 0b10000000);

    if(BF==0)
    break;
  }
  BF=1;
  DDRB = 0xFF;
  PORTD = 0x00;
}

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dr.Siemens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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-Tu...

mfg

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: skriptkiddy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich versuche es gerade so:
int g=0;

  PORTD = 0b00000010;   //Nur R/W high
  PORTB = 0x00;
  DDRB = 0x00;  //PINB als Eingang
  
  PORTD |= (1<<PD2);  //E high
  asm("nop");
  asm("nop");
  asm("nop");

  g=PINB;   //Pegel (aktuelle DD-RAM Adresse???) von PINB nach g speichern

  PORTD &= ~(1<<PD2);  //E low
  
  if(g == 8)  //Wenn an position 8, dann DD-RAM-Adresse nach 0x40 - 9. Zeichen
  {
    DDRB = 0xFF;
    PORTD = 0x00;

    //Courser verschieben (DD-RAM)
    PORTB = 0b11000000;
    enable();
    _delay_ms(10);
    PORTB = 0x00;
  }

  PORTD = 0x00;
  DDRB = 0xFF;
  PORTB = 0x00;
geht aber nicht, es wird einfach nicht eingelesen... wo könnte der 
Fehler liegen? Bin an verzweifeln...

Doran

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: skriptkiddy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Doran S. (utzer)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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...
int g = 0;

  PORTD = 0b00000010;
  PORTB = 0x00;
  DDRB = 0x00;
  
  PORTD |= (1<<PD2);  //E high
  _delay_us(2);
  PORTD &= ~(1<<PD2);  //E low

  g = PINB & 0b01111111;  //Busy-Flag maskieren, sodass nur die Adresse gelesen wird
  
  if(g == 7)  //Wenn cursor an position 8, dann...
  {
    DDRB = 0xFF;
    PORTD = 0x00;

    //Courser verschieben (DD-RAM)  //Dieser Teil des Codes funktioniert...
    PORTB = 0b11000000;    //Sprung nach Position 9 (DD-RAM Adresse für Pos 9 = 0x40=0b11000000)
    enable();  //
    _delay_ms(10);
    PORTB = 0x00;
  }

  PORTD = 0x00;
  DDRB = 0xFF;
  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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.