versuche seit Tagen mein LCD Display am Raspi in Betrieb zu nehmen.Verwende den Raspberry PI 4 mit Python. Der I2C Bus läuft ohne Problem. Habe es mit einem PCF8574 ausprobiert. Habe dazu 8x LED angeschlossen und konnte sie ohne Probleme Ein. und Ausschalten. Zur Verbindung zwischen den Spannungen verwende ich einen Pegelwandler. Verwende ein LCD Display mit 4x16 Zeichen das über einen PCF8574 anheschlossen wird. Die Belegung ist dabei
RS - P4
R/W - P5
E - P6
D4 - P0
D5 - P1
D6 - P2
D7 - P3
Mit P7 kann ich die Beleuchtung ein und ausschalten. Als Programm verwende ich
Code: Alles auswählen
import lcddriver
from time import *
lcd = lcddriver.lcd()
lcd.lcd_backlight("on")
lcd.lcd_clear()
lcd.lcd_display_string("Tutu-",1)
lcd.lcd_display_string("Zeile 2",2)
lcd.lcd_display_string("Zeile 3",3)
lcd.lcd_display_string("Zeile 4",4)
Als lcddriver verwende ich
Code: Alles auswählen
import sys
sys.path.append("./lib")
import i2c_lib
from time import *
# LCD Address
ADDRESS = 0x20
# commands
LCD_CLEARDISPLAY = 0x01
LCD_RETURNHOME = 0x02
LCD_ENTRYMODESET = 0x04
LCD_DISPLAYCONTROL = 0x08
LCD_CURSORSHIFT = 0x10
LCD_FUNCTIONSET = 0x20
LCD_SETCGRAMADDR = 0x40
LCD_SETDDRAMADDR = 0x80
# flags for display entry mode
LCD_ENTRYRIGHT = 0x00
LCD_ENTRYLEFT = 0x02
LCD_ENTRYSHIFTINCREMENT = 0x01
LCD_ENTRYSHIFTDECREMENT = 0x00
# flags for display on/off control
LCD_DISPLAYON = 0x04
LCD_DISPLAYOFF = 0x00
LCD_CURSORON = 0x02
LCD_CURSOROFF = 0x00
LCD_BLINKON = 0x01
LCD_BLINKOFF = 0x00
# flags for display/cursor shift
LCD_DISPLAYMOVE = 0x08
LCD_CURSORMOVE = 0x00
LCD_MOVERIGHT = 0x04
LCD_MOVELEFT = 0x00
# flags for function set
LCD_8BITMODE = 0x10
LCD_4BITMODE = 0x00
LCD_2LINE = 0x08
LCD_1LINE = 0x00
LCD_5x10DOTS = 0x04
LCD_5x8DOTS = 0x00
# flags for backlight control
LCD_BACKLIGHT = 0x08
LCD_NOBACKLIGHT = 0x00
En = 0b01000000 # Enable bit 0b0000 0100
Rw = 0b00100000 # Read/Write bit 0b0000 0010
Rs = 0b00010000 # Register select bit 0b0000 0001
class lcd:
#initializes objects and lcd
def __init__(self):
self.lcd_device = i2c_lib.i2c_device(ADDRESS)
self.lcd_write(0x03)
self.lcd_write(0x03)
self.lcd_write(0x03)
self.lcd_write(0x02)
self.lcd_write(LCD_FUNCTIONSET | LCD_2LINE | LCD_5x8DOTS | LCD_4BITMODE)
self.lcd_write(LCD_DISPLAYCONTROL | LCD_DISPLAYON)
self.lcd_write(LCD_CLEARDISPLAY)
self.lcd_write(LCD_ENTRYMODESET | LCD_ENTRYLEFT)
sleep(0.2)
# clocks EN to latch command
def lcd_strobe(self, data):
self.lcd_device.write_cmd(data | En | LCD_BACKLIGHT)
sleep(.0005)
self.lcd_device.write_cmd(((data & ~En) | LCD_BACKLIGHT))
sleep(.0001)
def lcd_write_four_bits(self, data):
self.lcd_device.write_cmd(data | LCD_BACKLIGHT)
self.lcd_strobe(data)
# write a command to lcd
def lcd_write(self, cmd, mode=0):
self.lcd_write_four_bits(mode | (cmd & 0xF0))
self.lcd_write_four_bits(mode | ((cmd << 4) & 0xF0))
#turn on/off the lcd backlight
def lcd_backlight(self, state):
if state in ("on","On","ON"):
self.lcd_device.write_cmd(LCD_BACKLIGHT)
elif state in ("off","Off","OFF"):
self.lcd_device.write_cmd(LCD_NOBACKLIGHT)
else:
print("Unknown State!")
# put string function
def lcd_display_string(self, string, line):
if line == 1:
self.lcd_write(0x80) # 0x80
if line == 2:
self.lcd_write(0xC0) # 0xC0
if line == 3:
self.lcd_write(0x94) # 0x94
if line == 4:
self.lcd_write(0xD4) # 0xD4
for char in string:
self.lcd_write(ord(char), Rs)
# clear lcd and set to home
def lcd_clear(self):
self.lcd_write(LCD_CLEARDISPLAY)
self.lcd_write(LCD_RETURNHOME)
Die Busadresse habe ich vorher mit i2cdetect als 0x20 ermittelt und eingetragen.
Das Display ist ok und eingestellte Helloigkeit stimmt auch. Habe es vorher mit einem anderen Prozessor getestet.
Hat jemand eine Idee was los ist?
achim