Hallo ich habe ein 2 zeiliges EA Dogm-162 Display wo mich interessieren würde wie ihr die Position bestimmt. Wenn ihr einen Text in der ersten Zeile ausgibt, setzt ihr den Cursor dann wieder auf Position 0 und verschiebt ihn dann um 40 Zeichen damit es in die zweite Zeile kommt, oder gibt es einen einfacheren Weg. MfG
hkhkjhkjhl schrieb: > ich habe ein 2 zeiliges EA Dogm-162 Display wo mich interessieren würde > wie ihr die Position bestimmt. Welche Position? Und warum möchte man die bestimmen? > > Wenn ihr einen Text in der ersten Zeile ausgibt, setzt ihr den Cursor > dann wieder auf Position 0 und verschiebt ihn dann um 40 Zeichen damit > es in die zweite Zeile kommt, oder gibt es einen einfacheren Weg. So ein LCD hat keinen Cursor, so wie du ihn von deiner Textverarbeitung her kennst. Du legst einfach fest wo du zu schreiben anfangen möchtest und gibst Zeichen aus. Das LCD beginnt dann ab dieser Stelle die Zeichen nacheinander auszugeben. Einfach mal in der Doku nach "Set DDRAM Adress" schauen. Das ist im Prinzip eine direkte Cursor-Positionierung. Also so "Setze Cursor nach 2. Zeile/1. Zeichen". Und ab dort wird dann ausgegeben.
Hi
>...oder gibt es einen einfacheren Weg.
Ja. Es gibt den Befehl 'Set DDRAM Address'. Damit kannst du den Cursor
an beliebiger Stelle platzieren.
Und die zweite Zeile beginnt bei 0x40, und nicht 40D.
MfG Spess
Gemeint war der Befehl "Display or Cursor Shift". Das kann den Cursor um ein Zeichen verschieben. Und mit der for-Schleife um 40 Zeichen wäre die 2. Zeile. Bei Set DRAM Adress wieso gehen die Adressen von 0-39D und von 64-103. Was ist mit den Adressen dazwischen?
hkhkjhkjhl schrieb: > Gemeint war der Befehl "Display or Cursor Shift". Das kann den Cursor um > ein Zeichen verschieben. Und mit der for-Schleife um 40 Zeichen wäre die > 2. Zeile. Man kann natürlich auch immer alles auf die komplizierte Art machen. Aber warum sollte man das tun wollen? Bei deiner Methode muss man 40 Übertragungen zum LCD machen (Cursor Home und 40 mal Shiften) um das gleiche Ergebnis zu erhalten wie senn ich mir einfach die DDRAM Adresse ausrechne und mit 1 Befehl dem LCD mitteile. Wenn du mit dem Lift vom 19. Stock und den 22. Stock fahren willst, fährst du ja auch nicht erst ins Erdgeschoss, nur damit du immer von der gleichen Statrposition aus zählen kannst. > Bei Set DRAM Adress wieso gehen die Adressen von 0-39D und von 64-103. > Was ist mit den Adressen dazwischen? Dieser Speicher wird nicht am LCD angezeigt. Die Adressen gibt es, sind aber quasi neben der Anzeigefläche. Auf die Art fängt die 2.te Zeile IMMER bei der gleichen Adresse an, egal ob das LCD 16 oder 20 oder 40 Zeichen breit ist. (theoretisch)
Man kann auch die Cursorposition auslesen. Hab ich noch nie gebraucht.
Hi
>Man kann auch die Cursorposition auslesen. Hab ich noch nie gebraucht.
Aber nicht bei serieller Ansteuerung von DOG-Displays.
MfG Spess
Ich habe im "Entry Mode Set" das "Shift of entire display" auf High gesetzt. Jedoch shiftet bzw. scrollt das Display nicht egal ob ich über 16 oder über 40 Zeichen einfügt. Egal welchen Wert ich in das Entry Mode Set einfüge die Anzeige bleibt immer gleich. Es ändert sich überhaupt nichts. Muss das scrollen programmiert werden? MfG
hkhkjhkjhl schrieb: > Bei Set DRAM Adress wieso gehen die Adressen von 0-39D und von 64-103. Weil das so ist.
hkhkjhkjhl schrieb: > Ich habe im "Entry Mode Set" das "Shift of entire display" auf High > gesetzt. > > Jedoch shiftet bzw. scrollt das Display nicht egal ob ich über 16 oder > über 40 Zeichen einfügt. Das tut es auch nicht. Shift Display shiftet das ganze Display (so wie ich das Datenblatt gelesen habe). Allerdings nicht weil der Cursor über den rechten Rand rauskommt. Und ich hab ehrlich gesagt bis heute keinen einzigen Anwendungsfall gefunden, bei dem man diese Funktion sinnvoll einsetzen könnte. Für Laufschriften könnte das eventuell nützlich sein, ich mach sie trotzdem lieber konventionell.
Hi
>Muss das scrollen programmiert werden?
Manchmal geht es auch mit Handauflegen.
Aber mal ernsthaft, du solltest mal etwas langsamer machen. Nimm dir das
Datenblatt vo0m Displaycontroller und versuche es in Ruhe zu verstehen.
Du hast auch schon bemerkt, das man u.U. zwischen den Instruction Tables
umschalten muss?
MfG Spess
>Wenn du mit dem Lift vom 19. Stock und den 22. Stock fahren willst, >fährst du ja auch nicht erst ins Erdgeschoss, nur damit du immer von der >gleichen Statrposition aus zählen kannst. Das nicht aber ich denke es wär so einfacher gewesen als zuerst die Zeichen vom Text zu zählen und um die Differenz zu erhöhen damit ich in die nächste Zeile komme. >Shift Display shiftet das ganze Display Das komische ist dass es das auch nicht macht. Egal welchen Wert ich einfüge es fängt immer bei Position 0 an. D.h. wenn der Text größer als 16 Zeichen ist würdest du das selber programmieren dass der Text scrollt.
Hi >D.h. wenn der Text größer als 16 Zeichen ist würdest du das selber >programmieren dass der Text scrollt. Text passend machen oder ein anderes Display benutzen. Es sei den du willst mit dem Display spielen. Die Displays können übrigens nur horizontal scrollen. Also praktisch unbrauchbar. MfG Spess
hkhkjhkjhl schrieb: >>Wenn du mit dem Lift vom 19. Stock und den 22. Stock fahren willst, >>fährst du ja auch nicht erst ins Erdgeschoss, nur damit du immer von der >>gleichen Statrposition aus zählen kannst. > > Das nicht aber ich denke es wär so einfacher gewesen als zuerst die > Zeichen vom Text zu zählen und um die Differenz zu erhöhen damit ich in > die nächste Zeile komme. Das muss doch auch keiner! Wir wissen doch, bei welcher Adresse die 2.te Zeile anfängt! Die setze ich und gut ists. Wenn man die Adressberechnung dann noch einer Funktion anvertraut, dann kann man die Funktion aufrufen mit: Ich möchte gerne in der 2.ten Zeile, 8. Spalte anfangen Text auszugeben. Die Funktion rechnet aus diesen Angaben die DDRAM Adresse aus und setzt das LCD auf diese Position an, so dass die nächsten Ausgabe dann auch wirklich dort beginnt. Wieviel Text ich vorher an welcher Stelle auch immer ausgegeben habe, ist doch völlig uninteressant. Jetzt will ich in der 2.ten Zeile, 8.te Spalte schreiben, und dieser ANgabe entspricht eine DDRAM Adresse, die man berechnen kann. > D.h. wenn der Text größer als 16 Zeichen ist würdest du das selber > programmieren dass der Text scrollt. Wenn ich haben will dass er scrollt: Ja, klar. Der springende Punkt: Man will ja meistens haben, dass nur die erste Zeile scrollt und die 2.te nicht (bzw. umgekehrt). Und spätestens da macht das LCD auf keinen Fall mehr mit. Auch wenn ich den Text "***** 12345 The quick brown fox jumps over the lazy dog 67890 *****" durch eine LCD Zeile scrollen lassen will, komm ich mit dem LCD Speicher alleine nicht weit, weil der Text nun mal zu lang ist. (Und wenn nicht, dann konstruier ich halt noch einen längeren)
Bei sizeof nehme ich doch den Inhalt von data. Es zeigt aber immer nur 2 an. Wie kann ich die Größe vom string herauslesen.
1 | lcd string ("juhuuuuuuuu"); |
2 | |
3 | void lcd_string( const char *data ) |
4 | {
|
5 | int zeichen; |
6 | zeichen = sizeof(*data); |
7 | |
8 | while( *data != '\0' ) |
9 | lcd_data( *data++ ); |
10 | }
|
hkhkjhkjhl schrieb: > Bei sizeof nehme ich doch den Inhalt von data. Es zeigt aber immer nur 2 > an. Wie kann ich die Größe vom string herauslesen. Ähm. Du brauchst ein C-Buch http://www.mikrocontroller.net/articles/String-Verarbeitung_in_C Ausserdem kommt hierbei .... > zeichen = sizeof(*data); ... 1 raus. data ist ein Zeiger auf einen char also ist *data der char selber. Und ein char hat definitionsgemäss eine sizeof von 1
Nur dann, wenn du den String auch in Form eines Arrays zur Verfügung hast. Das hast du aber nicht. In der Funktion hast du nur einen Pointer zum String. Du kannst zwar die sizeof vom Pointer feststellen (die ist bei dir 2), aber das hilft dir nichts, wenn du die Stringlänge selber wissen willst.
Ich würde gerne die Zeichen im Speicher zählen. Jedoch beim SPI ist R/W fix auf HIGH. Habt ihr eine Idee wie man auf den Speicher zugreifen kann. MfG
Hi
>Habt ihr eine Idee wie man auf den Speicher zugreifen kann.
Geht mit SPI nicht. Du kannst dir aber einen Shadow-Ram (Abbild des
DDRAM) im RAM des Controllers anlegen.
MfG Spess
Hi
>Würdest du ein char_array oder malloc verwenden
Da ich in Assembler programmiere , keins von beiden. Außerdem halte ich
das bei Textdisplays für überzogen. Bei Grafikdisplays sieht das u.U.
anders aus.
MfG Spess
Wie verschiebt ihr die erste Zeile um eine Stelle nach links dass aber die zweite Zeile nicht beeinflusst wird.
Den Text drüberschreiben, eben um 1 Stelle versetzt. Wenn der Text "The quick brown fox jumps over the lazy dog" auf einem Display mit 8 Zeichen scrollen soll, dann wird eben im ersten Durchgang "The quic" ausgegeben. Im nächsten Durchgang kommt der Cursor wieder vorne hin und ausgegeben "he quick" dann wieder Cursor nach vorne und "e quick " " quick b" usw. usw. Ist doch für einen µC eine leichte Übung mit Schleifen, das zu erreichen. Hinweis: Wenn der Text von der Seite auch noch reinscrollen soll, ist es eine Möglichkeit, den zu scrollenden Text mit einer entsprechenden Anzahl Leerzeichen beginnen und enden zu lassen.
Also, wenn ich wirklich 'Mätzchen' auf dem Display machen wollen würde, würde ich mir im RAM des Controllers für jedes Zeichen auf dem Display ein Byte im RAM reservieren, darin 'herummalen' und regelmässig auf das Display kopieren. Diese ganzen eingebauten Schiebefunktionen des Displays habe ich bisher nur einmal genutzt: Als ich zum ersten Mal so ein Display in der Hand hatte und damit herumgespielt habe. Irgendwelche Menüs oder Ausgabewerte kann man auch 'on the fly' zusammenstellen und ausgeben. Das komplette Display, bei jedem Event. Gruß Jobst
Also eine Idee von mir war den Cursor um eine Stelle nach links zu verschieben und den ganzen Text wieder neu ausgeben. Oder was noch ginge wäre die SCROLL-Funktion zu aktivieren. Da aber die erste und zweite Zeile verschoben werden müsste ich das irgendwie durch UND und ODER verknüpfen damit die zweite Zeile gleich bleibt.
1 | char zeile_1[60]; |
2 | .
|
3 | .
|
4 | //Timer Interrupt
|
5 | setze_position(); //Cursor um eine Stelle nach links verschieben |
6 | lcd_string_ausgeben(zeile_1); |
7 | .
|
8 | .
|
Für was würdest du Schleifen benützen?
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.