Hallo, wie ist denn der richtige Programmierstil für das nachfoldende Beispiel. Wenn ich das so umsetze flackert das LCD. Das macht man doch sicher anders ohne ständig in der schleife cls und den Text neu zu schreiben oder? $regfile = "m8def.dat" $crystal = 1000000 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4 Config Lcdbus = 4 Portb = $00100000 Do If Pinb.1 = 1 Then cls Locate 1 , 1 Lcd "gedrückt" Else cls Locate 1 , 1 Lcd "losgelassen" End If Loop End
Hm... Ich kann kein Bascom, Pseudocode. Pin_alt=0 Do If Pinb.1 nicht gleich Pin_alt then Pin_alt=Pinb.1 hier das LCD updaten (s. oben) End if End Do
Lasse das cls weg und füge hinten beim kürzeren text ein paar leerzeichen hinzu
ichim schrieb: > Lasse das cls weg und füge hinten beim kürzeren text ein paar > leerzeichen hinzu Das ist imho Murks der sich u.U. später mal rächt...
Achso, statt Pin_alt=0 besser Pin_alt=Gegenteil von Pinb.1 nehmen um auf jeden Fall eine Anzeige auf dem LCD zu haben.
Z.B. indem man sich den Zustand des Pins merkt und nur was aufs LCD malt, wenn der sich ändert. Desweiteren indem man das cls wegläßt (dass dauert ewig) und einfach beide Zeichenketten gleich lang macht (kürzere hinten mit Leerzeichen auffüllen), dann überschreiben sich die einfach.
murkscoder schrieb: >> Lasse das cls weg und füge hinten beim kürzeren text ein paar >> leerzeichen hinzu > Das ist imho Murks der sich u.U. später mal rächt... Warum Murks? Meine Menuroutinen machen das alle so. Beim Update wird immer erst der Text geschrieben und dann so viele Zeichen bis die Zeile voll ist.
Samuel K. schrieb: > murkscoder schrieb: >>> Lasse das cls weg und füge hinten beim kürzeren text ein paar >>> leerzeichen hinzu >> Das ist imho Murks der sich u.U. später mal rächt... > > Warum Murks? Meine Menuroutinen machen das alle so. Beim Update wird > immer erst der Text geschrieben und dann so viele Zeichen bis die Zeile > voll ist. Naja, bei Menüs kann man sich vielleicht noch darüber streiten. Grundsätzlich halte ich das aber für Murks. Ich weiß nicht wie es in Bascom ist, in C oder ASM stehen meine Strings nicht unbedingt direkt da wo die Ausgabe erfolgt (dort steht nur ein Pointer bzw. ein Label). Wenn man dann etwas ändert kann man lange suchen warum immer ein paar zusätzliche Zeichen überschrieben werden und ähnliche Geschichten... Auch führen die Leerzeichen in C zu falschen Ergebnissen bei strlen(). Dann notfalls doch lieber 2 Zugriffe aufs LCD, erstmal nur Leerzeichen und dann Text.
>Auch führen die Leerzeichen in C zu falschen Ergebnissen bei strlen().
Aber sonst gehts dir gut?
murkscoder schrieb: > Naja, bei Menüs kann man sich vielleicht noch darüber streiten. > Grundsätzlich halte ich das aber für Murks. Ich weiß nicht wie es in > Bascom ist, in C oder ASM stehen meine Strings nicht unbedingt direkt da > wo die Ausgabe erfolgt (dort steht nur ein Pointer bzw. ein Label). Es war C. Außerdem würde ich die Ausgabe in eine Routine schreiben und nicht übers ganze Programm ziehen. Meine Ausgabemethode nimmt die Länge des LCD und zieht pro geschriebenes Zeichen eins ab. Nach dem Schreiben werden die restlichen Zeichen per Leerzeichen gelöscht. > Wenn > man dann etwas ändert kann man lange suchen warum immer ein paar > zusätzliche Zeichen überschrieben werden und ähnliche Geschichten... > Auch führen die Leerzeichen in C zu falschen Ergebnissen bei strlen(). > Dann notfalls doch lieber 2 Zugriffe aufs LCD, erstmal nur Leerzeichen > und dann Text. Was im Endeffekt flackert. strlen sollte übrigens nur bei 0 (='\0') enden.
Samuel K. schrieb: > murkscoder schrieb: >>> Lasse das cls weg und füge hinten beim kürzeren text ein paar >>> leerzeichen hinzu >> Das ist imho Murks der sich u.U. später mal rächt... > > Warum Murks? Meine Menuroutinen machen das alle so. Beim Update wird > immer erst der Text geschrieben und dann so viele Zeichen bis die Zeile > voll ist. Aber du machst den Textupdate doch sicher nur dann, wenn auch tatsächlich ein Update notwendig ist. Das ist der wichtigere der beiden Punkte in diesem konkreten Fall. > aja, bei Menüs kann man sich vielleicht noch darüber streiten. > Grundsätzlich halte ich das aber für Murks. Ein Cls ist aber ein noch viel größerer Murks. Denn dann ist das LCD komplett leer. Selbst dann wenn irgendein anderer Programmteil in einer Ecke des LCD eine wichtige Information hinterlassen hat, die man jetzt erst mühsam wieder rekonstruieren muss.
holger schrieb: >>Auch führen die Leerzeichen in C zu falschen Ergebnissen bei strlen(). > > Aber sonst gehts dir gut? Danke, ja. Ich meine folgendes:
1 | char string[]="Eintrag 1 "; |
2 | int i=strlen(string); |
i enthält jetzt 16 obwohl der eigentliche Text nur 9 Buchstaben lang ist. Samuel K. schrieb: > murkscoder schrieb: >> Naja, bei Menüs kann man sich vielleicht noch darüber streiten. >> Grundsätzlich halte ich das aber für Murks. Ich weiß nicht wie es in >> Bascom ist, in C oder ASM stehen meine Strings nicht unbedingt direkt da >> wo die Ausgabe erfolgt (dort steht nur ein Pointer bzw. ein Label). > Es war C. Außerdem würde ich die Ausgabe in eine Routine schreiben und > nicht übers ganze Programm ziehen. Meine Ausgabemethode nimmt die Länge > des LCD und zieht pro geschriebenes Zeichen eins ab. Nach dem Schreiben > werden die restlichen Zeichen per Leerzeichen gelöscht. Das klingt ganz gut, also die Leerzeichen NICHT direkt in die Ausgabestrings gepackt. >> Wenn >> man dann etwas ändert kann man lange suchen warum immer ein paar >> zusätzliche Zeichen überschrieben werden und ähnliche Geschichten... >> Auch führen die Leerzeichen in C zu falschen Ergebnissen bei strlen(). >> Dann notfalls doch lieber 2 Zugriffe aufs LCD, erstmal nur Leerzeichen >> und dann Text. > Was im Endeffekt flackert. Hm, meinst du? Ja, doch, wenn man erst Leerzeichen schreibt und dann Text vielleicht. Naja, dann trag ich mein Pseudonym wenigstens zu Recht. ;-) Karl Heinz Buchegger schrieb: > Aber du machst den Textupdate doch sicher nur dann, wenn auch > tatsächlich ein Update notwendig ist. Das ist der wichtigere der beiden > Punkte in diesem konkreten Fall. Natürlich. > Ein Cls ist aber ein noch viel größerer Murks. Das Gegenteil habe ich auch nicht behauptet... Lasst gut sein, ich war müde.
Machs doch einfach mit einem Status-Bit $regfile = "m8def.dat" $crystal = 1000000 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4 Config Lcdbus = 4 Portb = $00100000 DIM STATUS as BIT set STATUS 'damit beim 1.Durchlauf auch was angezeigt wird Do If Pinb.1 = 1 and STATUS=0 Then cls Locate 1 , 1 Lcd "gedrückt" STATUS=1 ENDIF If Pinb.1 = 0 and STATUS=1 Then cls Locate 1 , 1 Lcd "losgelassen" STATUS=0 End If Loop End
murkscoder schrieb: > Ich meine folgendes: > char string[]="Eintrag 1 "; > int i=strlen(string); > i enthält jetzt 16 obwohl der eigentliche Text nur 9 Buchstaben lang > ist. Nö, nach Deiner Ansicht ist der Text nur 8 Buchstaben lang. Vor der '1' steht ja schon ein ' ', das gehört dann konsequenter Weise auch nicht zum Text. Entweder Du schließt alle ' ' aus oder keines. Aber dazu mußt Du Deine eigene Programmiersprache schreiben. In C ist das ' ' ein gültiges Zeichen, also gehört es mit zum Text. Genauer, alles von 0x01 .. 0xFF ist Text, nur die 0x00 ist als Endezeichen reserviert. Peter
$regfile = "m8def.dat" $crystal = 1000000 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4 Config Lcdbus = 4 Portb = $00100000 CLS Do If Pinb.1 = 1 Then Locate 1 , 1 Lcd "gedrückt " Else Locate 1 , 1 Lcd "losgelassen " End If Loop End mach es so, und nichts Flackert mehr..... In Bascom geht es nicht besser.
wvs swsef schrieb: > In Bascom geht es nicht besser. hää? dann schau mal meinen Code weiter oben an. Da wird nur bei einer Änderung das Display neu beschrieben. Da flackert nix mehr und es sind auch keine Leerzeichen nötig.
Martin S, schrieb: > wvs swsef schrieb: >> In Bascom geht es nicht besser. > > hää? dann schau mal meinen Code weiter oben an. Da wird nur bei einer > Änderung das Display neu beschrieben. Da flackert nix mehr und es sind > auch keine Leerzeichen nötig. Das ist auch nur die halbe Miete, Du musst es so programmieren, dass das LCD nur dann aktualisiert wird, wenn auch jemand drauf schaut. Duck&weg... ...
Peter Dannegger schrieb: > ... Ach Mensch, ich kann mich einfach nicht klar ausdrücken. :-( Was du schreibst ist natürlich richtig und mir bekannt, lassen wir das.
Martin S, schrieb: > hää? dann schau mal meinen Code weiter oben an. Da wird nur bei einer > Änderung das Display neu beschrieben. Da flackert nix mehr und es sind > auch keine Leerzeichen nötig. natürlich flackert das - auch wenn nur einmal. Zudem die Methode mit Leerzeichen hinzufügen eleganter ist, da es nicht so lange dauert.
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.