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?
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.