Top

HD44780

Das HD44780 hat zwei Zeilen mit je 16 Zeichen zur Darstellung. Es ist ein Industriestandard für diese Art von Bildschirmen.

HD44780

Das HD44780 hat 16 Pins, man kann es mit 4 und 8 Bit steuern. In der Tabelle ist zu sehen welche Pins mit dem Raspberry Pi verbunden werden.

HD44780 RASPBERRY PI
VSS – Ground Pin 6 – GROUND
VCC – (+5V) Pin 1 – 3.3V
VE – Contrast adjustment Pin 6 – GROUND
RS – Register Select Pin 26 – SP10 CE1 N
RW – Read/Write Pin 6 – GROUND
EN – Clock (Enable) Pin 24 – SP10 CEO N
D0 – Data Bit 0
D1 – Data Bit 1
D2 – Data Bit 2
D3 – Data Bit 3
D4 – Data Bit 4 Pin 12 – GPIO 18
D5 – Data Bit 5 Pin 16 – GPIO 23
D6 – Data Bit 6 Pin 18 – GPIO 24
D7 – Data Bit 7 Pin 22 – GPIO 25
BLA – Backlight Anode (+) Pin 1 – 3.3V
BLK – Backlight Cathode (-) Pin 6 – GROUND

HD44780

Nachdem alles verkabelt ist sollte das Display nach dem einschalten aufleuchten.

Daten und Kommandos werden über die 8 Data Pins und RS gesendet.
RS teilt dem Modul mit ob die 8 Data bits Daten oder einem Kommando zugeordnet werden.

Um Daten und Kommandos and das Modul zu senden:

  1. Enable auf 1 setzen
  2. RS und D0-D7 setzen
    3 .Enable auf 0 setzen

Zwischen den Operationen muss eine kurze Zeit gewartet werden.

RW ist an GROUND angeschlossen, da nur geschrieben aber nicht gelesen werden soll.

Mit einem Python Skript kann man nun Informationen auf dem HD44780 darstellen.

import time
import RPi.GPIO as GPIO

# Define LCD to GPIO pin mapping
LCD_RS = 7
LCD_E  = 8
LCD_D4 = 25
LCD_D5 = 24
LCD_D6 = 23
LCD_D7 = 18

# Define device constants
LCD_WIDTH = 16    # Max characters per line
LCD_CHR = True
LCD_CMD = False
LCD_LINE_1 = 0x80 # RAM address for the 1st line
LCD_LINE_2 = 0xC0 # RAM address for the 2nd line

# Timing constants
E_PULSE = 0.00005
E_DELAY = 0.00005

GPIO.setmode(GPIO.BCM)
GPIO.setup(LCD_E, GPIO.OUT)  # E
GPIO.setup(LCD_RS, GPIO.OUT) # RS
GPIO.setup(LCD_D4, GPIO.OUT) # D4
GPIO.setup(LCD_D5, GPIO.OUT) # D5
GPIO.setup(LCD_D6, GPIO.OUT) # D6
GPIO.setup(LCD_D7, GPIO.OUT) # D7

def lcd_init():
    lcd_byte(0x33,LCD_CMD)
    lcd_byte(0x32,LCD_CMD)
    lcd_byte(0x28,LCD_CMD)
    lcd_byte(0x0C,LCD_CMD)
    lcd_byte(0x06,LCD_CMD)
    lcd_byte(0x01,LCD_CMD)

def lcd_string(message):
    message = message.ljust(LCD_WIDTH," ")   
    for i in range(LCD_WIDTH):
        lcd_byte(ord(message[i]),LCD_CHR)

def lcd_byte(bits, mode):
    GPIO.output(LCD_RS, mode) # RS
    # High bits
    GPIO.output(LCD_D4, False)
    GPIO.output(LCD_D5, False)
    GPIO.output(LCD_D6, False)
    GPIO.output(LCD_D7, False)
    if bits&0x10==0x10:
        GPIO.output(LCD_D4, True)
    if bits&0x20==0x20:
        GPIO.output(LCD_D5, True)
    if bits&0x40==0x40:
        GPIO.output(LCD_D6, True)
    if bits&0x80==0x80:
        GPIO.output(LCD_D7, True)
    # Toggle 'Enable' pin
    time.sleep(E_DELAY)
    GPIO.output(LCD_E, True)
    time.sleep(E_PULSE)
    GPIO.output(LCD_E, False)
    time.sleep(E_DELAY)      
    # Low bits
    GPIO.output(LCD_D4, False)
    GPIO.output(LCD_D5, False)
    GPIO.output(LCD_D6, False)
    GPIO.output(LCD_D7, False)
    if bits&0x01==0x01:
        GPIO.output(LCD_D4, True)
    if bits&0x02==0x02:
        GPIO.output(LCD_D5, True)
    if bits&0x04==0x04:
        GPIO.output(LCD_D6, True)
    if bits&0x08==0x08:
        GPIO.output(LCD_D7, True)
    # Toggle 'Enable' pin
    time.sleep(E_DELAY)
    GPIO.output(LCD_E, True)
    time.sleep(E_PULSE)
    GPIO.output(LCD_E, False)
    time.sleep(E_DELAY)

try:
    lcd_init()
    lcd_byte(LCD_LINE_1, LCD_CMD)
    lcd_string("Raspberry PI")
    lcd_byte(LCD_LINE_2, LCD_CMD)
    lcd_string("HD44780 LCD")
    time.sleep(5)
    GPIO.cleanup()
except KeyboardInterrupt:
    print "Bye..."
    GPIO.cleanup()

HD44780