Grafik_LCD_ansteuern
(armin77, 04.04.2013, 19:32:13)Wie leistungsfähig Bascom ist merkt man auch daran, wie einfach es ist ein Grafik LCD anzusteuern.
Beim Kauf des Display ist auf den verwendeten Controller zu achten.
Nicht alle werden von Bascom direkt unterstützt. Also in der Bascom Hilfe nachschauen und vergleichen.
Ich habe mir das Grafik LCD 128 x 64 Pixel von Pollin gekauft.
Es hat einen KS108 Chipsatz und ist sehr günstig.
Das Koordinatensystem des Display sieht so aus:
So wird das Display angeschlossen:
Beim Anschluß des Display mußte ich feststellen das Chip Select 1 und Chip Select 2, sowie Anode und Kathode
der Hintergrundbeleuchtung vertauscht waren.
Ob das bei allen Pollin Display`s ist kann ich nicht sagen.
Die wichtigsten Befehle
Einbinden der Controller Library
$lib "Dateiname.lib"
Beispiel:
$lib "glcdKS108.lib"
Konfigurieren der verwendeten Pins des AVR und des verwendeten Grafik LCD
Config Graphlcd = 128 * 64sed , Dataport = Portd , Controlport = Portb , Ce = 2 , Ce2 = 3 , Cd = 0 , Rd = 1 , Reset = 5 , Enable = 4
Auswahl und aktivieren des Zeichensatzes
Setfont Fontname
Beispiel:
Setfont Font16x16
Die Datei muß im gleichen Verzeichnis sein, wie das Bascom Programm.
Löschen des Grafik LCD
CLS
Beispiel:
CLS
Text an Position x,y schreiben
Bei Font 16x16 ist Zeile = 1 bis 7 möglich
Bei Font 8x8 ist Zeile = 1 bis 8 möglich.
Die Spalte wird in Pixel angegeben
Lcdat x,y , "Test" , 0
Beispiel:
Lcdat 1, 24 , "Test" , 0
Inversen Text an Position x,y schreiben
Bei Font 16x16 ist Zeile = 1 bis 7 möglich.
Bei Font 8x8 ist Zeile = 1 bis 8 möglich.
Die Spalte wird in Pixel angegeben
Lcdat x,y , "Test invers" , 1
Beispiel:
Lcdat 1, 24 , "Test invers" , 1
Linie zeichnen
Line(x1 , y1) -(x2 , y2) , 1
Beispiel:
Line(0 , 63) -(127 , 0) , 1
Linie wieder löschen
Line(x1 , y1) -(x2 , y2) , 0
Beispiel:
Line(0 , 63) -(127 , 0) , 0
Punkt zeichnen
PSET x, y, 1
Beispiel:
PSET 34, 23, 1
Punkt wieder löschen
PSET x, y, 0
Beispiel:
PSET 34, 23, 0
Kreis zeichnen
Circle(x , y) , Radius , 1
Beispiel:
Circle(60 , 40) , Variable , 1
Kreis wieder löschen
Circle(x , y) , Radius, 0
Beispiel:
Circle(60 , 40) , Variable , 0
Bild darstellen
Showpic x , y , Bild_Daten
Beispiel:
Showpic 0 , 0 , Bild1
Font Datei einbinden
Dieser Befehl muß am Ende des Programm`s stehen.
Die Fontdatei muß im selben Verzeichnis sein, wie das Bascom Programm.
$include "Fontdatei"
Beispiel:
$include "font8x8.font"
$include "font16x16.font"
Einbinden einer Bild Datei
Dieser Befehl muß ebenfalls am Ende des Programm`s stehen.
Die Bilddatei muß im selben Verzeichnis sein, wie das Bascom Programm.
Die Datei muß vorher mit dem Bascom Grafik Konverter vom BMP in das BGF Format gebracht werden.
Man erstellt sich eine Grafik in der entsprechenden Größe 128 * 64 Pixel oder skaliert ein Bild.
Dann ruft man in Bascom den Bascom Grafik Konverter auf
Unten stellt man den LCD Typ ein. Also 128 * 64 Pixel.
Dann läd man ein passendes Bild oder Logo mit Load.
Und speichert es als BGF Datei mit Save.
Im Bascom Programm benutzt man folgenden Befehl:
Bild_Daten:
$bgf "Dateiname.bgf"
Beispiel:
Bild1:
$bgf "test.bgf"
So könnte ein Beispielprogramm aussehen:
$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 32
$swstack = 10
$framesize = 40
$lib "glcdKS108.lib"
Dim A As Byte
Config Graphlcd = 128 * 64sed , Dataport = Portd , Controlport = Portb , Ce = 2 , Ce2 = 3 , Cd = 0 , Rd = 1 , Reset = 5 , Enable = 4
Cls
Wait 1
Setfont Font16x16
Lcdat 4 , 24 , "Hallo"
Wait 3
Cls
Setfont Font8x8
Lcdat 2 , 1 , "Strippenstrolch"
Wait 3
Cls
Lcdat 2 , 1 , "invers" , 1
For A = 1 To 10
Lcdat 5 , 8 , A , 0
Wait 1
Next A
Wait 2
Cls
Line(0 , 63) -(127 , 0) , 1
Wait 2
Cls
Circle(20 , 50) , 5 , 1
Wait 2
Cls
Pset 5 , 50 , 1
Wait 2
Pset 5 , 50 , 0
Showpic 0 , 0 , Bild1
End
$include "font8x8.font"
$include "font16x16.font"
Bild1:
$bgf "test.bgf"
Habe ein Testprogramm geschrieben. Hier das Bild.
Und das Programm dazu.
$regfile = "m8adef.dat"
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
$lib "glcdKS108.lib"
Dim A As Byte
Config Graphlcd = 128 * 64sed , Dataport = Portd , Controlport = Portb , Ce = 2 , Ce2 = 3 , Cd = 0 , Rd = 1 , Reset = 5 , Enable = 4
Cls
Do
Wait 1
Setfont Font8x8
Lcdat 1 , 1 , "Strippenstrolch" , 1
A = A + 1
Lcdat 3 , 1 , "Wert: "
Lcdat 3 , 50 , A
Line(0 , 63) -(127 , 20) , 1
Circle(80 , 50) , 9 , 1
Line(10 , 43) -(20 , 33) , 1
Line(10 , 33) -(20 , 43) , 1
Loop
End
$include "font8x8.font"
Einfache Balkenanzeige vom Analogwert
Ich habe hier mal eine einfache Balkenanzeige gebastelt. Es wird der Analogwert eingelesen
und durch 10 geteilt damit der Wert auf das Display paßt. Quasi Maßstab 1:10.
Der Wert wird angezeigt und wenn sich der Wert innerhalb einer Sekunde verändert hat
wird der Balken gelöscht und ein neuer mit dem neuen Wert gezeichnet.
Und hier das Programm dazu:
$regfile = "m8adef.dat"
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
$lib "glcdKS108.lib"
Dim A As Byte
Dim B As Byte
Dim Wert As Word
Dim Wertvergleich As Byte
Config Portc.0 = Input
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Graphlcd = 128 * 64sed , Dataport = Portd , Controlport = Portb , Ce = 2 , Ce2 = 3 , Cd = 0 , Rd = 1 , Reset = 5 , Enable = 4
Cls
Do
If Wertvergleich <> Wert Then
For B = 125 To 1 Step -1 'Balken löschen
Line(b , 20) -(b , 30) , 0
Next B
For A = 1 To Wert 'Balken zeichnen
Line(a , 20) -(a , 30) , 1
Next A
End If
Wait 1
Wertvergleich = Wert
Wert = Getadc(0)
Wert = Wert / 10
Setfont Font8x8
Lcdat 1 , 1 , "Wert: "
Lcdat 1 , 40 , " "
Lcdat 1 , 40 , Wert
Loop
End
$include "font8x8.font"
Einfache Diagrammanzeige
Mit einem Grafik LCD kann man sich auch schön den Verlauf eines (Spannungs)wertes anzeigen lassen.
Habe mein Projektboard genommen und ein Poti an Portc.0 des Atmega 8 angeschlossen.
Den Analogwert habe ich durch 18 geteilt damit ich mit der Höhe unter 56 Pixel bleibe, da ja noch der
Text von 8 Pixel darüber ist.
Es wird jede Sekunde ein Wert eingelesen und angezeigt.
Zusätzlich wird vom alten Wert zum aktuellen Wert eine Linie gezeichnet.
Wenn 120 Werte gezeichnet sind ist das Display fast voll und wird gelöscht. Das Diagramm beginnt von vorne.
Wenn man die Zeile B=A+1 in B=A+2 abändert wird die Auflösung feiner und das Diagramm schöner.
Es passen dann aber nur noch 60 Werte auf das Display.
Hier ein einfachen Beispiel das jeder sich so anpassen kann, wie er es braucht
$regfile = "m8adef.dat"
$crystal = 1000000
$hwstack = 40
$swstack = 16
$framesize = 32
$lib "glcdKS108.lib"
Dim A As Byte
Dim B As Byte
Dim Wert As Word
Dim Alter_wert As Byte
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'Analog digital wandler konfigurieren
Config Portc.0 = Input
Config Graphlcd = 128 * 64sed , Dataport = Portd , Controlport = Portb , Ce = 2 , Ce2 = 3 , Cd = 0 , Rd = 1 , Reset = 5 , Enable = 4
Cls
Wait 1
A = 1
Do
B = A + 1 'Bei Bedarf abändern
Wert = Getadc(0)
Wert = Wert / 18 'aus Analogwert 0-1024 einen Wert 0-57 machen
Setfont Font8x8 'Zeichensatz auswählen
If Wert < 10 Then Lcdat 1 , 40 , " " 'alte Anzeige löschen
Lcdat 1 , 1 , "Wert: "
Lcdat 1 , 40 , Wert
Wert = 63 - Wert 'y wert 63 ist die Grundlinie
Line(a , Alter_wert) -(b , Wert) , 1 'Linie zeichnen
Alter_wert = Wert
A = A + 1 'Linie ein Pixel weiter rechts zeichnen
If A >= 120 Then 'Wenn Spalte 120 erreicht dann GLCD löschen
Cls
A = 1
End If
Wait 1
Loop
End
Hier noch zwei Bilder vom Ergebnis:
Hier das Diagramm mit der geänderten Zeile (B=a+1 in B=a+2)
Hier ein Beispiel mit Größenachsen:$regfile = "m8adef.dat"
$crystal = 1000000
$hwstack = 40
$swstack = 16
$framesize = 32
$lib "glcdKS108.lib"
Dim A As Byte
Dim B As Byte
Dim Wert As Word
Dim Alter_wert As Byte
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'Analog digital wandler konfigurieren
Config Portc.0 = Input
Config Graphlcd = 128 * 64sed , Dataport = Portd , Controlport = Portb , Ce = 2 , Ce2 = 3 , Cd = 0 , Rd = 1 , Reset = 5 , Enable = 4
Cls
Wait 1
A = 8 'Ab Spalte 8 beginnen
Do
Line(2 , 10) -(2 , 63) , 1
Line(3 , 63) -(127 , 63) , 1
Line(2 , 53) -(6 , 53) , 1
Line(2 , 43) -(6 , 43) , 1
Line(2 , 33) -(6 , 33) , 1
Line(2 , 23) -(6 , 23) , 1
Line(2 , 13) -(6 , 13) , 1
Line(18 , 62) -(18 , 59) , 1
Line(28 , 62) -(28 , 59) , 1
Line(38 , 62) -(38 , 59) , 1
Line(48 , 62) -(48 , 59) , 1
Line(58 , 62) -(58 , 59) , 1
Line(68 , 62) -(68 , 59) , 1
Line(78 , 62) -(78 , 59) , 1
Line(88 , 62) -(88 , 59) , 1
Line(98 , 62) -(98 , 59) , 1
Line(108 , 62) -(108 , 59) , 1
Line(118 , 62) -(118 , 59) , 1
B = A + 2
Wert = Getadc(0)
Wert = Wert / 20 'aus Analogwert 0-1024 einen Wert 0-51 machen
Setfont Font8x8 'Zeichensatz auswählen
If Wert < 10 Then Lcdat 1 , 40 , " " 'alte Anzeige löschen
Lcdat 1 , 1 , "Wert: "
Lcdat 1 , 40 , Wert
Wert = 62 - Wert 'y wert 62 ist die Grundlinie
Line(a , Alter_wert) -(b , Wert) , 1 'Linie zeichnen
Alter_wert = Wert
A = A + 1 'Linie ein Pixel weiter rechts zeichnen
If A = 120 Then 'Wenn Spalte 120 erreicht dann GLCD löschen
Cls
A = 8
End If
Wait 1
Loop
End
$include "font8x8.font"
Das Ergebnis sieht dann so aus:
Ein Bild vom Versuchsaufbau: