Forum: Mikrocontroller und Digitale Elektronik Zeilenumbruch beim Display


von Reinhard S. (ice-t4life)


Lesenswert?

Hi,
ich habe eine Frage zum Tut bezüglich LCD. Ich wollte wissen, wie man
einen Zeilenumbruch Programmiert. Finde leider nirgends etwas passendes
dazu.

LCD ist ein 16x2 den ich über 4bit (also genau so wie im Tut)
ansteuere. Aber ich glaub das ist eh kaum wichtig.

MFG

von Hannes L. (hannes)


Lesenswert?

Zeilenumbruch ist schwierig, da musst du schon im Controller mitzählen.
Ich nutze dafür ein "Locate-Macro", das die Ausgabeposition des LCDs
setzt und achte darauf, dass der auszugebende Text in die Zeile passt.
Beispiel (aber anderes LCD):
http://www.hanneslux.de/avr/zuenduhr/index.html

...

von Reinhard S. (ice-t4life)


Lesenswert?

hmm, ist das wirklich so umständlich um in die nächste Zeile des
Displays zu kommen? Ich dache, dass ist ein einfacher Code, der Binär
einfach über die 4bit übertragen wird.

In deiner Routine habe ich leider nich viel zum Zeilenumbruch gefunden.

von Hannes L. (hannes)


Lesenswert?

Schau mal in die Datenblätter einiger mehrzeiliger Punktmatrix-LCSs.
Schau besonders nach der Zuordnung DD-RAM/Anzeigeposition.

Dann wirst du schnell feststellen, dass da Einiges ziemlich
durcheinander geraten ist. Meist sind die Speicherbereiche für die
Zeilen länger als die Zeilen selbst, das bietet die Möglichkeit des
Horizontal-Scrollings (nutze ich aber nicht), erschwert aber den
Zeilenumbruch.

Selbst das 8x24-LCD im Beispiel hat einen ziemlich verschachtelten
Aufbau. Wenn man linear ins DD-RAM schreibt, dann erscheint der Text
nacheinander in Zeile 0, 4, 1, 5, 2, 6, 3, 7.

Die Displays mit HD44780 sind da teils noch krasser verschachtelt. Beim
2x16 sind pro Zeile meist 40 DD-RAM-Zellen reserviert.

Sicher wäre es schön, wenn man mit einem CR (Steuerzeichen 13) an den
Anfang der neuen Zeile springen könnte, aber das ist nunmal leider
nicht so.

Das oben genannte Locate-Macro befindet sich in der Include-Datei mit
den LCD-Routinen (http://www.hanneslux.de/avr/zuenduhr/LCD_8x24.inc).

...

von Stevko (Gast)


Lesenswert?

Hallo Reinhard,

anbei 2 Routinen fürs normale LCD.


;---------------------------------------------------------------------
;Cursor in Zeile 1, Spalte wird mit R16 übergeben
lcd_line1:
  push R16
  push R17
  push R18
  ;prüfen ob LCD-Inhalt geschoben
  ldi R18,LCD_Push_Range
  lds R17,LCD_Status_Flag
  sbrc R17,LCD_is_push
    add R16,R18
  ori R16, 0b10000000  ;eigentlicher Befehl
    rcall lcd_command
  pop R18
  pop R17
  pop R16
ret
;---------------------------------------------------------------------
;Cursor in Zeile 2, Spalte wird mit R16 übergeben
lcd_line2:
  push R16
  push R17
  push R18
  ;prüfen ob LCD-Inhalt geschoben
  ldi R18,LCD_Push_Range
  lds R17,LCD_Status_Flag
  sbrc R17,LCD_is_push
    add R16,R18
    ori R16, 0b11000000
    rcall lcd_command
  pop R18
  pop R17
  pop R16
ret
;---------------------------------------------------------------------


Gruß
  Stevko

von Reinhard S. (Gast)


Lesenswert?

wo muss ich deine Routine dann einbinden? In der aus dem Tutorial?
Und wo muss dann der befehl rcall lcd_line1 bzw rcall lcd_line2 hin?
Ich habs jetzt mal versucht, aber da fehlt ja noch das zeugs mit dem
Stack. Kannst du mir da weiter helfen?

von Ralf (Gast)


Lesenswert?

Geht das nicht besser über eine Tabelle, in der die Positionen stehen?

Ralf

von Stevko (Gast)


Lesenswert?

Hallo Reinhard,

gehe bitte auf die Conrad-Seite und suche folgende Artikelnummer:

      183342 - 62 (=LCD 16x2).


Dort gibt es das Datenblatt und davon druckst Du Seite 16-24 aus.
Die Erklärung der Befehle ist leicht nachvollziehbar, denn bei meinem
Code-Bespiel wird der Displayinhalt teilweise nach rechts geschoben.
Ich helfe Dir schon, nur muß jetzt mal kurz weg.

Gruß
  Stevko

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
Noch kein Account? Hier anmelden.