Armins AVR-Buch - Grafik_LCD_ansteuern

Zuletzt geändert am 09.12.2023, 17:23:39

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.

Bild GLCD_002.jpg

Das Koordinatensystem des Display sieht so aus:

Bild GLCD_003.jpg


So wird das Display angeschlossen:

Bild GLCD_004.jpg



Bild GLCD_005.jpg


Bild GLCD_008.jpg


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

Bild GLCD_006.jpg

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.

Bild GLCD_007.jpg


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.


Bild testGLCD.jpg


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.


Bild Balken_001.jpg


Bild Balken_002.jpg


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:


Bild diagramm_002.jpg



Hier das Diagramm mit der geänderten Zeile (B=a+1 in B=a+2)


Bild diagramm5.jpg


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:


Bild diagramm500.jpg



Ein Bild vom Versuchsaufbau:




Bild GLCD_001.jpg