Frage zu Bascom Programierstil

Gast #2247310
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
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
Gast
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.
Gast
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.
Gast
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
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.
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...

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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.