Also ich hab nun erfolgreich das AVR Tut bis zum Punkt LCD abgeschlossen und da mal ne Frage: Habe ein 2x24 LCD und möchte nun z.B. nen Text ÜBER 24 Zeichen laufen lassen in der gleichen Zeile der sich wieder holt. Klingt simpel aber ich hab keine Ahnung wie ich das umsetzen kann. Daher: Ich suche Inspiration und Hilfe um auf die Sprünge zu kommen. Verlange keinen fertigen Code! Schnipsel reichen denke auch ansonsten lern ich ja nix.
Ist eigendlich ganz einfach: Du hast ja das LCD schon angesteuert bekommen. Jetzt schreibst du einfach den Text auf das Display und zwar in der Reinfolge 1. Buchstabe = 1. Zeichen usw.. Jetzt nimmst du den Timer und jede Sekunde schickst du den Text nochmal. Diesmal setzt du den 1.Buchstaben an die 2.Stelle des LCD und den letzten lässt du weg oder aber setzt ihn an die erste Stelle. Du lässt es einfach so laufen, das es sich jedesmal alles um eine Stelle verschiebt. Wenn du willst das er von hinten nach vorne läuft müsstest du es umgekehrt machen. Leider kann ich dir mit Code nicht helfen ich kann "nur" C/C++. Assambler war mir wenn ich ehrlich bin immer etwas zu naja sagen wir nicht hochsprachlich genug ^^ Ich hoffe du kannst was damit anfangen. 12345678901234 Hello World Hello World Hello World Hello World d Hello Worl ld Hello Wor rld Hello Wo orld Hello W Gruß ErgoProxy
Anfangen? KLAR Nur Kapitel "Timer" hab ich noch nit gelesen. PS: lerne nur ASM wegen Allgemeinverständnis
Hallo, in ASM halte ich das immer so: Ram für die Länge des Textes + ein Leerzeichen + ein 0 Byze im Ram reservieren und den Text + Leerzeichen da rein. Also z.B. Am Ende ist ein Leerzeichen und ein Nullbyte. Den Kram in einen Puffer im SRAM ablegen.
1 | buffer: .byte xx Buffer im SRAM, xx maximale Textlänge + 2 |
2 | Die 2 Byte sind für ein Leerzeichen und ein 0-Byte am Ende. |
3 | Den Text in den buffer kopieren und Space und \0 hinten dran. |
4 | |
5 | Das ist ein langer Text, der ausgegeben werden soll \0 |
6 | |
7 | .equ lCD_LEN = 26 |
8 | .equ TEXT_LEN = 80 |
9 | |
10 | .def r16 COUNT |
11 | .def r17 TEMP |
12 | |
13 | .desg |
14 | buffer: .byte TEXT_LEN |
15 | |
16 | ld ZL, low(buffer) |
17 | ld ZH, high(buffer) ; Zeiger auf Textanfang. |
18 | |
19 | ausgabe: |
20 | ldi COUNT, LCD_LEN ; Länge der Displayzeile |
21 | |
22 | ausgabe_loop: |
23 | ld TEMP,Z+ ; Byte holen |
24 | tst TEMP ; auf 0 testen (Ende buffer) |
25 | brne ausgabe_ok ; nein, ausgeben |
26 | |
27 | ld ZL, low(buffer) |
28 | ld ZH, high(buffer) ; Zeiger wieder auf Textanfang. |
29 | rjmp ausgabe_loop ; und Zeichen von dort holen |
30 | |
31 | ausgabe_ok; |
32 | rcall lcd_out ; Zeichen zum Display |
33 | dec r16 ; Zeile komplett? |
34 | brne ausgabe_loop ; nein, weiter |
35 | ... |
Passt zu jeder Zeilen- und Textlänge. Gruß aus Berlin Michael
Vielen Dank da hab ich ja was zum drüber grübeln!
.desg buffer: .byte TEXT_LEN kann es ein das du dich da vertippt hast? weil desg kennt das AVR Studio nicht
Hallo, ja, Tippfehler... .equ lCD_LEN = 26 muß natürlich 24 sein bei 24 Zeichen/Displayzeile... und dec r16 ; Zeile komplett? sollte besser dec COUNT heißen, der Lesbarkeit wegen... Ich verspeche auch nicht Fehlerfreiheit, der Ablauf sollte aber nachvollziehbar sein. Ob man Z dafür reserviert halten kann, ist auch von der konkreten Anwendung ab, sonst eben in 2 SRAM-Plätzen sichern. Der Text kann natürlich auch im Flash liegen, dann eben lpm benutzen usw. usw. Das zusätzliche Leerzeichen kann ist, damit nach dem Textende nicht sofort der Anfang folgt. Kann man auch anders lösen, z.B. so: [pre} ... brne ausgabe_ok ; nein, ausgeben ld ZL, low(buffer) ld ZH, high(buffer) ; Zeiger wieder auf Textanfang. ldi TEMP,' ' ; Leerzeichen als Trennung laden ausgabe_ok; [/pre] Spart ein Byte im Ram. Gruß aus Berlin Michael
Vielleicht auch mal über die Scrollfunktion des LCDs nachdenken. Das LCD hat 2 mal 40 Zeichen Anzeige-RAM, aber nur 2 mal 24 Zeichen Anzeigeplatz auf dem Glas. Da lässt sich was scrollen... Ich nutze das Scrollen aber nicht, ich benutze dafür einen Bildschirmspeicher im SRAM des AVRs (Update des realen LCDs erfolgt im Millisekundentakt im Hintergrund), was die Ausgaberoutinen sehr schnell macht. Da bereitet versetztes Neuschreiben des Textes keine Probleme. Das kann z.B. durch einen zusätzlichen Offset beim Adressieren der Texte im Flash erfolgen. Ein Beispiel kann ich jetzt nicht liefern, ich hatte diese Funktion bisher noch nicht gebraucht. KH
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.