www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD Laufschrift


Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte gerne einen Text vom rechten Rand ins LCD scrollen lassen.
Dabei dachte ich mir müßte das ja simpel mit einer for-Schleife 
funktionieren:
        for(int x=15;x<=0;x--)
        {
          lcd_gotoxy(x,0);
          lcd_puts("123456789123456");
          _delay_ms(300);
        }
Nur tuts das nicht. Wieso? Weil der Text über das Display hinaus geht?

Autor: Volker Schulz (volkerschulz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manfred W. schrieb:
> Nur tuts das nicht. Wieso? Weil der Text über das Display hinaus geht?

Davon kannste wohl ausgehen.. Bei einem mehrzeiligen Display geht's 
vermutlich einfach in der naechsten Zeile weiter...


Vlker

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manfred W. schrieb:
> Nur tuts das nicht.

und wieder ein Kandidat für die Fehlerbeschreibung des Monats!

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Wachtler schrieb:
> Manfred W. schrieb:
>> Nur tuts das nicht.
>
> und wieder ein Kandidat für die Fehlerbeschreibung des Monats!

Dachte ich bin schon ganz obenn :)

Autor: MagIO (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
for(int x=15;x<=0;x--)

vielleicht eher

for(int x=15;x>=0;x--)

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Manfred W.:
zumindest auf dem besten Weg :-)
Die Konkurrenz ist noch stark...

Autor: Volker Schulz (volkerschulz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MagIO schrieb:
> vielleicht eher
> for(int x=15;x>=0;x--)

Vielleicht.. aber die Loesung wird auch das nicht sein! ;)


Volker

Autor: MagIO (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso nicht? Solange die Bedingung nicht true ist, wird die for-Schleife 
nichts machen, oder?

Autor: Martin e. C. (eduardo)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Klaus,

anbei ein Beispiel von Laufschrift, analisiere bitte, main.c und 
lcd-routines.c (hier ganz unten), vergleiche es mit dein Code und 
vielleichst wird dann gehen!

Gruß
Martin

Autor: Volker Schulz (volkerschulz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MagIO schrieb:
> Wieso nicht? Solange die Bedingung nicht true ist, wird die for-Schleife
> nichts machen, oder?

Nene, Dein Einwurf war schon korrekt... Loest aber eben nur ein Teil des 
Problems.


Volker

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Volker Schulz schrieb:
> MagIO schrieb:
>> vielleicht eher
>> for(int x=15;x>=0;x--)
>
> Vielleicht.. aber die Loesung wird auch das nicht sein! ;)
>
>
> Volker

Funktioniert doch.
Wo ist das Problem?

Autor: Volker Schulz (volkerschulz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manfred W. schrieb:
> Funktioniert doch.
> Wo ist das Problem?

Hatte ich doch schon geschrieben:

Wenn Du Zeichen ueber die Zeilenbreite hinaus schreibst, tauchen sie in 
der naechsten Zeile auf (jedenfalls bei einem 
industriestandard-kompatiblen Controller).


Volker

Autor: Martin e. C. (eduardo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin e. C. schrieb:
> Hallo Klaus,

Sorry,  wollte Manfred W. schreiben nicht Klaus!

Autor: MagIO (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kommt darauf an welches Display er hat. Mit nem 4x16(4x20) wirds wohl in 
die nächste Zeile reinschreiben. Mit nem 2x16 sollte es gehen, da dort 2 
Screens ins RAM passen.

Es sei denn lcd_puts macht den Zeilenumbruch automatisch, da kenne ich 
mich nicht aus ... ich hab meine Displays momentan mit nem Propeller am 
Start.

Autor: Volker Schulz (volkerschulz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nagut, dann verschieben wir DAS Problem auf einen spaeteren Zeitpunkt 
(Wenn Manfred ein 4-Zeilen Display gekauft hat oder tatsaechlich mal 
Gebrauch vom zweiten Screen machen will). ;)


Volker

Autor: Holland (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also bei meiner Laufschrift lässt sich die Länge der Zeichen einstellen. 
Vll hilft das ja weiter. Mein Problem ist nur, dass dieses 
_delay_ms(300) in einer Schleife den Prozessor natürlich voll auslastet. 
Weiß da evtl. jemand wie man das beseitigen könnte?

void lcd_write_rot(int row, int cal, char* pText, int laenge)
{
  int offset=0;
  for(int i=0;i<strlen(pText)-laenge+1;i++)
  {
    for(int j=i;j<laenge+i;j++)
    {
      lcd_goto(row,cal+offset);//Zeichenposition setzen
      lcd_write(pText[j]);  //Zeichen schreiben
      offset++;
    }
    offset=0;
    _delay_ms(300);
  }
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Holland schrieb:
> Also bei meiner Laufschrift lässt sich die Länge der Zeichen einstellen.
> Vll hilft das ja weiter. Mein Problem ist nur, dass dieses
> _delay_ms(300) in einer Schleife den Prozessor natürlich voll auslastet.
> Weiß da evtl. jemand wie man das beseitigen könnte?

So wie alle _delays beseitigt werden: Mit einem Timer, der einen 
Basistakt erzeugt und völliger Umstrukturierung der 
Problemlösestrategie.
Weg von: Ich erledige eine Aufgabe indem ich morgends anfange und abends 
aufhöre.
Hin zu: Ich habe einen Zeittakt und und seh mir bei jedem Ticken dieser 
Uhr an, was es jetzt gerade zu tun gibt.

In dem Fall: Weg von for-Schleifen
Hin zu: Es ist eine 1/3 Sekunde vergangen, welcher Text muss jetzt aufs 
Display

Autor: Holland (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke... so funktionierts jetzt auch schön ohne den Prozessor ständig 
voll auszulasten ;)

wen es noch interessiert.. so siehts jetzt aus (i wird alle 300ms von 
einem timerinterrupt inkrementiert)
void lcd_write_rot(int row, int cal, char* pText, int laenge)
{
  cli();
  int offset=0;
  
  if(i==strlen(pText)-laenge+1) i=0;
  
  for(int j=i;j<laenge+i;j++)
  {
    lcd_goto(row,cal+offset);    //Zeichenposition setzen
    lcd_write(pText[j]);      //Zeichen schreiben
    offset++;
  }
  offset=0;
  sei();
} 

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.