PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Spannungsbalken am LCD darstellen (BASCOM)



Hans55
15.02.2008, 21:39
Hallo!
Ich möchte einen Spannungsbalken am LCD darstellen.
Dazu hab ich mir mit dem LCD Designer ein Zeichen generiert, das komplett ausgefüllt ist. 10 Stück dieser Zeichen stelle ich in einer Zeile dar.
Wenn nur eines erscheint, ist die Batterie fast leer, wenn 10 nebeneinander stehen ist sie voll.
Das funktioniert zwar, aber der Balken blinkt manchmal, was ich nicht haben will. Kann das an der Laufzeit liegen? Oder an meiner Abfrageart?
Gibts da eine andere Möglichkeit wie man das machen könnte?

Das Programm ist so:





Balken:
If U1_mes >= 14.1 Then
Gosub Balken_ladung 'Ladung
End If

If U1_mes >= 12.69 And U1_mes <= 14.00 Then
Gosub Balken100
End If

If U1_mes >= 12.64 And U1_mes <= 12.67 Then
Gosub Balken_loeschen
Gosub Balken90
End If

If U1_mes >= 12.58 And U1_mes <= 12.62 Then
Gosub Balken_loeschen
Gosub Balken80
End If

If U1_mes >= 12.46 And U1_mes <= 12.56 Then
Gosub Balken_loeschen
Gosub Balken70
End If

If U1_mes >= 12.38 And U1_mes <= 12.42 Then
Gosub Balken_loeschen
Gosub Balken60
End If

If U1_mes >= 12.34 And U1_mes <= 12.36 Then
Gosub Balken_loeschen
Gosub Balken50
End If

If U1_mes >= 12.28 And U1_mes <= 12.31 Then
Gosub Balken_loeschen
Gosub Balken40
End If

If U1_mes >= 12.23 And U1_mes <= 12.25 Then
Gosub Balken_loeschen
Gosub Balken30
End If

If U1_mes >= 12.17 And U1_mes <= 12.22 Then
Gosub Balken_loeschen
Gosub Balken20 '=> Laden
End If

If U1_mes >= 11.9 And U1_mes <= 12.12 Then
Gosub Balken_loeschen
Gosub Balken10 '=> Laden
End If

If U1_mes >= 10.5 And U1_mes <= 11.6 Then
Gosub Balken_loeschen
Gosub Balken0 '=> sofort laden ausgeben !
End If

If U1_mes < 10.6 Then
Gosub Balken_loeschen
Gosub Balken0 '=> LEER, sofort laden!
End If
Return


'============================================
'Das sind die LCD Anzeigen:

'-------------------------------------------------------------------------------
'/// LCD Balken für Batteriespannung löschen /////////////////
'-------------------------------------------------------------------------------
'Zeigt Striche "----------"
Balken_loeschen:
Deflcdchar 1 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32
Locate 3 , 1
Lcd Chr(1);
Locate 3 , 2
Lcd Chr(1);
Locate 3 , 3
Lcd Chr(1);
Locate 3 , 4
Lcd Chr(1);
Locate 3 , 5
Lcd Chr(1);
Locate 3 , 6
Lcd Chr(1);
Locate 3 , 7
Lcd Chr(1);
Locate 3 , 8
Lcd Chr(1);
Locate 3 , 9
Lcd Chr(1);
Locate 3 , 10
Lcd Chr(1);
Waitms 150
Return

'-------------------------------------------------------------------------------
'/// LCD Balken für Batteriespannung ///////////////////////////////////
'-------------------------------------------------------------------------------
'Das Zeichen mit dem LCD Designer entwerfen dann an der richtigen Stelle auf OK 'drücken => der Code "Deflcdchar ?,..." wird eingefügt.
'Anschließend an Stelle des ? eine Nummer vergeben und die dann mit LCD chr(0)
' anzeigen lagen
'============================================

Balken100:
Deflcdchar 0 , 31 , 31 , 31 , 31 , 31 , 31 , 31 , 31
Locate 3 , 1
Lcd Chr(0);
Locate 3 , 2
Lcd Chr(0);
Locate 3 , 3
Lcd Chr(0);
Locate 3 , 4
Lcd Chr(0);
Locate 3 , 5
Lcd Chr(0);
Locate 3 , 6
Lcd Chr(0);
Locate 3 , 7
Lcd Chr(0);
Locate 3 , 8
Lcd Chr(0);
Locate 3 , 9
Lcd Chr(0);
Locate 3 , 10
Lcd Chr(0);
Waitms 50
Return

