mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Hilfe zu einem Programm


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Anfänger158 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;}

}

}

Autor: Dominik K. (kilo81)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein lcd_clear() wird jedes Mal aufgerufen solange der Zähler 0,1,2,3 
oder 4 ist.

Wenn du lcd_clear() hingegen nur bei einem Tastendruck aufrufst, dann 
wird es auch nur bei einem Tastendruck aufgerufen.

Autor: Anfänger158 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey vielen Dank das Funktioniert jetzt.

Jetzt schreibt er mir allerdings ständig das Display mit dem selben text 
voll.

Autor: Dominik K. (kilo81)
Datum:

Bewertung
0 lesenswert
nicht 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.

: Bearbeitet durch User
Autor: Anfänger158 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dominik K. (kilo81)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal:
was ist "lcd_write_s"? Warum muss hier keine setcursor Anweisung gegeben 
werden?

Wie viele Zeilen hat dein Display?
lcd_setcursor(0,2) sagt mir, dass er den Wert in die 3. Zeile schreiben 
soll!

(0,0) 1. Zeile
(0,1) 2. Zeile
(0,2) 3. Zeile
(0,3) 4. Zeile

Autor: Anfänger158 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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++;
  }
}

Autor: Dominik K. (kilo81)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie hast du denn die Taster angeschlossen?
Gegen Masse oder gegen Vcc?
Sind die int. Pullups am PortB aktiviert oder nicht?

Und was genau wird auf das LCD geschrieben? Welcher Text, welche 
Zeichen?

Autor: Anfänger158 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Hilfe bisher.
Hab jetzt selbst rausgefunden was mein fehler war.

Autor: Dominik K. (kilo81)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und der wäre?

Autor: W.S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Feldkurat K. (feldkurat)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
W.S. schrieb:
> Natürlich muß die nicht zwingend
> clreol() heißen, was anderes, z.B. karlheinz() ginge auch.

Wenn die Funktion ab der letzten Schreibposition löscht, dann nenne sie 
doch "Moderator". Der tut das Gleiche.

SCNR

:-/

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.