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;} } }
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.
Hey vielen Dank das Funktioniert jetzt. Jetzt schreibt er mir allerdings ständig das Display mit dem selben text voll.
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
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.
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
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++; } }
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?
Danke für die Hilfe bisher. Hab jetzt selbst rausgefunden was mein fehler war.
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.
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 :-/
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.