'-------------------------------------------------------------------------------
'/// LCD Balken für Batteriespannung ///////////////////////////////////
'-------------------------------------------------------------------------------
Balken90:
Deflcdchar 0 , 31 , 31 , 31 , 31 , 31 , 31 , 31 , 31
Locate 3 , 1
Lcd Chr(0);
Locate 3 , 2
Lcd Chr(0);
Locate 3 , 3
Lcd Chr(0);
Locate 3 , 4
Lcd Chr(0);
Locate 3 , 5
Lcd Chr(0);
Locate 3 , 6
Lcd Chr(0);
Locate 3 , 7
Lcd Chr(0);
Locate 3 , 8
Lcd Chr(0);
Locate 3 , 9
Lcd Chr(0);
Waitms 50
Return

'-------------------------------------------------------------------------------
'/// 80% LCD Balken für Batteriespannung /////////////////////////////
'-------------------------------------------------------------------------------
Balken80:
Deflcdchar 0 , 31 , 31 , 31 , 31 , 31 , 31 , 31 , 31
Locate 3 , 1
Lcd Chr(0);
Locate 3 , 2
Lcd Chr(0);
Locate 3 , 3
Lcd Chr(0);
Locate 3 , 4
Lcd Chr(0);
Locate 3 , 5
Lcd Chr(0);
Locate 3 , 6
Lcd Chr(0);
Locate 3 , 7
Lcd Chr(0);
Locate 3 , 8
Lcd Chr(0);
Waitms 50
Return

'-------------------------------------------------------------------------------
'/// 70% LCD Balken für Batteriespannung /////////////////////////////
'-------------------------------------------------------------------------------
Balken70:
Deflcdchar 0 , 31 , 31 , 31 , 31 , 31 , 31 , 31 , 31
Locate 3 , 1
Lcd Chr(0);
Locate 3 , 2
Lcd Chr(0);
Locate 3 , 3
Lcd Chr(0);
Locate 3 , 4
Lcd Chr(0);
Locate 3 , 5
Lcd Chr(0);
Locate 3 , 6
Lcd Chr(0);
Locate 3 , 7
Lcd Chr(0);
Waitms 50
Return

'-------------------------------------------------------------------------------
'/// 60% LCD Balken für Batteriespannung //////////////////////////////
'-------------------------------------------------------------------------------
Balken60:
Deflcdchar 0 , 31 , 31 , 31 , 31 , 31 , 31 , 31 , 31
Locate 3 , 1
Lcd Chr(0);
Locate 3 , 2
Lcd Chr(0);
Locate 3 , 3
Lcd Chr(0);
Locate 3 , 4
Lcd Chr(0);
Locate 3 , 5
Lcd Chr(0);
Locate 3 , 6
Lcd Chr(0);
Waitms 50
Return

'-------------------------------------------------------------------------------
'/// 50% LCD Balken für Batteriespannung //////////////////////////////
'-------------------------------------------------------------------------------
Balken50:
Deflcdchar 0 , 31 , 31 , 31 , 31 , 31 , 31 , 31 , 31
Locate 3 , 1
Lcd Chr(0);
Locate 3 , 2
Lcd Chr(0);
Locate 3 , 3
Lcd Chr(0);
Locate 3 , 4
Lcd Chr(0);
Locate 3 , 5
Lcd Chr(0);
Waitms 50
Return

'-------------------------------------------------------------------------------
'/// 40% LCD Balken für Batteriespannung /////////////////////////////
'-------------------------------------------------------------------------------
Balken40:
Deflcdchar 0 , 31 , 31 , 31 , 31 , 31 , 31 , 31 , 31
Locate 3 , 1
Lcd Chr(0);
Locate 3 , 2
Lcd Chr(0);
Locate 3 , 3
Lcd Chr(0);
Locate 3 , 4
Lcd Chr(0);
Waitms 50
Return
'-------------------------------------------------------------------------------
'/// 30% LCD Balken für Batteriespannung //////////////////////////////
'-------------------------------------------------------------------------------
Balken30:
Deflcdchar 0 , 31 , 31 , 31 , 31 , 31 , 31 , 31 , 31
Locate 3 , 1
Lcd Chr(0);
Locate 3 , 2
Lcd Chr(0);
Locate 3 , 3
Lcd Chr(0);
Waitms 50
Return

