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
achja und macht euch über die schieberegister rutine keine gedanken ;) das läuft
>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.
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.
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
Peter Dannegger schrieb: > Müllhaufen Genau dieser Begriff lag mir auch auf der Zunge; ich hatte ihn mir ausnahmsweise verkniffen :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.