LCD Display am Raspi

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
achim0401
User
Beiträge: 19
Registriert: Donnerstag 23. Juli 2020, 15:12

Hallo
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)
Ein Ergebniss gibt es bereits. Die Beleuchtung ist eingeschaltet und es sind schwach schwarze Quadrate sichtbar.
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
Benutzeravatar
Dennis89
User
Beiträge: 1153
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo Achim,

nett das du auch hier angemeldet bist. Ich dachte wir hätten das mit dem *-Import schon besprochen?
Oder ist dieses Thema hier Zufall und das bist nicht du?

https://forum-raspberrypi.de/forum/thre ... /?pageNo=3

Es geht bestimmt nicht schneller mit zwei Foren, manchmal muss man Gedult haben, es hat nicht immer jeder gleich viel Zeit.


Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
achim0401
User
Beiträge: 19
Registriert: Donnerstag 23. Juli 2020, 15:12

Hallo Dennis
Leider konnte bisher nicht geklärt werden ob es ein Python oder Raspi Problem ist. Es liegt wahrscheinlich an einer fehlerhaften Einstellung oder etwas vergessen von mir. Meistens ist es ja nur eine "Kleinigkeit". Hatte bei den anderen Einstellungen schon viel begriffen und gemacht.
Ansonsten gilt ja, die Hoffnung stirbt zuletzt.
Antworten