Forum: Mikrocontroller und Digitale Elektronik LCD Laufschrift


von Lokus P. (derschatten)


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:
1
        for(int x=15;x<=0;x--)
2
        {
3
          lcd_gotoxy(x,0);
4
          lcd_puts("123456789123456");
5
          _delay_ms(300);
6
        }
Nur tuts das nicht. Wieso? Weil der Text über das Display hinaus geht?

von Volker S. (volkerschulz)


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

von Klaus W. (mfgkw)


Lesenswert?

Manfred W. schrieb:
> Nur tuts das nicht.

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

von Lokus P. (derschatten)


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 :)

von MagIO (Gast)


Lesenswert?

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

vielleicht eher

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

von Klaus W. (mfgkw)


Lesenswert?

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

von Volker S. (volkerschulz)


Lesenswert?

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

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


Volker

von MagIO (Gast)


Lesenswert?

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

von Martin e. C. (eduardo)


Angehängte Dateien:

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

von Volker S. (volkerschulz)


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

von Lokus P. (derschatten)


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?

von Volker S. (volkerschulz)


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

von Martin e. C. (eduardo)


Lesenswert?

Martin e. C. schrieb:
> Hallo Klaus,

Sorry,  wollte Manfred W. schreiben nicht Klaus!

von MagIO (Gast)


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.

von Volker S. (volkerschulz)


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

von Holland (Gast)


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);
  }
}

von Karl H. (kbuchegg)


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

von Holland (Gast)


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)
1
void lcd_write_rot(int row, int cal, char* pText, int laenge)
2
{
3
  cli();
4
  int offset=0;
5
  
6
  if(i==strlen(pText)-laenge+1) i=0;
7
  
8
  for(int j=i;j<laenge+i;j++)
9
  {
10
    lcd_goto(row,cal+offset);    //Zeichenposition setzen
11
    lcd_write(pText[j]);      //Zeichen schreiben
12
    offset++;
13
  }
14
  offset=0;
15
  sei();
16
}

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.