'-------------------------------------------------------------------------------
'/// 20% LCD Balken für Batteriespannung /////////////////////////////
'-------------------------------------------------------------------------------
Balken20:
Deflcdchar 0 , 31 , 31 , 31 , 31 , 31 , 31 , 31 , 31
Locate 3 , 1
Lcd Chr(0);
Locate 3 , 2
Lcd Chr(0);
Waitms 50
Return

'-------------------------------------------------------------------------------
'/// 10% LCD Balken für Batteriespannung //////////////////////////////
'-------------------------------------------------------------------------------
Balken10:
Deflcdchar 0 , 31 , 31 , 31 , 31 , 31 , 31 , 31 , 31
Locate 3 , 1
Lcd Chr(0);
Waitms 50
Return

'-------------------------------------------------------------------------------
'/// 0% LCD Balken für Batteriespannung /////////////////////////////
'-------------------------------------------------------------------------------
Balken0:
Deflcdchar 0 , 31 , 31 , 31 , 31 , 31 , 31 , 31 , 31
Locate 3 , 1
Lcd Chr(0);
Locate 3 , 1
Lcd " LEER "
Waitms 50
Return

Dirk
15.02.2008, 22:13
Hallo Hans55,

was mir einfällt:
a) Die Sub Balken optimieren: Select - Case, KEIN Löschen der Zeile.
b) Die Subs BalkenXXX optimieren: Locate nur für den Zeilenanfang, sonst nicht. Die an 10 Zeichen fehlenden Blöcke als Leerzeichen ausgeben (löscht dadurch evtl. vorherige Blöcke). Nur 1 LCD-Kommando pro Zeile: LCD Chr(0); Chr(0); " " (für 2 Blöcke + 8 Leerzeichen).

Gruß Dirk

for_ro
15.02.2008, 22:26
Das sollte grob das gleiche machen wie dein Prog:


Dim U1_mes As Single
Dim Balken_laenge As Byte , I As Byte

Deflcdchar 0 , 31 , 31 , 31 , 31 , 31 , 31 , 31 , 31
Deflcdchar 1 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32
Do
For U1_mes = 12.22 To 12.23 Step 0.01
Gosub Balken
Next U1_mes
Loop

Balken:
Select Case U1_mes
Case 12.69 To 14.00 : Balken_laenge = 10
Case 12.64 To 12.68 : Balken_laenge = 9
Case 12.58 To 12.63 : Balken_laenge = 8
Case 12.46 To 12.57 : Balken_laenge = 7
Case 12.38 To 12.45 : Balken_laenge = 6
Case 12.34 To 12.37 : Balken_laenge = 5
Case 12.28 To 12.33 : Balken_laenge = 4
Case 12.23 To 12.27 : Balken_laenge = 3
Case 12.17 To 12.22 : Balken_laenge = 2
Case 11.9 To 12.16 : Balken_laenge = 1
Case 10.5 To 11.8 : Balken_laenge = 0
Case Is < 10.5 : Balken_laenge = 0
End Select
If U1_mes >= 14.1 Then
Gosub Balken_ladung 'Ladung
Else
Gosub Balken_zeichnen
End If
Return

Balken_zeichnen:
For I = 1 To 10
Locate 3 , I
If I <= Balken_laenge Then
Lcd Chr(0) 'zeichnet ein Kästchen
Else
Lcd Chr(1) 'zeichnet einen Strich
End If
Next I
Waitms 50
Return

Balken_ladung:
Return

Einige Werte sind in deinen Abfragen nicht enthalten, wie z.B. 12.43 - 12.45.
Musst du mal sehen, ob das richtig ist.

Gruß

Rolf

Hans55
16.02.2008, 07:55
Hallo Dirk, Hallo Rolf!
Erst mal Danke für die schnelle Antwort.
Ich werde das mal so ausprobieren.
Gruß
Hans