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
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 ...
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.
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). ...
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
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?
Geht das nicht besser über eine Tabelle, in der die Positionen stehen? Ralf
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.