Dafür gibt es einerseits fertige Platinen und andererseits Libs für Bascom.
Manchmal will/muss man aber das LCD auch "zu Fuß" bzw. manuell ansprechen.
Am Portexpander PCF8574 kann man auch ein LCD betreiben.
Dafür gibt es einerseits fertige Platinen und andererseits Libs für Bascom.
Der folgende Code benutzt die sog. "Arduino-Erweiterung / YwRobot" (=V2)
PCF8574-LCD-Erweiterung.jpg
Sie ist so aufgebaut:
PIO.0 -> RS (Register-Select: 0=Befehle, 1=Zeichen)
PIO.1 -> RW (Read/Write, immer auf 0=Write)
PIO.2 -> E(nable) (Uebergabe bei fallender Flanke)
PIO.3 -> Hintergrundbeleuchtung
PIO.4-7 -> Data (4-Bit-Modus)
Daraus folgt:
- Schreiben ins Register:
&Bxxxx_0100 -> &Bxxxx_0000
-Schreiben eine Zeichens:
&Bxxxx_0101 -> &Bxxxx_0000
(Geschrieben wird bei fallender Flanke von E)
Wenn man 2 Displays betreiben will,
kann man nur eines mit einer Lib ansteuern,
das andere muss man dann manuell ansprechen.
Dafür habe ich einige Routinen zusammengestellt,
die teilweise auf schon im Netz vorfindliche aufbauen,
aber größtenteils von mir neu geschrieben wurden.
Sie sind - auch für mich selbst! - sehr ausführlich kommentiert,
so dass man das Prinzip hoffentlich leicht verstehen kann.
Alles anzeigen
RoBue
Dafür gibt es einerseits fertige Platinen und andererseits Libs für Bascom.
Der folgende Code benutzt die sog. "Arduino-Erweiterung / YwRobot" (=V2)
PCF8574-LCD-Erweiterung.jpg
Sie ist so aufgebaut:
PIO.0 -> RS (Register-Select: 0=Befehle, 1=Zeichen)
PIO.1 -> RW (Read/Write, immer auf 0=Write)
PIO.2 -> E(nable) (Uebergabe bei fallender Flanke)
PIO.3 -> Hintergrundbeleuchtung
PIO.4-7 -> Data (4-Bit-Modus)
Daraus folgt:
- Schreiben ins Register:
&Bxxxx_0100 -> &Bxxxx_0000
-Schreiben eine Zeichens:
&Bxxxx_0101 -> &Bxxxx_0000
(Geschrieben wird bei fallender Flanke von E)
Wenn man 2 Displays betreiben will,
kann man nur eines mit einer Lib ansteuern,
das andere muss man dann manuell ansprechen.
Dafür habe ich einige Routinen zusammengestellt,
die teilweise auf schon im Netz vorfindliche aufbauen,
aber größtenteils von mir neu geschrieben wurden.
Sie sind - auch für mich selbst! - sehr ausführlich kommentiert,
so dass man das Prinzip hoffentlich leicht verstehen kann.
BASCOM-Quellcode
- ' Variablen
- Const Pcf8574_w = &H40
- Const Pcf8574_r = &H41
- Dim Twilcd As Byte
- Dim Lcd_temp As Byte
- Dim Lcd_char As String * 1
- Dim i as Byte
- ' ...
- ' Subroutinen
- Twi_lcd_init:
- ' Wartezeit zur Selbstinitialisierung des LCD (Braucht man hier nicht)
- ' Waitms 15
- 'set 8-bit mode (attention)
- 'toggle the E -line
- I2csend Pcf8574_w , &B0011_0100
- I2csend Pcf8574_w , &B0011_0000
- Waitms 4
- 'set 8-bit mode (attention)
- I2csend Pcf8574_w , &B0011_0100
- I2csend Pcf8574_w , &B0011_0000
- Waitms 1
- 'set 8-bit mode (attention)
- I2csend Pcf8574_w , &B0011_0100
- I2csend Pcf8574_w , &B0011_0000
- Waitms 4
- 'set 4-bit operation
- I2csend Pcf8574_w , &B0010_0100
- I2csend Pcf8574_w , &B0010_0000
- Waitms 1
- 'set 8-bit mode (attention)
- I2csend Pcf8574_w , &B0010_0100
- I2csend Pcf8574_w , &B0010_0000
- I2csend Pcf8574_w , &B1000_0100
- I2csend Pcf8574_w , &B1000_0000
- Waitms 1
- I2csend Pcf8574_w , &B0000_0100
- I2csend Pcf8574_w , &B0000_0000
- 'display off, cursor off, blink off
- I2csend Pcf8574_w , &B1000_0100
- I2csend Pcf8574_w , &B1000_0000
- Waitms 1
- I2csend Pcf8574_w , &B0000_0100
- I2csend Pcf8574_w , &B0000_0000
- 'display on, cursor off, blinking off
- I2csend Pcf8574_w , &B1100_0100
- I2csend Pcf8574_w , &B1100_0000
- Waitms 1
- ' Loesche Display, Cursor an 1.Stelle
- Gosub Twi_lcd_cls
- ' Waitms 1
- ' OK ausgeben
- Lcd_char = "O"
- Gosub Twi_lcd_sendchar
- Lcd_char = "k"
- Gosub Twi_lcd_sendchar
- Return
- ' Hintergrundbeleuchtung einschalten:
- ' set lcd_temp.3 = 1
- ' Loeschen und Cursor an 1. Stelle (= Position 0) -> Befehl=&B0000_0001
- Twi_lcd_cls:
- I2cstart
- I2cwbyte Pcf8574_w
- ' Senden H-Nibble
- ' E=1 und RS=0
- Lcd_temp = &B0000_0100
- I2cwbyte Lcd_temp
- ' E auf 0 -> Einlesen der Werte durch LCD
- Reset Lcd_temp.2
- I2cwbyte Lcd_temp
- ' Waitms 2
- ' Senden L-Nibble
- ' E=1 und RS=0
- Lcd_temp = &B0001_0100
- I2cwbyte Lcd_temp
- ' E auf 0 -> Einlesen der Werte durch LCD
- Reset Lcd_temp.2
- I2cwbyte Lcd_temp
- Waitms 2
- I2cstop
- Return
- ' Cursor auf bestimmte Position setzen
- ' Variable "Befehl_wert" enthaelt die Position (0 bis 79 !)
- Twi_lcd_pos:
- '
- I2cstart
- I2cwbyte Pcf8574_w
- '
- ' Cursor auf Position 0, ohne loeschen -> Befehl=&B0000_0010
- ' Senden H-Nibble
- ' Befehl=00, E=1 und RS=0
- Lcd_temp = &B0000_0100
- I2cwbyte Lcd_temp
- ' E auf 0 -> Einlesen der Werte durch LCD
- Reset Lcd_temp.2
- I2cwbyte Lcd_temp
- ' Senden L-Nibble
- ' E=1 und RS=0
- Lcd_temp = &B0010_0100
- I2cwbyte Lcd_temp
- ' E auf 0 -> Einlesen der Werte durch LCD
- Reset Lcd_temp.2
- I2cwbyte Lcd_temp
- ' Warten ...
- Waitms 2
- '
- ' Cursor an gewuenschte Stelle verschieben -> Befehl=&B0001_0100
- If Befehl_wert > 0 And Befehl_wert < 80 Then
- For I = 1 To Befehl_wert
- ' Senden H-Nibble
- ' E=1 und RS=0
- Lcd_temp = &B0001_0100
- I2cwbyte Lcd_temp
- Reset Lcd_temp.2
- ' E auf 0 -> Einlesen der Werte durch LCD
- I2cwbyte Lcd_temp
- ' Senden L-Nibble
- ' E=1 und RS=0
- Lcd_temp = &B0100_0100
- I2cwbyte Lcd_temp
- ' E auf 0 -> Einlesen der Werte durch LCD
- Reset Lcd_temp.2
- I2cwbyte Lcd_temp
- Waitus 50
- Next I
- Else
- End If
- '
- I2cstop
- '
- Return
- ' Zeichen ausgeben
- ' Zeichen wird mit der Variablen "lcd_char" (String) übergeben
- Twi_lcd_sendchar:
- '
- I2cstart
- I2cwbyte Pcf8574_w
- '
- 'Bit 4-7 (H-Nibble) senden
- Lcd_temp = Asc(lcd_char) And &B1111_0000
- I2cwbyte Lcd_temp
- ' E=1 und RS=1
- Set Lcd_temp.2
- Set Lcd_temp.0
- I2cwbyte Lcd_temp
- ' E und RS auf 0 -> Einlesen der Werte durch LCD
- Reset Lcd_temp.2
- Reset Lcd_temp.0
- I2cwbyte Lcd_temp
- ' Bit 0-3 (L-Nibble) senden
- Lcd_temp = Asc(lcd_char) And &B0000_1111
- Shift Lcd_temp , Left , 4
- I2cwbyte Lcd_temp
- ' E und RS auf 1
- Set Lcd_temp.2
- Set Lcd_temp.0
- I2cwbyte Lcd_temp
- ' E und RS auf 0 -> Einlesen der Werte durch LCD
- Reset Lcd_temp.2
- Reset Lcd_temp.0
- I2cwbyte Lcd_temp
- '
- I2cstop
- '
- ' Braucht man oder braucht man nicht?
- Waitus 400
- '
- Return
- ' Testausgebe: 61 Zeichen hintereinander
- Twi_lcd_test:
- ' Gosub Twi_lcd_cls
- For I = 65 To 125
- Lcd_char = Chr(i)
- Gosub Twi_lcd_sendchar
- Next I
- Return
RoBue
8.556 mal gelesen
RUBI52 -
Hallo, hab verschiedene LCD's mit angelöteten PCF8574 Platinen. Wie kann ich die Pins vom LCD an den PCF8574 anpassen?
MfG
Rudi