Hallo, kann ich mit LCD-Befehlen erreichen, dass ein Text von links nach rechts durchläuft und nach dem Verschwinden wieder links erscheint, Buchstabe für Buchstabe? Also so, dass der Text quasi eine Runde dreht. Mir ist bekannt, dass man das über einen String mit Leerzeichen an den Enden realsieren kann, indem man immer nur einen Teil des Strings überträgt und einen Counter mitlaufen lässt. Mich würde jetzt interessieren, ob es auch eine Lösung gibt, wenn man keine Leerzeichen in den Text einbaut, sondern ohne Tricks die LCD-Kommandos bemüht. Den Text kann ich ja mit einer Rechtsverschiebung des Displays schonmal bis ans Ende durchlaufen kassen. Nur wie lasse ich ihn dann Buchstabe für Buchstabe wieder am linken Rand erscheinen?
Ich Denke nicht das der Displaycontroller so Inteligent ist und das schon von Haus aus kann, aber kannst ja mal im Datenblatt nachsehen.
Was fehlt den bei der Frage wohl für eine Angabe? Warum schaffen es nur die wenigsten vernümpftige Fragen zu stellen? Ist das denn so schwer?
gebt ihm schnell ein Wildschwein... ich vermute mal ein HD44780-kompatibler Controller? wenn man zwei Zeilen laufen lasen will, muß man berücksichtigen, dass da ein nicht sichtbaren Zwischenraum im Speicher ist. Am einfachsten speichert man den Buchstaben zweimal in den Controller, unten rechts und oben im unsichtbaren Teil auch rechts, dann läuft der gerade heraus, wenn er unten links verschwindet. Genauso müßte ein Bchstabe von oben links nach unten rechts wieder kommen, dann wären drei Abspeicherungen desselben Zeichens nötig.
war Quatsch, für ein wrap-around muß man den Buchstaben oben links lesen und unten rechts wieder reinschreiben oder alles wird im Mikrocontroller nochmal parallel abgelegt, das geht vermutlich schneller als ein Lesezugriff auf den HD44780
Der Text soll nicht in der zweiten Zeile weiter laufen, sondern nach dem Rauslaufen aus der ersten Zeile wieder vorne in der selben Zeile anfangen. Der Controllertyp ist natürlich ein HD.
Der HD44780 kennt doch diese "Shift display" Anweisungen. Wenn sich die Länge des Speichers vom Displaycontroller (Hab' grade nicht im Kopf wie viel das ist... 80 Zeichen oder sowas?) ganzzahlig durch die Länge deines Textes teilen lässt, kannst du einfach den ganzen Display-RAM mit deinem Text vollschreiben und dann andauernd schieben. Wenn es nicht aufgeht, könntest du halt Leerzeichen reinschreiben bis es wieder passt, gibt dann aber natürlich jeweils Abstände zwischen den Texten.
Hallo, alles komisch irgendwie, liegt sicher an der Wärme. ;) @Philipp Burch: nicht machbar, wenn man z.B. nur in einer Zeile scrollen will und in den anderen Text stehen soll... Textbuffer im SRAM anlagen für maximale Textlänge, wenn man den so anlegt, daß er komplett per Low-Byte adressiert werden kann, spart das Aufwand und 256 Textzeichen sollten ja reichen. Platz für Position (Low-Byte des Buffers) reservieren, mit Anfang des Buffers initialisieren. Zum Scrollen dann Position nach ZL, High-Byte nach ZH, Zähler mit Zeilenlänge laden Loop: Char aus (Z) holen und ausgeben, ZL +1 wenn ZL = (Bufferende+1) -> ZL auf Bufferanfang Zähler -1 Wenn Zähler nicht 0 -> weiter im Loop Position holen, Position +1, wenn Position = Buffer
1 | .include ("m8def.inc") |
2 | |
3 | .def temp = r16 |
4 | .def Position = r17 |
5 | .def Counter = r18 |
6 | |
7 | .equ LINE_LEN = 16 ; Displayzeilenlänge |
8 | |
9 | .DSEG |
10 | .ORG $100 |
11 | Buffer: .byte 100 ;maximale Textlänge |
12 | |
13 | .CSEG |
14 | Init: |
15 | ldi Position,low(Buffer) ; mit Textbeginn anfangen |
16 | |
17 | Scroll: |
18 | ldi ZH,high(Buffer) |
19 | mov ZL,Position |
20 | ldi Counter,LINE_LEN ; Anzahl Zeichen pro Zeile |
21 | |
22 | ld temp,Z ; erstes Byte holen, ob überhaupt was da ist... |
23 | tst temp ; 0-Byte? |
24 | breq Scroll_end ; ja, nichts machen |
25 | |
26 | Loop: |
27 | ld temp,Z+ |
28 | tst temp ; 0-Byte ? |
29 | brne text_ok ; nein, ausgeben |
30 | |
31 | ldi ZL,low(Buffer) ; zurück auf Anfang |
32 | rjmp Loop ; und nochmal ein Byte holen |
33 | |
34 | text_ok: |
35 | rcall display_out_char |
36 | dec Counter |
37 | brne Loop |
38 | |
39 | inc Position ; nächster Start ab nächster Position |
40 | mov ZL,Position ; Nach Z zum Test, ob 0-Byte |
41 | ld temp,Z |
42 | tst temp ; 0-Byte, also nächste Runde ab Anfang |
43 | brne Scroll_end |
44 | |
45 | ldi Position,low(Buffer) ; mit Textbeginn anfangen |
46 | |
47 | Scroll_end: |
Den Text in den Buffer schreiben, muß mit 0-Byze enden Die Scrollroutine im passenden Abstand aufrufen Aufräumen, Fehler suchen und optimieren nach belieben... Gruß aus Berlin Michael
mit bascom ist das super easy Dim A As Byte Config Lcd = 16 * 2 Lcd "Shift this." 'display this at the lower line Wait 1 For A = 1 To 10 Shiftlcd Right 'shift the text to the right Wait 1 'wait a moment Next
MR wrote: > mit bascom ist das super easy > > Dim A As Byte > Config Lcd = 16 * 2 > > Lcd "Shift this." 'display > this at the lower line > Wait 1 > For A = 1 To 10 > Shiftlcd Right 'shift the > text to the right > Wait 1 'wait a > moment > Next Lies dir noch mal die Aufgabenstellung durch
MR wrote: > habe ich mit > do > endlosschleife > loop > sollte es gehen Kann ich mir nicht vorstellen. Wo werden zb. die Buchstaben die rechts rausfallen links wieder eingesetzt? Ausserdem ist das ein bischen blöd, wenn nur in der ersten Zeile eine Laufschrift sein soll und die zweite Zeile einen statischen Text anzeigen soll, der dann ebenfalls mitgeschoben wird.
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.