Merken das Taster 1-Signal hat

OP #3071213
Lesenswert?

Hallo,

ich bin absoluter Anfänger in der Mikrocontroller-Technik.
Jetzt will ich eine Display programmieren auf welchem ich einen Text 
ausgebe. Das Funktioniert ganz gut. Leider ist bei mir der Fall das wenn 
ich dann nochmals die Taste drücke das Display "Flackert", weil der Text 
neu im Display erscheint. Wie kann ich dies verhindern?
#3071228
Lesenswert?

Man kann flackern vermeiden wenn man das Display vor dem neu Schreiben 
nicht erst komplett löscht. Sondern es wird nur der Cursor wieder am 
Anfang plaziert und der alte Text überschrieben. Da muss man aber dann 
bei kürzeren neuen Texten aufpassen und am Ende mit Leerzeichen das 
restliche Display vollschreiben sonst bleibt der alte Text dort 
natürlich stehen.

gruß cyblord

PS: Kann es sein dass die Überschrift absolut nicht zum Beitrag passt?
OP #3071236
Lesenswert?

cyblord ---- schrieb:
> Man kann flackern vermeiden wenn man das Display vor dem neu Schreiben
> nicht erst komplett löscht. Sondern es wird nur der Cursor wieder am
> Anfang plaziert und der alte Text überschrieben. Da muss man aber dann
> bei kürzeren neuen Texten aufpassen und am Ende mit Leerzeichen das
> restliche Display vollschreiben sonst bleibt der alte Text dort
> natürlich stehen.
>
> gruß cyblord
>
> PS: Kann es sein dass die Überschrift absolut nicht zum Beitrag passt?

/*
 * LCDAnsteuerung.c
 *
 * Created: 28.01.2013 20:00:51
 *  Author: test
 */


#include <avr/io.h>
#include "lcd-routines.h"

#define Taster1 PB0
#define Taster2 PB1

int main(void)
{
  char *textOld;
  char *text1;
  char *text2;
  *text1="Erste Zeile";
  *text2="Zweite Zeile";

  DDRB  &= ~(1<<DDB0);
  DDRB  &= ~(1<<DDB1);
  PORTB |= (1<<Taster1);
  PORTB |= (1<<Taster2);


  lcd_init();
  lcd_clear();


    while(1)
    {
            if (bit_is_clear (PINB, Taster1) && (*textOld != *text1))
            {

                lcd_init();
                lcd_setcursor(0,1);
                *text1="Erste Zeile";
                lcd_string(*text1);
           *textOld=*text1;


          if (*text1 == *textOld)
              {
              lcd_init();
              lcd_setcursor(0,1);
              lcd_string(*text2);
            }
          }

          if (bit_is_clear (PINB, Taster2))
              {
                lcd_init();
                lcd_setcursor(0,2);
                lcd_string(*text2);
              }
    }
}
#3071254
Lesenswert?

Absoluter Schrott-Code.

Hast du dir mal überlegt was die lcd_init macht? Hast du mal ins 
Datenblatt geguckt? Hast du überhaupt mal nachgedacht? Absolut sinnloses 
benutzen einer lib und dann meckern wenn das Display flackert. Alle 
Achtung. Beschäftige dich mal mit der Materie und dann komm wieder. 
Unglaublich frech.

gruß cyblord
Gast #3071255
Lesenswert?

Warum initialisierst du dein Display dauern? Das kostet einen Haufen 
Zeit, sorgt dadurch für das von dir beobachtete Flackern und 
überflüssig.

Wie der Begriff "Initialisieren" schon von der Bedeutung des Wortes her 
sagt, ist das nur einmal - zu Begin der Programms - nötig. Danach ist 
der Speicher im Display sinnvoll belegt und der Prozessor ist bereit für 
Darstellung von Texten.
Gast #3071727
Lesenswert?

@cyblord
vielleicht hat er anfangs geschriueben das er Anfänger ist.
Wenn jeder erst ejde Doku und Anleitung und  dann noch das komplette 
Buch des Compilers etc pp elsen würde, wofür bäuchte er dann Dich?!

Schinmal darüber nachgedacht, das die Vorteile des Internets daran 
leigen, das ejder ehute spontan eine Frage stellen kann zu sienem 
Proble, die lösung erhält udn so innerhalb wenger Stunden ein 
lauffähiges c System hat?!?!

Mal überlegt wie das noch vor vielen Jahren war, als man sich mühsam in 
der Bücherei alles zusammengesucht hat und nach Tagen / Wochen die 
ersten Erfolge hatte!!

Ich habe hier oft den Eindruck, das viele den Vorteil des Internets 
nicht verstehen

Wie ist es denn nun ausgegangen?
Ich könnte mir gut vorstellen das das unnötige Init noch nicht mal das 
flackern verursacht, aber wie hier schon erwähnt das nicht entprellen 
des Taster hierfür verantwortlich sein könnte.
Beides zusammen ist natürlich doppelt verdächtig für das Problem
#3072047
Lesenswert?

