Forum: Mikrocontroller und Digitale Elektronik Countdown Balken auf Display


von Michael (Gast)


Lesenswert?

Moin

Ich möchte für meine Anwendung beim Start zunächst einen Balken auf dem 
Display darstellen der immer kleiner wird und wenn er ganz weg ist soll 
das eigentliche Programm starten.
Irgendwie bekomme ich keinen Balken hin wenn ich eine Schleife einsetze 
die Rückwärts von 10 bis 1 zählen soll; der Balken bleibt immer 10 
Zeichen lang.
Wenn ich eine Schleife einbaue die Vorwärts von 1 bis 10 zählt 
funktioniert es, d.h der Balken wird immer größer.

Sieht jemand meinen Fehler? Ich kann mir da irgendwie keinen Reim drauf 
machen...
1
// Countdown
2
// Balken ####### darstellen und kleiner werden lassen
3
 uint8_t schleife;
4
 char str1[11]="";
5
 char str2[10]="##########";
6
 
7
 for (schleife=10; schleife>0; schleife--){   //rückwärts Schleife
8
//for (schleife=1; schleife<10; schleife++){   //vorwärts Schleife
9
   strncpy(str1, str2, schleife);
10
11
   str1[11]='\0'; //String abschließen
12
   lcd_string(str1);
13
   _delay_ms(500); //500ms warten
14
   _delay_ms(500); //500ms warten
15
   set_cursor(0,1);
16
   lcd_clear();
17
  } //for schleife1

Gruß
Michael

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

str2 ist zu kurz

Einfach
1
const char balken[] = "########## ";

Und auf's LCD wird balken+i ausgegeben. strcpy ist überflüssig. Beachte 
das Leerzeichen am Ende von Balken, das das letzte # überschreibt.

Johann

von Michael (Gast)


Lesenswert?

Hallo Johann

Danke für die Info. Nach kurzem Nachdenken scheint die Lösung recht 
simpel...

Ich habe es so umgesetzt:
1
  lcd_clear();
2
  const char balken[] = "########## ";
3
  for (i=10; i>0; i--){  //rückwärts Schleife
4
  //for (i=0; i<10; i++){     //vorwärts Schleife
5
     lcd_string(balken[i]);
6
     _delay_ms(500); //500ms warten
7
     _delay_ms(500); //500ms warten
8
    }

Das für mich im Moment unverständliche ist, daß sowohl bei der rückwärts 
Schleife, als auch bei der vorwärts Schleife der Balken auf dem Display 
immer länger wird. Nicht wie ich es beabsichtigt habe bei 10 Zeichen 
anfängt und dann bis auf ein Zeichen runtergeht.

Wenn ich das richtig interpretiere sollte z.B. bei 
lcd_string(balken[10]) auch 10 Zeichen ausgegeben werden, oder habe ich 
das mißverstanden??

Gruß
Michael

von MichiB (Gast)


Lesenswert?

Es wir bei jedem Aufruf von

lcd_string(balken[i]);

ein Zeichen dem Display hinzugefügt. Hierbei ist es egal wie deine 
Schleife aussieht.

Ich glaubr das sollte gehen:
  char balken[] = "          ";
  for (i=0; i<10; i++)
  {
     balken[i] = "#"
     for (j=0; j<10; j++)     lcd_string(balken[j]);
  }
  _delay_ms(500); //500ms warten
  _delay_ms(500); //500ms warten

Un rückwärts
  char balken[] = "##########";
  for (i=10; i>0; i--)
  {
     balken[i] = " "
     for (j=0; j<10; j++)     lcd_string(balken[j]);
  }
  _delay_ms(500); //500ms warten
  _delay_ms(500); //500ms warten

von MichiB (Gast)


Lesenswert?

Ach so,

die delays müssen natürlich in die Schleifen und du musst das Doisplay 
löschen nach den delays.

von Sascha (Gast)


Lesenswert?

Hallo,

oder so ...

set_cursor(0,1);
lcd_string("##########")
  for (i=10; i>0; i--)
  {
   set_cursor(0,i+1);
   lcd_string(" ");
   //pause
  }

Sascha

von Michael (Gast)


Lesenswert?

Es funktioniert jetzt. Danke an alle. :-)
Ich habe es jetzt so umgesetzt:

1
  lcd_clear();
2
  set_cursor(0,1);
3
  char balken[] = "##########";
4
  lcd_string(balken);
5
  for (i=10; i>0; i--){
6
     balken[i] = " ";
7
     for (j=0; j<10; j++){
8
       set_cursor(j,1);
9
       lcd_string(balken[j]);
10
       }
11
     _delay_ms(500); //500ms warten
12
     _delay_ms(500); //500ms warten
13
     }
14
  lcd_clear();

Noch einen schönen Sonntag Abend
Michael

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.