Frage zu Bascom Programierstil

Gast #2247310
Lesenswert?

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
Gast #2247321
Lesenswert?

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.
Gast #2247337
Lesenswert?

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.
#2247352
Lesenswert?

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.
#2247358
Lesenswert?

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.
Gast #2247678
Lesenswert?

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.
Gast #2247768
Lesenswert?

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
#2247836
Lesenswert?

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
#2247852
Lesenswert?

$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.
#2247897
Lesenswert?

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...

...

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