Hilfe zu einem Programm

Gast #5402364
Lesenswert?

hallo,

Ich habe ein kleines menü für das LCD display geschrieben.
Ich verwende das MY avr MK2 board mit atmege 8.
Meine frage wäre, wie ich das Blinken(aktualisiern) des Display weg 
bekomme.
Hier der Programm code

  while(1){

  if (!(PINB & (1<<PB0)))
    {
      zaehler++;
    }

    if (!(PINB & (1<<PB1)))
    {
      zaehler--;
    }




  if (zaehler == 0)
  {
  lcd_clear();
  lcd_write_s("Drahtmessung");
  if (!(PINB & (1<<PB0)))
    {
      zaehler++;
      _delay_ms(300);
    }
  }
    else if (zaehler == 1)
    {
    lcd_clear();
    lcd_write_s("Messung Starten");
    if (!(PINB & (1<<PB0)))
    {
      zaehler++;
      _delay_ms(300);
    }

    if (!(PINB & (1<<PB1)))
    {
      zaehler--;
      _delay_ms(300);
    }

    }
      else if (zaehler == 2)
      {
      lcd_clear();
      lcd_write_s("Messung Beenden");
      if (!(PINB & (1<<PB0)))
    {
      zaehler++;
      _delay_ms(300);
    }

    if (!(PINB & (1<<PB1)))
    {
      zaehler--;
      _delay_ms(300);
    }

      }
        else if (zaehler == 3)
        {
        lcd_clear();
        lcd_write_s("Verarbeitete M.:");
            lcd_write_s(itoa(Meter, buffer0, 10));
        if (!(PINB & (1<<PB0)))
    {
      zaehler++;
      _delay_ms(300);
    }

    if (!(PINB & (1<<PB1)))
    {
      zaehler--;
      _delay_ms(300);
    }

        }

          else if (zaehler == 4)
          {
          lcd_clear();
          lcd_write_s("Geschwindigkeit:");
          lcd_write_s(itoa(Geschwindigkeit, buffer0, 10));


    if (!(PINB & (1<<PB1)))
    {
      zaehler--;
      _delay_ms(300);
    }

          }

  else {zaehler = 0;}

}

}
#5402392
Lesenswert?

Richtig!
Dafür gibt es viele Lösungsansätze im Netz zu finden.

Du kannst da natürlich auch tricksen und den alten Wert mit Leerzeichen 
überschreiben.
Beispiel:

"Drahtmessung    "
"Messung Starten "
"Verarbeitete M.:"
"Geschwindigkeit:"

So ist jede Bezeichnung "gleich lang". DRAHTMESSUNG überschriebt quasi 
alle anderen Bezeichnungen durch die angefügten Leerzeichen.
Gast #5402482
Lesenswert?

habe das menue jetzt mal so angepasst das Zählen als unterprogramm für 
die übersicht:
int zaelen(void)
{
  if (!(PINB & (1<<PB0)))
    {
      zaehler++;
      lcd_clear();
      _delay_ms(300);
    }

    if (!(PINB & (1<<PB1)))
    {
      zaehler--;
      lcd_clear();
      _delay_ms(300);
    }

und das hauptprogramm:

while(1){

  if (zaehler == 0)
  {

  lcd_write_s("Drahtmessung    ");
  if (!(PINB & (1<<PB0)))
    {
      zaehler++;
      _delay_ms(300);
    }
  }
    else if (zaehler == 1)
    {

    lcd_write_s("Messung Starten ");
    zaelen();

    }


      else if (zaehler == 2)
      {

      lcd_write_s("Messung Beenden ");
      zaelen();

      }
        else if (zaehler == 3)
        {

        lcd_write_s("Verarbeitete M.:");
        lcd_setcursor(0,2);
            lcd_string(itoa(Meter, buffer0, 10));
        zaelen();

        }

          else if (zaehler == 4)
          {

          lcd_write_s("Geschwindigkeit:");
          lcd_setcursor(0,2);
          lcd_string(itoa(Geschwindigkeit, buffer0, 10));
          zaelen();



          }

  else {zaehler = 0;}

Jetzt schreibt er mir allerdings beide Zeilen und alle Zeichen des 
Display voll. Der Text wird immer wiederholt.
Gast #5402505
Lesenswert?

Bei der von mir verwendet Bibliothek ist
(0,1) 1. Zeile
(0,2) 2. Zeile
Habe 2 Zeilen

Auszug aus der Bibliothek
*
 * lcd_write(..) - sendet eine Zeichenkette an LCD
 */
void lcd_write_s(char *buf)
{
  while(buf[0]!='\0') {
    lcd_write(buf[0]);
    buf++;
  }
}
Gast #5403983
Lesenswert?

Anfänger158 schrieb:
> Auszug aus der Bibliothek

Ich geb dir nen dringenden Rat: schreibe dir deinen LCD-Treiber um, und 
zwar so, daß er die Schreib-Position mitführt, sodaß du mit einer 
Funktion clreol() (die du dir selber schreibst) die Zeile ab aktueller 
Position bis zum Ende ablöschen kannst. Natürlich muß die nicht zwingend 
clreol() heißen, was anderes, z.B. karlheinz() ginge auch. Hauptsache du 
kannst dir den namen gut merken.

W.S.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren