LCD-Lauflicht

Gast #580912
Lesenswert?

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?
#580973
Lesenswert?

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.
#581091
Lesenswert?

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.
Gast #581283
Lesenswert?

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


Gast #581286
Lesenswert?

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
#581342
Lesenswert?

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
#581358
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren