Hi Leute. Anbei ein kleines Progi um ein LCD anzusteuern. Das Programm hab ich ausführlich dokumentiert so dass es leicht verständlich ist. Ein kleines Bsp. (main.c) welches zeigt wie das LCD angesprochen wird ist auch dabei. lg CriGri
Sorry ,hab nicht daran gedacht. Es handelt sich um ein Programm welches für LCD's mit KS0066 / HD44780 - Contollern geeignet ist. Das Programm hab ich für einen 8051er geschrieben. Folgende Funktionen sind im Progi enthalten: -> Initialisierung -> Ausgabe eines Strings einzelner Zeichen eigene Zeichen -> Funktion zum erstellen eigener Zeichen Ich habe das Progi so geschrieben, dass der 8051er Bytewise Operationen ausführt da ihm das besser "liegt" als das Bit für Bit ansprechen. Die Funktionen set_address und set_data() hab ich aus vereinfachungsgründen mit eingebunden. Ich hoffe das das nun genug Erklärung war. lg CriGri
Dein Programm enthält mehrere gravierende Fehler: 1. Die Init-Sequenz entspricht nicht dem Datenblatt. Es kann funktionieren, wenn das LCD sauber resettet (schnell und monoton ansteigende VCC), muß aber nicht. 2. Beim Busy-Lesen werden D0..D6 kurzgeschlossen (P1= 0x80;), das führt zu erhöhter Stromaufnahme und kann die Lebensdauer des LCD drastisch verkürzen. 3. Die Bus-Timings werden nicht eingehalten. Laut Datenblatt müssen RS und RW vor E=1 gesetzt werden (>40ns) und nach E=0 gehalten werden (>10ns). Wundere Dich also nicht, wenn es mit anderen Displays, MCs, Spannungen, Temperaturen, Frequenzen Probleme gibt. Peter P.S.: Ich benutze beim AT89C2051 immer den 4Bit-Modus (6 Portpins), denn mit nur 4 freien Portpins (15-11) kann man ja nicht mehr viel anfangen.
Hallo Peter. Erstmals vielen Dank für deine Ausbesserungen. Habe das Progi mal abgeändert. kannst du nochmal drüber schauen und mir sagen was ich vielleicht noch verbessern könnte (außer dem 8-Bit Modus. den werd ich später ändern) ?! Bezüglich den Timings: Ich benutze einen 11.059MHz Quarz. Damit geht sich das mit RS & R/W >40ns mit einem Taktzyklus aus oder? Lg CriGri
@Steven In " set_address(0x3b); " ist es drinnen. Es ist auch das erste Kommando. Im Datenblatt wird die init (8-Bit) so durchgeführt (KS0066U Controller). mfg
Da hast du recht (laut Datenblatt). Das Datenblatt welches ich benutze (auch KS0066U) schreibt mir aber genau diese Art der Initialisierung vor. Ich hängs mal dran. Relativ knapp am Ende findest du die Init-Vorschrift. Entweder ist deines richtig oder beide und ich hab einfach Müll geprogt. lg
okay :) hast mich überzeugt. Danke. Komisch ist allerdings, dass dieses Progi schon bei 3 LCD's (auch HD44780) einwandfrei rennt. hmm....wie gibts denn das? lg
Habe das Progi nun umgeändert (Anhang) aber jetzt geht nichts mehr. Scheint so als ob das LCD zwar initialisiert ist aber ausgeben lässt sich nichts mehr. Warum? Habe mich an das Datenblatt gehalten. lg
das hab ich vorher auch entdeckt und schon geändert und getestet aber es funzt net. hmm... ich schnalls net. Mit meiner "Falschen" Routine ist alles gegangen und nu nix mehr. Siehst du sonst noch nen Fehler? lg
Cri Gri wrote: > das hab ich vorher auch entdeckt und schon geändert und getestet aber es > funzt net.
1 | #include <AT892051.h> |
2 | #include "lcd.h" |
3 | #include "Func.h" // wait() |
4 | #include "MyTypes.h" |
Ja, mit Deinem Code kann keiner was anfangen. Es fehlen 4 Includes (AT892051.h, Func.h, func.h, MyTypes.h). Warscheinlich ist Dein wait() zu kurz. Peter
Hier sind die Includes. Vielleicht kannst mir ja weiter helfen. Die 2051er ist die Originale von µVision2 lg
cri wrote:
> Kann mir vielleicht wer weiterhelfen?
Ganz oben hast Du auf 3A initialisiert und im letzten Code auf 38.
Peter
Peter Dannegger wrote:
> Ganz oben hast Du auf 3A initialisiert und im letzten Code auf 38.
Das ist das Function-Set Kommando für 8Bit,2Zeilen und 5*8Font.
Das kann wohl nicht der Fehler sein oder?
lg cri
Schreib doch mal die while-Funktion (busy-check) in eine ANSI-C-leserlichen Schreibweise und nicht im Perl-Dialekt. Die Schreibweise mag zwar cool sein und in der Schule gut ankommen, sie ist aber unnötig und verleitet zu Fehlern. Vielleicht erkennst du dabei was.
Steven Wetzel wrote: > Schreib doch mal die while-Funktion (busy-check) in eine > ANSI-C-leserlichen Schreibweise und nicht im Perl-Dialekt. Die > Schreibweise mag zwar cool sein und in der Schule gut ankommen, sie ist > aber unnötig und verleitet zu Fehlern. wieso cool? das hat doch nichts mit "cool" zu tun. Und was ist überhaupt ein Pearl - Dialekt? Sorry aber ich weiß echt nicht was du meinst. Ich find die Funktion net sonderlich "cool" aber Fehler sehe ich auch nicht unbedingt. P1 wird auf Eingabe gesetzt. R/W auf 1,DB7 ausgelesen,High-Low Flanke an EN und P3 löschen.
Cri Gri wrote: > Peter Dannegger wrote: > >> Ganz oben hast Du auf 3A initialisiert und im letzten Code auf 38. > > Das ist das Function-Set Kommando für 8Bit,2Zeilen und 5*8Font. > Das kann wohl nicht der Fehler sein oder? > > lg cri Probiers aus. Ich denke schon, daß es wichtig ist, den richtigen Typ einzustellen. Peter
Hi Christian, 3x 0x38 gilt für eine 8 BIT initialisierung. Insgesamt kann man das Programm durchaus ein bischen mehr strukturieren. PS: was macht der Robbi ?
Hi Semmel !!! Freu mich wieder mal was von dir zu hören. Wie gehts dir denn? Wie meinst du >Insgesamt kann man das Programm durchaus ein bischen mehr strukturieren. das? Deine Tipps waren in der Vergangenheit schon sehr hilfreich!! :) @Steven >Ob wir jemals wieder etwas von ihm hören? Ja "er" meldet sich wieder zurück ;) Beim Busy-Check hast du dich wohl auf das High-Setzen des EN-Pins bezogen , oder täusch ich mich ? @Peter >Ich denke schon, daß es wichtig ist, den richtigen Typ einzustellen. Ich versteh nicht was du meinst. Ich wiederhole 3mal die 0x30(laut Datenblatt) und dann setz ich 0x38 -> 2Zeilen, und 5*8Font ! Ab zwei Zeilen muss das "Bit F" nicht gesetzt werden da das LCD bei 2 Zeilen nur 5*8 kann. lg cri
Anbei das C-File @Steven >Perl-Dialekt, eine Dialekt, in dem man Funktionen in möglichst >komplizierter und unleserlicher Form darstellt. Nichts für ungut aber mein Progi is doch net so "verschlüsselt". Da hab ich hier im Forum schon einiges gesehen wo der Perl-Dialekt bis ins letzt ausgereizt wurde.
Hi Christian, damit die Verwirrung nicht zu groß wird, Semmel = Joe, Joe = Semmel ;-)) Was ist gemeint mit Struktur ? Schau dir mal folgenden Thread an: Beitrag "Wie mache ich eine Textausgabe 8Bit auf Display?" hier habe ich mal einen Displaycode mit einem anderen Forumteilnehmer erarbeitet (für nen AVR und im 4 BIT mode). Wie dem auch sei, eine Struktur ist hoffentlich zu erkennen. Am Ende des Threads habe ich dann meinen Code mal reingestellt, schaus dir mal an. Im Prinzip verwende ich nie einen 8 BIT LCD Bus, reine Verschwendung. 4 BIT ist mir schon zuviel. In der Regel verwende ich dann lieber noch nen Schieberegister und brauch dann noch 3 Leitungen. Im Anhang mal nen "quick & dirty" fürs Schieberegister. Ich hab mal bewußt C & H File in eine Tüte gesteckt, hoffe dann kommt rüber was ich mit Struktur meine. Der Code ist diesmal für nen 8x51. Zu deinem Code, 3x 0x38 reicht für die Initialisierung, schaus dir an. Gruß, Joe Semmel alias Bernd ;-))
kannst mir mal erklären warum ich nur 3*0x38 brauche? Im datasheet is noch die "eig" function-set drinn usw. Warum nur 3*0x38??
Probiers aus ;-)) Häng mal dein Datenblatt hier herein. Übrigens, teste mal den code und laß das Schieben weg (hast ja kein Schieberegister. Der Code läßt sich bei 8 BIT auch noch deutlich kürzen.
Hab das Datenblatt gesehen, war ja schon im Thread ;-)) bleib dabei, 0x38 ;-))
so. ich habs nu mal umgeschrieben. ich gehe es später testen und geb dir dann beschied über jenes was nun nicht geht :D
jipi :) Es geht nu. Ich häng mal mein "unstrukturiertes" ;) Progi an. Vielleicht hast ja Zeit es dir mal anzusehen Semmel = Joe = Bernd :D Aber ich weiß noch immer nicht warum 3*0x38 genügt :) Vielen Dank für die Hilfe. Auf dich ist Verlass :) @Peter ...auch der Stromverbrauch ist gesunken! @Steven Dir auch vielen Dank. Das mit dem Busy hab ich völlig übersehen. lg Cri
...und die 4_Bit Version funktioniert auch schon :) freufreu :) Vielen Dank Joe!
>> so. ich habs nu mal umgeschrieben. ich gehe es später testen und geb dir >> dann beschied über jenes was nun nicht geht ;-)) kein Kommentar ;-)) Nun, warum geht 0x38, weils so im Datenblatt steht, ich weiß nicht wie ich es einfacher erklären soll. Lese dir das DB noch einmal in Ruhe durch und mach dir eine Tabelle für die BIT Kombinationen, vielleicht kommst du selbst drauf. Die 4 BIT Variante gefällt mir, gut gemacht.
klar das sie dir gefällt :) is auch deiner ähnlich. hab jetzt set_address und set_data gegen eine einzige Funktion lcd_write ersetzt da sich die beiden sehr ähnlich waren. lg cri
Soooo....folgendes: Ich habe das Display 64128A mit einem controller KS0108. nun möchte ich durch meinen pic 16f ansteuern. ist dies mit diesem programmcode auch möglich und wenn was muss ich änder bzw. machen... ich bin verzweifelt;-)
Im Prinzip ja, I/O's und Timing solltest du anpassen. Ganz ohne Arbeit
gehts nicht.
>> ich bin verzweifelt;-)
Warum ?
kann mir mal jemand sagen wie ich das Zeug auf den Mega8 krieg? Also die c.* und h.* Dateien!! Kann damit irgendwie nix anfangen /-: grml
Wieso nicht, weil du keiner Erfahrung mit C hast, weil du nicht lesen kannst ? sorry, der mußte jetzt mal sein. Weiter oben schon erwähnt: Beitrag "Wie mache ich eine Textausgabe 8Bit auf Display?" Am Ende des Thread mein Code für nen ATTINY, sollte also kein Pronlem sein den auf nen Mega 8 laufen zu lassen.
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.