Kim Schmidt schrieb:
> @cyblord
> vielleicht hat er anfangs geschriueben das er Anfänger ist.
> Wenn jeder erst ejde Doku und Anleitung und  dann noch das komplette
> Buch des Compilers etc pp elsen würde, wofür bäuchte er dann Dich?!

Weil in den Dokus, Anleitungen, Büchern auch nicht alles steht und 
Restfragen offen bleiben.

Aber es ist sinnlos, sich mit Differentialgleichungen zu beschäftigen, 
ehe man das kleine Einmal-Eins und einfaches Formalumstellen gelernt 
hat. Und DAS kann man sehr wohl lernen, indem man die Grundlagen 
nachliest und für sich selbst Übungsstunden investiert. Oder muss da 
auch die Mama daneben sitzen und alles kontrollieren?

> Schinmal darüber nachgedacht, das die Vorteile des Internets daran
> leigen, das ejder ehute spontan eine Frage stellen kann zu sienem
> Proble, die lösung erhält udn so innerhalb wenger Stunden ein
> lauffähiges c System hat?!?!

Schon mal darüber nachgedacht, dass es sinnvoll ist, sich die absoluten 
Grundlagen erst mal soweit beizubringen, dass man überhaupt sinnvolle 
Fragen stellen kann?

> Mal überlegt wie das noch vor vielen Jahren war, als man sich mühsam in
> der Bücherei alles zusammengesucht hat und nach Tagen / Wochen die
> ersten Erfolge hatte!!

Been there. Done that.
Und weißt du, was das wirklich lustige an der ganzen Sache ist?
Genau diejenigen, die durch diese Mühle durchmussten, sind diejenigen 
die hier Fragen`kompetent beantworten, eben weil sie das alles von der 
Pieke auf gelernt haben. Mühsam, aber nachhaltig.

Uns wird dann immer wieder gerne mal vorgeworfen, dass wir das alles ja 
schliesslich auch nicht von Geburt auf gekonnt hätten. Und das stimmt 
sogar. Keiner ist mit dem Wissen zur Welt gekommen. Wir alle mussten 
durch die Schule durch, die da heißt: Lesen, lernen, probieren, fluchen, 
anderen Code studieren. Du kannst dir gar nicht vorstellen, WIE mühsam 
im Vergleich zur heutigen Fragerei in einem Forum das alles war. Aber: 
Wenn man etwas dann nach Tagen und Wochen endlich intus hatte, dann 
hatte man es auch wirklich intus! Weil man jede Anweisung im Code 'mit 
dem Vornamen kannte'. Und mit der Zeit wurde man besser und besser.
Das vergessen diejenigen leider gerne, die uns dann vorwerfen, das wir 
das Wissen schon haben und sie nicht. Da steckt für jeden von uns auch 
eine Menge Zeit drinnen um genau dieses Wissen sich erst mal anzueignen. 
UNd ja, wir alle haben genau gleich angefangen: bei 0.
Wir haben unser Wissen nicht daher, weil wir 5 Fragen in einem Forum 
gestellt haben, sondern weil wir die Ausdauer hatten, durch die Mühle 
durchzugehen und zu üben und zu probieren. Ich hab in meinem 
Programmierer-Leben wahrscheinlich schon mehr Code weggeworfen und als 
unbrauchbar abqualifiziert als du je programmiert hast.

> Ich habe hier oft den Eindruck, das viele den Vorteil des Internets
> nicht verstehen

Schnelle, scheinbare Lösungen, die andere für einen erarbeitet haben.

> Ich könnte mir gut vorstellen das das unnötige Init noch nicht mal das
> flackern verursacht, aber wie hier schon erwähnt das nicht entprellen
> des Taster hierfür verantwortlich sein könnte.

Nö.
Du kannst den immer gleichen Text am LCD so oft übereinander malen wie 
du willst. Da flackert nichts. Flackern entsteht erst, wenn sich die 
Anzeige zu oft ändert. Sei es durch dauerndes 'LCD löschen' oder eben 
laufendes Neuinitialisieren (welches meistens in der init Funktion 
selbst auch noch einen LCD-lösch Befehl enthält)
Moderator Persönliche Seite #3072101
Lesenswert?

Karl Heinz Buchegger schrieb:
> Interessieren würde mich nur, wie er das da
>
>
1
>   char *text1;
2
>   char *text2;
3
>   *text1="Erste Zeile";
4
>   *text2="Zweite Zeile";
5
>
>
> ohne Error/Warnung durch den Compiler gekriegt hat.

Das ist noch nicht alles, hier noch mehr Vorkommnisse:
1
    if (bit_is_clear (PINB, Taster1) && (*textOld != *text1))
2
    *text1="Erste Zeile";
3
    lcd_string(*text1);
4
    *textOld=*text1;
5
    if (*text1 == *textOld)
6
    lcd_string(*text2);

Strings kopieren/vergleichen macht man anders. ;-)

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