Zur schnelleren Übersicht......
Ansteuerungsroutinen mit einem PCx8574(A), HIER klicken oder einfach in diesem Beitrag weiter lesen.
Ansteuerungsroutinen mit einem PCx8575, HIER klicken !
Ansteuerungsroutinen für ein Arduino-LCD (mit PCA8574), HIER klicken !
Ansteuerroutinen für ein 16x2LCD mit Pollin (oder Conrad)-I2C-Adapter findet ihr HIER bzw. in Beitrag 44!
Betrieb von diversen GLCD`s als Charakter-LCD`s am I2C-Bus wird HIER beschrieben!
Hallo zusammen!
Es gibt zwar schon seit Jahren für BASCOM eine LIB zum Betrieb eines LCD am I2C (TWI) Bus ( Lcd_i2c.lib ),
jedoch funktioniert diese LIB nicht mit jedem Display.
Obendrein ist die Abarbeitung durch die LIB nicht besonders schnell und es kam bei mir immer mal wieder vor, dass die Displays neu initialisiert werden mussten, weil plötzlich nur noch Unsinn angezeigt wurde.
Dieser Effekt trat besonders immer dann auf, wenn in schneller Folge die Displayanzeige wechseln sollte.
Aus den eben genannten Gründen habe ich mich der Sache mal angenommen und rausgekommen ist eine schnelle und zuverlässige Ansteuerung von LCD`s über den I2C bzw. TWI Bus.
Damit die Verwendung beim Programmieren möglichst einfach ist, benötigt man im Programm selbst nur drei Anweisungen:
Generell muss das LCD_init natürlich nur einmal zu Beginn ausgeführt werden!
Es ist aber auch möglich, dies jederzeit im Programm noch einmal aufzurufen..... z.B. durch einen Taster, oder eine Automatik.
Diese Eigenschaft ist z.B. dann wichtig, wenn man während des Programmablaufes das Display mal vom I2C-Bus trennt und später wieder ansteckt.
In diesem Fall muss erst mal ein INIT zum Display gesendet werden, damit es wieder funktioniert.
Die Anweisung LCD_cls erklärt sich wohl von selbst.
Es löscht BEIDE Displaycontroller per Parameteranweisung gleichzeitig.
Mit LCD_ X , Y , "String" erfolgt die Eingabe des Textes, der auf dem Display an der angegebenen Stelle erscheinen soll.
Für X gibt man die Zeilennummer an,
für Y gibt man den Startcharakter an und
bei "String" wird der anzuzeigende Text eingegeben.
Damit diese Anweisungen funktionieren, muss man folgendes beachten:
Einmal müssen die zugehörigen Subroutinen und globalen Variablen im Hauptprogramm deklariert werden!
Da es sich bei meinem Testobjekt um ein 27x4 LCD gehandelt hat, habe ich den Text1-String auch auf 27 Zeichen begrenzt.
Maximal möglich wären hier wohl 40 Zeichen!
In den Subroutinen müssen dann nur noch per "$include"-Anweisung die Routinen mit eingebunden werden!
Im Hauptprogramm muss man also nur noch:
angeben und die drei Dateien im selben Verzeichnis abspeichern, in dem sich auch das Hauptprogramm befindet.
Das war es dann auch schon und es steht der erfolgreichen LCD-Ansteuerung über I2C nichts mehr im Wege.
Was in diesem Beitrag also noch fehlt, sind die einzelnen Subroutinen......
und die folgen jetzt!
Die Sub zum INIT:
(Überarbeitete Version vom 09.01.12)
Die Sub für CLS:
(Überarbeitete Version vom 09.01.12)
Die Sub für die Textausgabe:
(Überarbeitete Version vom 09.01.12)
FERTIG !
Ein Beispielprogramm zur Verwendung und einige Hinweise folgen in Kürze!
Grüße,
Cassio
Ansteuerungsroutinen mit einem PCx8574(A), HIER klicken oder einfach in diesem Beitrag weiter lesen.
Ansteuerungsroutinen mit einem PCx8575, HIER klicken !
Ansteuerungsroutinen für ein Arduino-LCD (mit PCA8574), HIER klicken !
Ansteuerroutinen für ein 16x2LCD mit Pollin (oder Conrad)-I2C-Adapter findet ihr HIER bzw. in Beitrag 44!
Betrieb von diversen GLCD`s als Charakter-LCD`s am I2C-Bus wird HIER beschrieben!
Hallo zusammen!
Es gibt zwar schon seit Jahren für BASCOM eine LIB zum Betrieb eines LCD am I2C (TWI) Bus ( Lcd_i2c.lib ),
jedoch funktioniert diese LIB nicht mit jedem Display.
Obendrein ist die Abarbeitung durch die LIB nicht besonders schnell und es kam bei mir immer mal wieder vor, dass die Displays neu initialisiert werden mussten, weil plötzlich nur noch Unsinn angezeigt wurde.
Dieser Effekt trat besonders immer dann auf, wenn in schneller Folge die Displayanzeige wechseln sollte.
Aus den eben genannten Gründen habe ich mich der Sache mal angenommen und rausgekommen ist eine schnelle und zuverlässige Ansteuerung von LCD`s über den I2C bzw. TWI Bus.
Damit die Verwendung beim Programmieren möglichst einfach ist, benötigt man im Programm selbst nur drei Anweisungen:
- LCD_ X , Y , "String"
- LCD_cls
- LCD_init
Generell muss das LCD_init natürlich nur einmal zu Beginn ausgeführt werden!
Es ist aber auch möglich, dies jederzeit im Programm noch einmal aufzurufen..... z.B. durch einen Taster, oder eine Automatik.
Diese Eigenschaft ist z.B. dann wichtig, wenn man während des Programmablaufes das Display mal vom I2C-Bus trennt und später wieder ansteckt.
In diesem Fall muss erst mal ein INIT zum Display gesendet werden, damit es wieder funktioniert.
Die Anweisung LCD_cls erklärt sich wohl von selbst.
Es löscht BEIDE Displaycontroller per Parameteranweisung gleichzeitig.
Mit LCD_ X , Y , "String" erfolgt die Eingabe des Textes, der auf dem Display an der angegebenen Stelle erscheinen soll.
Für X gibt man die Zeilennummer an,
für Y gibt man den Startcharakter an und
bei "String" wird der anzuzeigende Text eingegeben.
Damit diese Anweisungen funktionieren, muss man folgendes beachten:
Einmal müssen die zugehörigen Subroutinen und globalen Variablen im Hauptprogramm deklariert werden!
Code:
Declare Sub Lcd_(byval X1 As Byte , Byval X2 As Byte , Byval Text1 As String * 27)
Declare Sub Lcd_cls
Declare Sub Lcd_init
Dim Text As String * 27 'LCD Ausgabe
Dim Lcd_text(27) As Byte At Text Overlay 'ASCII-Werte der LCD Ausgabe
Dim Init(8) As Byte 'Byte-Array für LCD-Parameter
Const Pcx_lcd = &H74 'I2C-Adresse des PCx8574(A)
Da es sich bei meinem Testobjekt um ein 27x4 LCD gehandelt hat, habe ich den Text1-String auch auf 27 Zeichen begrenzt.
Maximal möglich wären hier wohl 40 Zeichen!
In den Subroutinen müssen dann nur noch per "$include"-Anweisung die Routinen mit eingebunden werden!
Im Hauptprogramm muss man also nur noch:
Code:
' #############################################################################
Sub Lcd_(x1 As Byte , X2 As Byte , Text1 As String * 27) 'Sub zur Zeichenausgabe am Display
$include "_2704_i2c.bas"
' #############################################################################
Sub Lcd_cls: 'Sub zum löschen beider Displayhälften
$include "_2704_CLS.bas"
' #############################################################################
Sub Lcd_init: 'Sub zum initialisieren beider Displayhälften
$include "_2704_init.bas"
angeben und die drei Dateien im selben Verzeichnis abspeichern, in dem sich auch das Hauptprogramm befindet.
Das war es dann auch schon und es steht der erfolgreichen LCD-Ansteuerung über I2C nichts mehr im Wege.
Was in diesem Beitrag also noch fehlt, sind die einzelnen Subroutinen......
und die folgen jetzt!
Die Sub zum INIT:
(Überarbeitete Version vom 09.01.12)
Code:
$nocompile
' #############################################################################
Init(1) = &HC3
Init(2) = &H03
I2csend Pcx_lcd , Init(1) , 2 '03h
Waitms 1
I2csend Pcx_lcd , Init(1) , 2 '03h
Waitms 1
I2csend Pcx_lcd , Init(1) , 2 '03h
Waitms 1
Init(1) = &HC2
Init(2) = &H02
I2csend Pcx_lcd , Init(1) , 2 '02h (4Bit Modus)
Waitms 1
I2csend Pcx_lcd , Init(1) , 2
Init(1) = &HC8
Init(2) = &H08
I2csend Pcx_lcd , Init(1) , 2 '28h (4 Zeilen Dispaly)
Waitms 1
Init(1) = &HC0
Init(2) = &H00
I2csend Pcx_lcd , Init(1) , 2
Init(1) = &HCE
Init(2) = &H0E
I2csend Pcx_lcd , Init(1) , 2 '0Eh (Select Mode)
Waitms 1
Init(1) = &HC0
Init(2) = &H00
I2csend Pcx_lcd , Init(1) , 2
Init(1) = &HC6
Init(2) = &H06
I2csend Pcx_lcd , Init(1) , 2 '06h (Select Mode)
Waitms 1
Init(1) = &HC0
Init(2) = &H00
I2csend Pcx_lcd , Init(1) , 2
Init(1) = &HCC
Init(2) = &H0C
I2csend Pcx_lcd , Init(1) , 2 '0Ch (Select Mode)
Waitms 1
Init(1) = &HC0
Init(2) = &H00
I2csend Pcx_lcd , Init(1) , 2
Init(1) = &HC1
Init(2) = &H01
I2csend Pcx_lcd , Init(1) , 2 '01h (Cls)
Waitms 1
End Sub
Die Sub für CLS:
(Überarbeitete Version vom 09.01.12)
Code:
$nocompile
'Clear Screen Anweisung
Init(1) = &HC0
Init(2) = &H00
Init(3) = &HC1
Init(4) = &H01
'Erste Zeile, erstes Zeichen anwählen
Init(5) = &HC8
Init(6) = &H08 '8h für E1 + E2 senden
Init(7) = &HC0
Init(8) = &H00 '0h für E1 und E2 senden
I2csend Pcx_lcd , Init(1) , 8
Waitms 1
End Sub
Die Sub für die Textausgabe:
(Überarbeitete Version vom 09.01.12)
Code:
$nocompile
'Dim Pos As Byte 'Locate Berechnung
'Dim Ascii_zeichen(5) As Byte 'getrennte ASCII-Werte zur Übermittlung
'Dim Zz As Byte 'Zeichenzähler
'Dim Zi As Byte 'Zeichen-Indexzähler
' #############################################################################
Text = Text1 'max.27 Zeichen String übergeben
Select Case X1
Case 1
Pos = X1 + &H7E 'Anzeige-Charakter berechnen
Pos = Pos + X2 'Anzeige-Charakter berechnen
Gosub Lcd1 '1.Displaycontroller verwenden
Case 2
Pos = X1 + &HBD 'Anzeige-Charakter berechnen
Pos = Pos + X2 'Anzeige-Charakter berechnen
Gosub Lcd1 '1.Displaycontroller verwenden
Case 3
Pos = X1 + &H7C 'Anzeige-Charakter berechnen
Pos = Pos + X2 'Anzeige-Charakter berechnen
Gosub Lcd2 '2.Displaycontroller verwenden
Case 4
Pos = X1 + &HBB 'Anzeige-Charakter berechnen
Pos = Pos + X2 'Anzeige-Charakter berechnen
Gosub Lcd2 '2.Displaycontroller verwenden
Case Else
End Select
End Sub
' #############################################################################
Lcd1: 'Sub zur LCD-Ausgabe auf 1.Displaycontroller
Zz = Len(text)
Init(4) = Pos And &H0F 'Zeichen-Startposition Bit3-0
Init(2) = Pos And &HF0 'Zeichen-Startposition Bit7-4
Shift Init(2) , Right , 4
Init(1) = Init(2) + &H80 'Bit7-4 + E1
Init(3) = Init(4) + &H80 'Bit3-0 + E1
I2csend Pcx_lcd , Init(1) , 4 'Start-Array zum Display senden
Waitus 100
Ascii_zeichen(5) = &H00
For Zi = 1 To Zz 'Zeichenlänge des Strings ermitteln
Ascii_zeichen(1) = Lcd_text(zi) And &HF0 'ASCII-Wert Bit7-4
Shift Ascii_zeichen(1) , Right , 4
Ascii_zeichen(2) = Ascii_zeichen(1) + &H10 'Bit7-4 + RS-Pin
Ascii_zeichen(1) = Ascii_zeichen(1) + &H90 'Bit7-4 + RS + E1
Ascii_zeichen(3) = Lcd_text(zi) And &H0F 'ASCII-Wert Bit3-0
Ascii_zeichen(4) = Ascii_zeichen(3) + &H10 'Bit3-0 + RS-Pin
Ascii_zeichen(3) = Ascii_zeichen(3) + &H90 'Bit3-0 + RS + E1
I2csend Pcx_lcd , Ascii_zeichen(1) , 5 'ASCII-Daten zum Display senden
Waitus 400
Next Zi 'je nach Anzahl der Zeichen im String wiederholen
Return
' #############################################################################
Lcd2: 'Sub zur LCD-Ausgabe auf 2.Displaycontroller
Zz = Len(text)
Init(4) = Pos And &H0F
Init(2) = Pos And &HF0
Shift Init(2) , Right , 4
Init(1) = Init(2) + &B0100_0000 'E2 hinzu
Init(3) = Init(4) + &B0100_0000 'E2 hinzu
I2csend Pcx_lcd , Init(1) , 4
Waitus 100
Ascii_zeichen(5) = &H00
For Zi = 1 To Zz
Ascii_zeichen(1) = Lcd_text(zi) And &HF0
Shift Ascii_zeichen(1) , Right , 4
Ascii_zeichen(2) = Ascii_zeichen(1) + &B0001_0000 'Bit7-4 + RS-Pin
Ascii_zeichen(1) = Ascii_zeichen(1) + &B0101_0000 'Bit7-4 + RS + E2
Ascii_zeichen(3) = Lcd_text(zi) And &H0F
Ascii_zeichen(4) = Ascii_zeichen(3) + &B0001_0000 'Bit3-0 + RS-Pin
Ascii_zeichen(3) = Ascii_zeichen(3) + &B0101_0000 'Bit3-0 + RS + E2
I2csend Pcx_lcd , Ascii_zeichen(1) , 5
Waitus 400
Next Zi
Return
FERTIG !
Ein Beispielprogramm zur Verwendung und einige Hinweise folgen in Kürze!
Grüße,
Cassio