LCD Laufschrift

OP #1599542
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?
Gast #1599622
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.
Gast #1663679
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);
  }
}
#1663692
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
Gast #1664007
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
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.