mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD Display initialisierung


Autor: Jan1990 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moin im augenblick das problem das ich das LCD display EA W2004B-NLW 
über schieberegister initialisieren muss. Habe leider keine ahnung woran 
es gerade hapert vll könnt ihr mir ja helfen

Die Datenleitungen sind in der hardware leider verdreht soll heißen 
0b10000000 im code heißt 0b00000001 in hardware nicht das ihr euch 
verwirren lasst;)

_delay_ms(2000);

    //funktion set
    display_control = 0b00000000;//Steuerleitungen aus
    schieberegister(display_data, display_control, 0xFF, 0xFF, 
DAC_control, (uint8_t)DAC_ausgabe);
    display_data = 0b11110000;
    schieberegister(display_data, display_control, 0xFF, 0xFF, 
DAC_control, (uint8_t)DAC_ausgabe);
    display_control = 0b10000000;//Enable an
    schieberegister(display_data, display_control, 0xFF, 0xFF, 
DAC_control, (uint8_t)DAC_ausgabe);
    display_control = 0b00000000;//enable aus
    schieberegister(display_data, display_control, 0xFF, 0xFF, 
DAC_control, (uint8_t)DAC_ausgabe);
    _delay_us(40);

    //display off
    display_control = 0b00000000;//Steuerleitungen aus
    schieberegister(display_data, display_control, 0xFF, 0xFF, 
DAC_control, (uint8_t)DAC_ausgabe);
    display_data = 0b00010000;//display off
    schieberegister(display_data, display_control, 0xFF, 0xFF, 
DAC_control, (uint8_t)DAC_ausgabe);
    display_control = 0b10000000;//Enable an
    schieberegister(display_data, display_control, 0xFF, 0xFF, 
DAC_control, (uint8_t)DAC_ausgabe);
    display_control = 0b00000000;//enable aus
    schieberegister(display_data, display_control, 0xFF, 0xFF, 
DAC_control, (uint8_t)DAC_ausgabe);
    _delay_us(40);

    //clear screen
    display_control = 0b00000000;//Steuerleitungen aus
    schieberegister(display_data, display_control, 0xFF, 0xFF, 
DAC_control, (uint8_t)DAC_ausgabe);
    display_data = 0b10000000;//display clear Befehl
    schieberegister(display_data, display_control, 0xFF, 0xFF, 
DAC_control, (uint8_t)DAC_ausgabe);
    display_control = 0b10000000;//Enable an
    schieberegister(display_data, display_control, 0xFF, 0xFF, 
DAC_control, (uint8_t)DAC_ausgabe);
    _delay_us(1);
    display_control = 0b00000000;//Steuerleitungen aus
    schieberegister(display_data, display_control, 0xFF, 0xFF, 
DAC_control, (uint8_t)DAC_ausgabe);
    status |= (clearscr);

    //entry mode
    display_data = 0b1110000;//schieben nach R/W, DD-RAM automatisch 
inkrementieren
    schieberegister(display_data, display_control, 0xFF, 0xFF, 
DAC_control, (uint8_t)DAC_ausgabe);
    display_control = 0b10000000;//Enable an
    schieberegister(display_data, display_control, 0xFF, 0xFF, 
DAC_control, (uint8_t)DAC_ausgabe);
    display_control = 0b00000000;//Enable aus
    schieberegister(display_data, display_control, 0xFF, 0xFF, 
DAC_control, (uint8_t)DAC_ausgabe);
    _delay_us(40);

    //display on
    display_data = 0b11110000;
    schieberegister(display_data, display_control, 0xFF, 0xFF, 
DAC_control, (uint8_t)DAC_ausgabe);
    display_control = 0b10000000;//Enable an
    schieberegister(display_data, display_control, 0xFF, 0xFF, 
DAC_control, (uint8_t)DAC_ausgabe);
    display_control = 0b00000000;//ENable aus
    schieberegister(display_data, display_control, 0xFF, 0xFF, 
DAC_control, (uint8_t)DAC_ausgabe);
    _delay_us(40);

wäre euch echt dankbar für hilfe

Autor: Jan1990 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achja und macht euch über die schieberegister rutine keine gedanken ;) 
das läuft

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Die Datenleitungen sind in der hardware leider verdreht soll heißen
>0b10000000 im code heißt 0b00000001 in hardware nicht das ihr euch
>verwirren lasst;)

Dann ändere deine Funktion Schiebergister doch einfach.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jan1990 schrieb:
> Habe leider keine ahnung woran es gerade hapert

Vielleicht an deinem Programmier- und Beschreibungsstil.

> vll könnt ihr mir ja helfen

nee, weil ich so etwas nicht mehr bis zum Ende lese.
Es sei denn, der Hinweis auf die Lesbarkeit wird von dir
tapfer aufgenommen; vielleicht hilft das ja.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, aber was Du da bietest, ist ein Müllhaufen.
Absolut nichts ist zu erkennen.
Es wird ne ominöse Funktion "schieberegister" aufgerufen mit nem Wust an 
Parametern, die nirgends erklärt sind.

Wenn man Pins vertauscht hat, macht das nichts. Dann schreibt man eine 
Umtauschfunktion, der man die originalen Werte übergibt.
Auf keinen Fall verdreht man sämtliche Kommandos und Daten!

Ich lehne mich jetzt mal ganz weit aus dem Fenster und vermute mal, Du 
nimmst den 4Bit-Modus.
Dann geht LCD ansteuern (4-Bit) so:
1. Nibble-Funktion schreiben
2. Byte-Funktion schreiben, die 1. benutzt
3. Daten-Funktion schreiben, die 2. benutzt
4. Kommando-Funktion schreiben, die 2. benutzt
5. Init-Funktion schreiben, die 1. und 4. benutzt

Es gibt also nur eine einzige Funktion, die die Daten-Pins und den E-Pin
anfassen darf. Und das ist nicht 5. !!!


Wichtig!
Man darf die Postingregeln lesen, d.h. Quelltext formatieren oder 
anhängen.



Peter

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> Müllhaufen

Genau dieser Begriff lag mir auch auf der Zunge; ich hatte ihn
mir ausnahmsweise verkniffen :-)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also wie gesagt, man steht da erstmal davor und versteht absolut 
garnichts.

Das mindeste, was man braucht, ist der Schaltplan und diese 
Schiebefunktion.

Und dann rufst Du nicht ständig die Schiebefunktion auf, sondern machst 
Dir eine Funktion, um ein Kommando und eine, um Daten an das Display zu 
senden.
Und Deine ganzen LCD-Sachen einschließlich Init rufen nur diese beiden 
Funktionen auf. Das Schieben interessiert sie nicht mehr.


Warum muß man Unterfunktionen schreiben?

Damit man selber noch durchsieht und damit man weniger Fehler macht.
Wenn Du nämlich als Spaghetticode haufenweise das Gleiche schreibst, 
ermüdet man beim Lesen und übersieht Fehler. Und bei Programmen reicht 
ein fehlerhaftes Bit und nichts geht.

Auch ist es unübersichtlich, wenn man sehr viele Argumente übergibt, die 
garnicht interessieren.
Will man verschiedene Bytes auf einmal ausgeben, legt man eine Struct 
an, die ausgegeben wird. Und die LCD-Routinen ändern nur die Bytes für 
das LCD.


Peter

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.