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
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.
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
charstring[]="Eintrag 1 ";
2
inti=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
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.