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