Ich hab nochmal ein anderes Beispiel geschrieben, diesmal auch mit halben Segment:
Ich gehe mal davon aus dass Du die ADC-Werte ausgeben möchtest, also eine 10-Bit Auflösung, ansonsten musst Du eben anpassen.
Die Zeichen müssen allerdings anders definiert werden als im vorherigen Beispiel:
Zeichen 7 = volles Segment
Zeichen 6 = halbes Segment
da der String-Befehl mit dem Zeichen 0 nichts macht.
Meine Funktion Bargraph wird aufgerufen, welche einen String erzeugt (eben mit den chr(7) und/oder dem chr(6))
1. Parameter ist der Messwert (ohne Prüfung des Maximalwertes)
2. Parameter 0 oder 1 gibt als Print zusätzliche infos iber RS232 aus oder eben nicht (debugging).
Sicherlich könnte man das ganze noch optimierter schreiben,
aber es erfüllt seinen Zweck.
Hier das Teil:
Code:
'-----------------------------------------------------------------------------------------
'name : LCD-Interface Messwert Darstellung.bas
'purpose : TEST: LCD 16 Chars, 2 Lines Bargraph Output
'micro : Mega32
'suited for demo : yes
'commercial addon needed : no
'programmer : darwin.nuernberg (www.roboternetz.de)
'-----------------------------------------------------------------------------------------
$regfile = "m32def.dat" ' specify the used micro
$crystal = 8000000 ' used crystal frequency
$baud = 9600 ' use baud rate
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space
' Die folgende Zeile entfernen wenn das Programm NICHT im Simulator laufen soll
$sim ' entfernen wenn keine Bascom Simulation
' ==============================================================================
Definitionen:
Declare Function Bargraph(byval Messwert As Word , Byval Verbose As Byte) As String ' Messwert = eine ADC-Variable
' LCD einrichten
Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Portc.7 , Rs = Portc.6 ' $sim is used for faster simulation
Deflcdchar 7 , 31 , 31 , 31 , 31 , 31 , 31 , 31 , 31 ' Volles Segment
Deflcdchar 6 , 24 , 24 , 24 , 24 , 28 , 28 , 28 , 28 ' halbes Segment
Config Lcd = 16 * 2
Initlcd
' ==============================================================================
Hauptprogramm:
Dim Mw As Word ' Messert (0-255)
Dim X As Word
Cls ' LCD Löschen
For X = 0 To 1024
Locate 1 , 1
Lcd "Testwert = " ; X
Locate 2 , 1
Lcd Bargraph(x , 0)
Next X
Waitms 500
Do
Input "Messwert = " , Mw ' Zum Testen Eingabe erfordelich
Cls ' LCD Löschen
Locate 1 , 1 ' Pos. in 1. Zeile an 1. Stelle
Lcd "BARGRAPH" ' Text auf das LCD Schreiben
Locate 2 , 1
Lcd Bargraph(mw , 0) ' 2. Parameter = 0 keine Printausgaben
Loop
End 'end program
' ==============================================================================
Function Bargraph(byval Messwert As Word , Byval Verbose As Byte) As String ' Messwert = eine 10-Bit-Variable
Local W_zeichenlaenge As Word
Local W_maxmesswert As Word
Local W_valueganzessegment As Word
Local W_valuehalbessegment As Word
Local W_anzahlzeichen As Word
Local W_anzahlhalbzeichen As Word
Local W_habzeichenvorhanden As Word
Bargraph = ""
If Messwert >= 1 Then
W_zeichenlaenge = 16 ' Zeichenlänge des Bargraph
W_maxmesswert = 1024 ' Maximaler Wert (10 Bit)
W_valueganzessegment = W_maxmesswert / W_zeichenlaenge
W_valuehalbessegment = W_valueganzessegment / 2
W_anzahlhalbzeichen = Messwert / W_valuehalbessegment
W_anzahlzeichen = W_anzahlhalbzeichen / 2
W_habzeichenvorhanden = W_anzahlhalbzeichen Mod W_anzahlzeichen
If Verbose > 0 Then ' Nur Ausgabe wenn > 0
Print "Zeichen für Bargraph = " ; W_zeichenlaenge
Print "Maximaler Wert = " ; W_maxmesswert
Print "Angezeigter Messwert = " ; Messwert
Print "Wert pro Segment = " ; W_valueganzessegment
Print "Wert pro halb Segment = " ; W_valuehalbessegment
Print "Anzahl Bargraph = " ; W_anzahlzeichen
Print "Halbes Zeichen = " ; W_habzeichenvorhanden
End If
If W_anzahlzeichen > 0 Then ' Nur wenn ganze Zeichen ausgegeben werden sollen
Bargraph = String(w_anzahlzeichen , 7)
Else
Bargraph = ""
End If
If W_habzeichenvorhanden > 0 Then
Bargraph = Bargraph + Chr(6)
End If
End If
End Function
End
Lesezeichen