Forum: Compiler & IDEs LCD Ausgabe nur wenn sich Werte ändern


von Daniel (Gast)


Lesenswert?

Hi ich gebe Werte auf einen LCD aus und das flackert bei jeder Ausgabe. 
Darum wollte ich nur das LCD neu beschreiben, wenn sich einer der Werte 
ändert. Wie löse ich das am elegantesten?

von Daniel (Gast)


Lesenswert?

So in der Art?
1
if(i != i_vorher){
2
   lcd_string(i);
3
}

von Karl H. (kbuchegg)


Lesenswert?

Daniel schrieb:
> So in der Art?
>
1
> if(i != i_vorher){
2
>    lcd_string(i);
3
> }
4
> 
5
>

fast. Nachdem du i ausgegeben hast, hast du ja ein neues i_vorher. D.h. 
du musst diese Variable dann auch updaten.

Nenn die Variable nicht i_vorher, sondern irgendwie, so dass aus dem 
Namen hervorgeht, dass in dieser Variablen der Wert steht, der momentan, 
jetzt gerade am LCD angezeigt wird. i_shown wäre zb so was


   if( value != value_shown ) {
     lcd_xxxx( value );
     value_shown = value;
   }

Jetzt stehts mehr oder weniger im Klartext da

  if( value != value_shown )      wenn der neue Wert ein anderer ist
                                  als der der gerade angezeigt wird

    lcd_xxxx( value )             dann gib den neuen Wert aus

    value_shown = value           und damit wird jetzt ein anderer
                                  Wert angezeigt. Nämlich der aus
                                  value


anstatt xxx_shown geht natürlich auch anderes. valueOnDisplay wäre zb so 
ein Name, wenn auch ein wenig lang.

xxx_vorher (bzw. previous) impliziert eher, dass es sich dabei um den 
unmittelbar vorher berechneten Wert handelt. Wie man ihn zbz braucht um 
Pinänderungen festzustellen.

Die Kunst besteht immer darin, Variablennamen zu finden, die auch was 
aussagen und nicht übermässig lang sind. Aber auch nicht zu kurz. 
Allerdings entwickelt jeder Programmierer mit der Zeit seine eigene 
Nomenklatur, wie er die Dinge normalerweise nennt.

von Stephan B. (s_bronco)


Lesenswert?

Ich verwende eine Variable, zB. flag.0, wenn ich zB. Sensoren auslese 
oder eine Eingabe mache setze ich die auf 1, nach der Abarbeitung vom 
LCD wirds wieder 0.
If flag.0 = 1 then
  LCDAusgabe
else
  sonst nicht
End If

von Daniel (Gast)


Lesenswert?

@Karl Heinz

Danke dir.

@Stephan

Warum machst du flag.0 und nicht nur eine Variable flag?

von Peter D. (peda)


Lesenswert?

Daniel schrieb:
> Hi ich gebe Werte auf einen LCD aus und das flackert bei jeder Ausgabe.
> Darum wollte ich nur das LCD neu beschreiben, wenn sich einer der Werte
> ändert.

Dann flackert es nur seltener. Du dockorst an den Symptomen rum, nicht 
aber an der Ursache.

Schmeiß das LCD_CLEAR raus, dann flackert nichts mehr.

von Ralf G. (ralg)


Lesenswert?

Peter Dannegger schrieb:
> Schmeiß das LCD_CLEAR raus
Was deine Glaskugel so alles kann... :-)

von Peter D. (peda)


Lesenswert?

Ralf G. schrieb:
> Was deine Glaskugel so alles kann... :-)

Nur simple Prozentrechnung, zu 99% liege ich richtig.

Ich weiß auch nicht, warum Anfänger ständig ein LCD-Clear machen müssen.
Beim einfachen Überschreiben flackert nichts.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Daniel schrieb:
> Warum machst du flag.0 und nicht nur eine Variable flag?

Weil er die proprietären Erweiterungen seines C-Compilers dazu nutzt, 
ein Bitfeld auf nicht-portable Weise anzulegen.

von Bronco (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Ich weiß auch nicht, warum Anfänger ständig ein LCD-Clear machen müssen.
> Beim einfachen Überschreiben flackert nichts.

Damit sie das lernen. Mußte ich auch ;)

von Christian (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Ralf G. schrieb:
>> Was deine Glaskugel so alles kann... :-)
>
> Nur simple Prozentrechnung, zu 99% liege ich richtig.
>
> Ich weiß auch nicht, warum Anfänger ständig ein LCD-Clear machen müssen.
> Beim einfachen Überschreiben flackert nichts.

Und wie machst du dass dann, wenn sich z.B. die Temperatur von 10.0°C 
auf 9.9°C ändert?
Ich habe dann folgendes Problem:
10.0°C    erste Ausgabe
9.9°C     überschreiben
======
9.9°CC    Ergebnis

Mich nervt das geflacker durch clr_lcd() auch. Aber mir ist keine 
bessere Möglichkeit eingefallen.
Wäre für Tipps dankbar!

Gruß Christian

von W.S. (Gast)


Lesenswert?

Christian schrieb:
> Aber mir ist keine
> bessere Möglichkeit eingefallen.

clreol();

aber das muß man sich selbst schreiben, ist jedoch nicht schwer.

W.S.

von Christian (Gast)


Lesenswert?

W.S. schrieb:
> Christian schrieb:
>> Aber mir ist keine
>> bessere Möglichkeit eingefallen.
>
> clreol();
>
> aber das muß man sich selbst schreiben, ist jedoch nicht schwer.
>
> W.S.

clear end of line ?!

ich hatte es dann so gemacht, dass ich mir einen leeren String gemacht 
habe und diesen kurz vorher aufs LCD geschrieben habe. Aber das hat auch 
geflackert.

Wenn mal wieder Langeweile aufkommt, probier ich das vielleicht mal mit 
so einer Funktion. Ich hatte eigentlich gehofft, dass es einen Trick für 
printf gibt. ;)

Gruß
Christian

von J.-u. G. (juwe)


Lesenswert?

Christian schrieb:
> Und wie machst du dass dann, wenn sich z.B. die Temperatur von 10.0°C
> auf 9.9°C ändert?
> Ich habe dann folgendes Problem:
> 10.0°C    erste Ausgabe
> 9.9°C     überschreiben
> ======
> 9.9°CC    Ergebnis
>
> Mich nervt das geflacker durch clr_lcd() auch. Aber mir ist keine
> bessere Möglichkeit eingefallen.

Wenn der Wert kleiner ist als 10.0, dann gib ein führendes Leerzeichen 
aus. Dann bleibt auch das Komma immer an einer festen Position.

von Christian (Gast)


Lesenswert?

so nach dem Motto:

if (val<10.0)
    printf("T= %02.1f", val);
else
    printf("T= %.1f", val);
end

Geht das auch so "out of the box" mit Leerzeichen statt Nullen?

von Christian (Gast)


Lesenswert?

Okay ich habe meine Frage selbst beantwortet:

int main() {

  float val1=9.0;
  float val2=10.0;

  char buffer1[10];
  char buffer2[10];

  sprintf(buffer1,"T=%5.2f", val1);
  sprintf(buffer2,"T=%5.2f", val2);

  cout<<buffer1<<endl<<buffer2<<endl;

  return 0;
}

> T= 9.00
> T=10.00

funktioniert ohne führende Null!

Ich bedanke mich für den Anstoß, nochmal nachzudenken :-D

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.