Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 12 von 12

Thema: i2c LCD Adapter

  1. #11
    mac5150
    Gast
    Zitat Zitat von Smith-mini.plane Beitrag anzeigen
    Hallo Mathias,
    klasse funktioniert auch bei mir, jetzt muss ich es nur noch richtig verstehen !!

    Gruß Thomas
    Hallo Thomas,

    schau Dir den offiziellen Post davor an (Inhaltsverzeichnis in Post 1),
    dort wird einiges erklärt.

    Viele Grüße
    Mathias

  2. #12
    Kabelträger
    Registriert seit
    07.11.2016
    Alter
    56
    Beiträge
    21
    Hi Leute,

    wenn man 2 LCDs betreiben möchte, muss man eines sozusagen manuell ansteuern.

    Ich habe dafür mal die Routinen für das LCD am PCF8574 zusammengstellt und ausführlich kommentiert.
    (Anschluss-Variante YwRobot).
    Vielleicht kann sie jemand gebrauchen.

    Bei Fragen bitte (hier) melden oder unter folgenden Links nachschauen:

    Infos und Vorlagen:
    ' -> http://rn-wissen.de/wiki/index.php/LCD-Modul_am_AVR
    ' -> http://www.sprut.de/electronic/lcd/
    ' -> https://www.makerconnect.de/index.ph...etreiben.2130/
    ' -> http://www.forum.g-heinrichs.de/viewtopic.php?f=12&t=73

    Code:
    ' Variable
    Dim Pcf8574_status As Byte
    Const Pcf8574_w = &H40
    Const Pcf8574_r = &H41
    Dim Lcd_temp As Byte
    Dim Lcd_char As Byte
    Dim I As Byte
    
    
    
    ' ***
    ' Hauptprogramm
    ' Von hier werden die Subroutinen aufgerufen
    ' ***
    
    
    
    ' Subroutinen fuer die LCD-Funktionen:
    ' -----------------------------------
    
    ' Arduino-Erweiterung / YwRobot (=V2)
    ' -> http://www.forum.g-heinrichs.de/viewtopic.php?f=12&t=73
    '
    ' 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)
    '
    ' Schreiben ins Register:
    ' %Bxxxx_0100 -> %Bxxxx_0000
    ' Schreiben eine Zeichens:
    ' %Bxxxx_0101 -> %Bxxxx_0000
    ' Geschrieben wird bei fallender Flanke von E
    
    Twi_lcd_init:
       ' Wartezeit zur Selbstinitialisierung des LCD
       ' 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 = 79
       Gosub Twi_lcd_sendchar
       Lcd_char = 107
       Gosub Twi_lcd_sendchar
    Return
    
    ' Hintergrundbeleuchtung einschalten:
    ' set lcd_temp.3 = 1
    ' (z.Z. nicht implementiert)
    
    ' 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 des Befehls 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 des Befehls 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 des Befehls durch LCD
       Reset Lcd_temp.2
       I2cwbyte Lcd_temp
       ' Senden L-Nibble
       ' Befehl=0, E=1 und RS=0
       Lcd_temp = &B0010_0100
       I2cwbyte Lcd_temp
       ' E auf 0 -> Einlesen des Befehls 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
             ' Befehl=0, E=1 und RS=0
             Lcd_temp = &B0001_0100
             I2cwbyte Lcd_temp
             Reset Lcd_temp.2
             ' E auf 0 -> Einlesen des Befehls durch LCD
             I2cwbyte Lcd_temp
             ' Senden L-Nibble
             ' Befehl=0, E=1 und RS=0
             Lcd_temp = &B0100_0100
             I2cwbyte Lcd_temp
             ' E auf 0 -> Einlesen des Befehls durch LCD
             Reset Lcd_temp.2
             I2cwbyte Lcd_temp
             Waitus 50
          Next I
       End If
       '
       I2cstop
       '
    Return
    
    ' Zeichen ausgeben
    ' Variable "lcd_char" enthaelt den Wert fuer das Zeichen
    Twi_lcd_sendchar:
       '
       I2cstart
       I2cwbyte Pcf8574_w
       '
       'Bit 4-7 (H-Nibble) senden
       Lcd_temp = Lcd_char And &B1111_0000
       I2cwbyte Lcd_temp
       ' Befehl=0, E=1 und RS=1
       Set Lcd_temp.2
       Set Lcd_temp.0
       I2cwbyte Lcd_temp
       ' E und RS auf 0 -> Einlesen des Befehls durch LCD
       Reset Lcd_temp.2
       Reset Lcd_temp.0
       I2cwbyte Lcd_temp
       ' Bit 0-3 (L-Nibble) senden
       Lcd_temp = Lcd_char And &B0000_1111
       Shift Lcd_temp , Left , 4
       I2cwbyte Lcd_temp
       ' E und RS auf 1 setzen und incl. L-Nibble senden
       Set Lcd_temp.2
       Set Lcd_temp.0
       I2cwbyte Lcd_temp
       ' E und RS auf 0 setzen und incl. H-Nibble senden
       ' Das LCD liest beim Flankenwechsel von E den Wert ein
       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 = I
       Gosub Twi_lcd_sendchar
    Next I
    Return
    LG RoBue
    Geändert von RoBue (14.02.2017 um 16:12 Uhr)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •