Forum: Mikrocontroller und Digitale Elektronik LCD Display initialisierung


von Jan1990 (Gast)


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

von Jan1990 (Gast)


Lesenswert?

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

von holger (Gast)


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.

von Klaus W. (mfgkw)


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.

von Peter D. (peda)


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

von Klaus W. (mfgkw)


Lesenswert?

Peter Dannegger schrieb:
> Müllhaufen

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

von Peter D. (peda)


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

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.