Portexpander PCF8574 und LCD (Ansteuerung ohne Libs)

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

Hinweis kann nach Kenntnisnahme deaktiviert werden!

  • Am Portexpander PCF8574 kann man auch ein LCD betreiben.
    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.

    BASCOM-Quellcode

    1. ' Variablen
    2. Const Pcf8574_w = &H40
    3. Const Pcf8574_r = &H41
    4. Dim Twilcd As Byte
    5. Dim Lcd_temp As Byte
    6. Dim Lcd_char As String * 1
    7. Dim i as Byte
    8. ' ...
    9. ' Subroutinen
    10. Twi_lcd_init:
    11. ' Wartezeit zur Selbstinitialisierung des LCD (Braucht man hier nicht)
    12. ' Waitms 15
    13. 'set 8-bit mode (attention)
    14. 'toggle the E -line
    15. I2csend Pcf8574_w , &B0011_0100
    16. I2csend Pcf8574_w , &B0011_0000
    17. Waitms 4
    18. 'set 8-bit mode (attention)
    19. I2csend Pcf8574_w , &B0011_0100
    20. I2csend Pcf8574_w , &B0011_0000
    21. Waitms 1
    22. 'set 8-bit mode (attention)
    23. I2csend Pcf8574_w , &B0011_0100
    24. I2csend Pcf8574_w , &B0011_0000
    25. Waitms 4
    26. 'set 4-bit operation
    27. I2csend Pcf8574_w , &B0010_0100
    28. I2csend Pcf8574_w , &B0010_0000
    29. Waitms 1
    30. 'set 8-bit mode (attention)
    31. I2csend Pcf8574_w , &B0010_0100
    32. I2csend Pcf8574_w , &B0010_0000
    33. I2csend Pcf8574_w , &B1000_0100
    34. I2csend Pcf8574_w , &B1000_0000
    35. Waitms 1
    36. I2csend Pcf8574_w , &B0000_0100
    37. I2csend Pcf8574_w , &B0000_0000
    38. 'display off, cursor off, blink off
    39. I2csend Pcf8574_w , &B1000_0100
    40. I2csend Pcf8574_w , &B1000_0000
    41. Waitms 1
    42. I2csend Pcf8574_w , &B0000_0100
    43. I2csend Pcf8574_w , &B0000_0000
    44. 'display on, cursor off, blinking off
    45. I2csend Pcf8574_w , &B1100_0100
    46. I2csend Pcf8574_w , &B1100_0000
    47. Waitms 1
    48. ' Loesche Display, Cursor an 1.Stelle
    49. Gosub Twi_lcd_cls
    50. ' Waitms 1
    51. ' OK ausgeben
    52. Lcd_char = "O"
    53. Gosub Twi_lcd_sendchar
    54. Lcd_char = "k"
    55. Gosub Twi_lcd_sendchar
    56. Return
    57. ' Hintergrundbeleuchtung einschalten:
    58. ' set lcd_temp.3 = 1
    59. ' Loeschen und Cursor an 1. Stelle (= Position 0) -> Befehl=&B0000_0001
    60. Twi_lcd_cls:
    61. I2cstart
    62. I2cwbyte Pcf8574_w
    63. ' Senden H-Nibble
    64. ' E=1 und RS=0
    65. Lcd_temp = &B0000_0100
    66. I2cwbyte Lcd_temp
    67. ' E auf 0 -> Einlesen der Werte durch LCD
    68. Reset Lcd_temp.2
    69. I2cwbyte Lcd_temp
    70. ' Waitms 2
    71. ' Senden L-Nibble
    72. ' E=1 und RS=0
    73. Lcd_temp = &B0001_0100
    74. I2cwbyte Lcd_temp
    75. ' E auf 0 -> Einlesen der Werte durch LCD
    76. Reset Lcd_temp.2
    77. I2cwbyte Lcd_temp
    78. Waitms 2
    79. I2cstop
    80. Return
    81. ' Cursor auf bestimmte Position setzen
    82. ' Variable "Befehl_wert" enthaelt die Position (0 bis 79 !)
    83. Twi_lcd_pos:
    84. '
    85. I2cstart
    86. I2cwbyte Pcf8574_w
    87. '
    88. ' Cursor auf Position 0, ohne loeschen -> Befehl=&B0000_0010
    89. ' Senden H-Nibble
    90. ' Befehl=00, E=1 und RS=0
    91. Lcd_temp = &B0000_0100
    92. I2cwbyte Lcd_temp
    93. ' E auf 0 -> Einlesen der Werte durch LCD
    94. Reset Lcd_temp.2
    95. I2cwbyte Lcd_temp
    96. ' Senden L-Nibble
    97. ' E=1 und RS=0
    98. Lcd_temp = &B0010_0100
    99. I2cwbyte Lcd_temp
    100. ' E auf 0 -> Einlesen der Werte durch LCD
    101. Reset Lcd_temp.2
    102. I2cwbyte Lcd_temp
    103. ' Warten ...
    104. Waitms 2
    105. '
    106. ' Cursor an gewuenschte Stelle verschieben -> Befehl=&B0001_0100
    107. If Befehl_wert > 0 And Befehl_wert < 80 Then
    108. For I = 1 To Befehl_wert
    109. ' Senden H-Nibble
    110. ' E=1 und RS=0
    111. Lcd_temp = &B0001_0100
    112. I2cwbyte Lcd_temp
    113. Reset Lcd_temp.2
    114. ' E auf 0 -> Einlesen der Werte durch LCD
    115. I2cwbyte Lcd_temp
    116. ' Senden L-Nibble
    117. ' E=1 und RS=0
    118. Lcd_temp = &B0100_0100
    119. I2cwbyte Lcd_temp
    120. ' E auf 0 -> Einlesen der Werte durch LCD
    121. Reset Lcd_temp.2
    122. I2cwbyte Lcd_temp
    123. Waitus 50
    124. Next I
    125. Else
    126. End If
    127. '
    128. I2cstop
    129. '
    130. Return
    131. ' Zeichen ausgeben
    132. ' Zeichen wird mit der Variablen "lcd_char" (String) übergeben
    133. Twi_lcd_sendchar:
    134. '
    135. I2cstart
    136. I2cwbyte Pcf8574_w
    137. '
    138. 'Bit 4-7 (H-Nibble) senden
    139. Lcd_temp = Asc(lcd_char) And &B1111_0000
    140. I2cwbyte Lcd_temp
    141. ' E=1 und RS=1
    142. Set Lcd_temp.2
    143. Set Lcd_temp.0
    144. I2cwbyte Lcd_temp
    145. ' E und RS auf 0 -> Einlesen der Werte durch LCD
    146. Reset Lcd_temp.2
    147. Reset Lcd_temp.0
    148. I2cwbyte Lcd_temp
    149. ' Bit 0-3 (L-Nibble) senden
    150. Lcd_temp = Asc(lcd_char) And &B0000_1111
    151. Shift Lcd_temp , Left , 4
    152. I2cwbyte Lcd_temp
    153. ' E und RS auf 1
    154. Set Lcd_temp.2
    155. Set Lcd_temp.0
    156. I2cwbyte Lcd_temp
    157. ' E und RS auf 0 -> Einlesen der Werte durch LCD
    158. Reset Lcd_temp.2
    159. Reset Lcd_temp.0
    160. I2cwbyte Lcd_temp
    161. '
    162. I2cstop
    163. '
    164. ' Braucht man oder braucht man nicht?
    165. Waitus 400
    166. '
    167. Return
    168. ' Testausgebe: 61 Zeichen hintereinander
    169. Twi_lcd_test:
    170. ' Gosub Twi_lcd_cls
    171. For I = 65 To 125
    172. Lcd_char = Chr(i)
    173. Gosub Twi_lcd_sendchar
    174. Next I
    175. Return
    Alles anzeigen

    RoBue

    8.523 mal gelesen

Kommentare 1

  • RUBI52 -

    Hallo, hab verschiedene LCD's mit angelöteten PCF8574 Platinen. Wie kann ich die Pins vom LCD an den PCF8574 anpassen?
    MfG
    Rudi