Inzwischen gibt es eine Reihe solcher I2C-LCDs. Meist bestehen sie aus einem Standard-LCD, welches mit einer Zusatzplatine versehen ist. Auf dieser Platine findet man in der Regel einen PCF8574-Baustein oder etwas dazu Kompatibles (Abb. 1). Dieser Baustein kann ein Byte über das I2C-Protokoll empfangen und legt es als binäres Muster an seine Ausgänge P0 ... P7.
Das Display aus Abb. 2 habe ich für ca. 6 Euro aus China bezogen; es hat die Bezeichnung “YwRobot Arduino LCM1602 IIC V1". Es lässt sich über die 4 Anschlüsse, welche in Abb. 1 rechts zu sehen sind , problemlos an die Buchsenleiste unserer Attiny-Platine 2.0 anschließen. Die Anschlüsse für SDA und SCL werden über Patchkabel mit PortB.5 bzw. PortB.7 verbunden. Bitte vergessen Sie nicht die Brücken zu den Pull-Up-Widerständen!
Standardmäßig werden solche I2C-LCDs nicht von BASCOM unterstützt. Es gibt aber im Internet Libraries, die hier helfen sollen. BASCOM selbst verweist auf eine Library von Kent Andersson.
Um eine Library einzusetzen, muss man
1. die Library in das LIB-Verzeichnis von BASCOM kopieren
2. Die Library in sein BAS-Programm einbinden mit: $lib "Libraryname" (ohne Gleichheitszeichen).
In diesem Fall lautet der Name der Library “lcd-i2c.lib”. Wenn man diese Library in sein BAS-Programm einbindet, sollen die üblichen LCD-Befehle von BASCOM benutzbar sein. Leider funktioniert das bei dem YwRobot-Display überhaupt nicht; nach dem Start eines einfachen “Hello-World”-Programms wird kein Text angezeigt, lediglich die Hintergrundbeleuchtung flackert sehr heftig.
Einige Recherchen ergaben zwei Gründe für dieses Fehlverhalten. Kent Andersson geht bei seiner Library von folgender Verbindung zwischen PCF-Baustein und Display aus:
P0 -> D4
P1 -> D5
P2 -> D6
P3 -> D7
P4 -> RS
P5 -> RW (not used, set to 0 to ground for write)
P6 -> E2 (on 1 or 2 line display nc)
P7 -> E1(=E)
Die Zusatzplatine von YwRobot benutzt aber folgende Zuordnung:
P0 -> RS
P1 -> RW
P2 -> E
P3 -> BT (Backlight)
P4 -> D4
P5 -> D5
P6 -> D6
P7 -> D7
Im Wesentlichen sind also die beiden Halbbytes (Nibbles) vertauscht.
Glücklicherweise gibt es bereits eine leicht modifizierte Library, die ein beliebige Zuordnung von PCF-Ausgängen zu LCD-Eingängen über das BAS-Programm erlaubt (s. u.); damit lässt sich unser Zuordnungsproblem lösen.
Der Vergleich der Zuordnungstabellen macht ein weiteres Problem sichtbar: Die Backlight-Kontrolle bei YwRobot (BT) gibt es selbst bei der modifizierten Fassung von Kent Anderssons Library nicht; die entsprechende Signalleitung (E2) wird hier zur Ansteuerung einer möglichen 3. bzw. 4. LCD-Zeile benutzt. Ein Blick in die Library zeigt, dass das Signal auf dieser Leitung immer wieder seinen Pegel wechselt; dies erklärt auch das heftige Blinken des Displays beim ersten Test. Um dieses Blinken zu beseitigen, habe ich die modifizierte Library nochmals ergänzt: Bevor ein Byte mit dem i2csend-Befehl an die YwRobot-Platine geschickt wird, wird das BT- bzw. E2-Bit immer auf 1 gesetzt. Dadurch bleibt der Transistor (vgl. Abb. 3) durchgeschaltet, der Anschluss LED- des Displays bleibt auf Masse gezogen und die Hintergrundbeleuchtung bleibt eingeschaltet.
Code: Alles auswählen
' Test-Datei für Attiny-Platine 2.0 mit I2C-LCD von E. Eube, G. Heinrichs und U. Ihlefeldt
'----------------------------------------------------------------------------
$regfile = "attiny2313.dat" 'Attiny2313
$crystal = 4000000 '4 MHz
$lib "YLcd_i2c.lib" 'YwRobot Treiber für LCD
$hwstack = 64
$swstack = 10
$framesize = 40
'**********************************************************
'******************* Deklarationen ************************
Const Pcf8574_lcd = 78 'Adresse des I2C-LCDs
Dim _lcd_e As Byte
_lcd_e = 128
Const Pcf_d4 = 4 'Pinzuordnung PCF8574 -> LCD
Const Pcf_d5 = 5
Const Pcf_d6 = 6
Const Pcf_d7 = 7
Const Pcf_rs = 0
Const Pcf_rw = 1
Const Pcf_e2 = 3 '3./4. Zeile bzw. Backlight
Const Pcf_e1 = 2 'E
'****************** Initialisierung ***********************
Ddrb = &B11111111 'Standardbelegung der DDRs
Ddrd = &B01110000
Portd = &B10001111
Config Scl = Portb.7 'Konfigurieren von I2C
Config Sda = Portb.5
Config Lcd = 16 * 2
Config I2cdelay = 1
'warte bis Kondensator bei Ta0 geladen, auch für LCD-Init:
Waitms 300
'**********************************************************
'******************** Hauptprogramm ***********************
Cls
Lcd "Hello world!"
Locate 2 , 1
Lcd "2. row..."
End