Home    Impressum / Datenschutz    Shop    Download    Links     Blog  

I2C-LCD-Gateway Programmierbeispiel

LCD-Display über die serielle Schnittstelle (RS232) ansteuern

Option Explicit

Private Sub Command_OpenCom_Click()

If Command_OpenCom.Caption = "COM öffnen" Then
    'Serielle Schnittstelle öffnen
    If OPENCOM(Combo_Com.Text & ":" & "19200,n,8,1") = 0 Then
        MsgBox ("Fehler, kann " & Combo_Com.Text & " nicht öffnen")
    End If
    'Buttons einbelnden
    Command_OpenCom.Caption = "COM schließen"

    Command_TEXT_2x16.Visible = True
    Command_TEXT_4x16.Visible = True
    Command_TEXT_4x20.Visible = True
    Command_DISPLAY.Visible = True
    Command_RESET.Visible = True
    Command_LICHT.Visible = True
    Command_CR.Visible = True
    Command_CL.Visible = True
    Command_AR.Visible = True
    Command_AL.Visible = True
    Command_ZEICHEN_DEFINIEREN.Visible = True
    Command_ZEICHEN_AUSGEBEN.Visible = True
    Command_RAM_AUSLESEN.Visible = True
    TextBox_STATUS.Text = "COM geöffnet 19200,n,8,1"

Else
    'Serielle Schnittstelle schließen
    CLOSECOM
    'Buttons ausbelnden
    Command_OpenCom.Caption = "COM öffnen"

    Command_TEXT_2x16.Visible = False
    Command_TEXT_4x16.Visible = False
    Command_TEXT_4x20.Visible = False
    Command_DISPLAY.Visible = False
    Command_RESET.Visible = False
    Command_LICHT.Visible = False
    Command_CR.Visible = False
    Command_CL.Visible = False
    Command_AR.Visible = False
    Command_AL.Visible = False
    Command_ZEICHEN_DEFINIEREN.Visible = False
    Command_ZEICHEN_AUSGEBEN.Visible = False
    Command_RAM_AUSLESEN.Visible = False
    TextBox_STATUS.Text = "COM geschlossen"
End If

End Sub 

Private Sub Command_LICHT_Click()

SENDBYTE (170)                'FF
SENDBYTE (Combo_Adresse.Text) 'Bus-Adresse des Gateways schreiben
SENDBYTE (16)                 'Steuerbyte (Licht EIN/AUS)
SENDBYTE (0)                  'Datenbyte  (Dummy)

TextBox_STATUS.Text = M_Stat(READBYTE)  'Status vom Gateway Abfragen

End Sub 

Private Sub Command_RESET_Click()
'Display initialisieren
'Welche Befehle hier gesendet werden müssen entnehmen
'Sie bitte dem Datenblatt des Displayherstellers
Dim I2C_Adr
I2C_Adr = Combo_Adresse.Text

'Reset mit Pausen
Call LCD_Befehl_out(1, 48)  '1. Reset
DELAY (1)                   'Wartezeit nach Datenblatt
Call LCD_Befehl_out(1, 48)  '2. Reset
DELAY (1)                   'Wartezeit nach Datenblatt
Call LCD_Befehl_out(1, 48)  '3. Reset
DELAY (1)                   'Wartezeit nach Datenblatt
'Einstellungen
Call LCD_Befehl_out(1, 56)  '8 Bit Interface, 2 Lines
Call LCD_Befehl_out(1, 8)   'Display OFF
Call LCD_Befehl_out(1, 1)   'Display Clear
Call LCD_Befehl_out(1, 2)   'Cursor HOME
Call LCD_Befehl_out(1, 14)  'Display on, Cursor on, Cursor nicht blinken

End Sub 

Private Sub Command_DISPLAY_Click()
Dim Wert

Wert = 8                                                'Bit 3 = TRUE
If CheckBox_Display.Value = True Then Wert = Wert + 4   'Bit 2
If CheckBox_Cursor.Value = True Then Wert = Wert + 2    'Bit 1
If CheckBox_Blinken.Value = True Then Wert = Wert + 1   'Bit 0

' Wert zum Display schreiben
Call LCD_Befehl_out(1, Wert)

End Sub 

Private Sub Command_CR_Click() 'CURSOR nach Rechts verschieben
Call LCD_Befehl_out(1, 20)     'Cursor nach rechts verschieben
End Sub 

Private Sub Command_CL_Click() 'CURSOR nach Links verschieben
Call LCD_Befehl_out(1, 16)     'Cursor nach Links verschieben
End Sub 

Private Sub Command_AR_Click() 'Anzeige nach Rechts verschieben
Call LCD_Befehl_out(1, 28)     'Cursor nach rechts verschieben
End Sub 

Private Sub Command_AL_Click() 'Anzeige nach Links verschieben
Call LCD_Befehl_out(1, 24)     'Cursor nach Links verschieben
End Sub 

Private Sub Command_TEXT_2x16_Click()

Call LCD_Befehl_out(1, 128) 'DD-Ram Adresse Zeile 1 80h
Call LCD_Text_out(1, Zeile1.Text, 16)
Call LCD_Befehl_out(1, 192) 'DD-Ram Adresse Zeile 2 C0h
Call LCD_Text_out(1, Zeile2.Text, 16)

End Sub 

Private Sub Command_TEXT_4x16_Click()

Call LCD_Befehl_out(1, 128) 'DD-Ram Adresse Zeile 1 80h
Call LCD_Text_out(1, Zeile1.Text, 16)
Call LCD_Befehl_out(1, 192) 'DD-Ram Adresse Zeile 2 C0h
Call LCD_Text_out(1, Zeile2.Text, 16)
Call LCD_Befehl_out(1, 144) 'DD-Ram Adresse Zeile 1 90h
Call LCD_Text_out(1, Zeile3.Text, 16)
Call LCD_Befehl_out(1, 208) 'DD-Ram Adresse Zeile 2 D0h
Call LCD_Text_out(1, Zeile4.Text, 16)
End Sub 

Private Sub Command_TEXT_4x20_Click()

Call LCD_Befehl_out(1, 128) 'DD-Ram Adresse Zeile 1 80h
Call LCD_Text_out(1, Zeile1.Text, 20)
Call LCD_Befehl_out(1, 192) 'DD-Ram Adresse Zeile 2 C0h
Call LCD_Text_out(1, Zeile2.Text, 20)
Call LCD_Befehl_out(1, 148) 'DD-Ram Adresse Zeile 1 94h
Call LCD_Text_out(1, Zeile3.Text, 20)
Call LCD_Befehl_out(1, 212) 'DD-Ram Adresse Zeile 2 D4h
Call LCD_Text_out(1, Zeile4.Text, 20)

End Sub 

Function M_Stat(Status_Byte) 'Status vom Gateway abfragen
Dim A

Select Case Status_Byte
Case -1
    M_Stat = "keine Verbindung"
Case 96
    M_Stat = "OK"
Case Else
    M_Stat = "FEHLER " & Status_Byte
End Select

End Function 

Private Function LCD_Befehl_out(E1_2, Befehl)
Dim stat, RB

SENDBYTE (170)                'FF
SENDBYTE (Combo_Adresse.Text) 'Bus-Adresse des Gateways schreiben
SENDBYTE (E1_2)               'Steuerbyte (zum LCD am E1 oder E2)
SENDBYTE (Befehl)             'Datenbyte  (Befehl absetzen)

Do                            'Status vom Gateway Abfragen
    RB = READBYTE             'Alle Bytes lesen
    If RB = -1 Then Exit Do   'und das letzte ...
    stat = RB
Loop

LCD_Befehl_out = stat         'an die Funktion übergeben

End Function 

Private Function LCD_Text_out(E1_2, Text$, Zeichen)
Dim stat, SteuBy, T$, z$, S, AnzS, i, anzB, RB

If E1_2 = 2 Then
    SteuBy = 6      'Steuerbyte (RW=0 RS=1 E2=1 E1=0)
Else
    SteuBy = 5      'Steuerbyte (RW=0 RS=1 E2=0 E1=1)
End If

'Wenn Zeichenanzahl angegeben String anpassen
If Zeichen > 0 Then
   T$ = Left$(Text$ & Space(Zeichen), Zeichen)
Else
   T$ = Text$
End If

SENDBYTE (170)                  'FF
SENDBYTE (Combo_Adresse.Text)   'Bus-Adresse des Gateways schreiben

For i = 1 To Len(T$)
  z$ = Mid$(T$, i, 1)           'Zeichen extrahieren
  SENDBYTE (SteuBy)             'Steuerbyte (Control-Byte)
  SENDBYTE (Asc(z$))            'Datenbyte (Zeichencode)
Next

Do                              'Status vom Gateway Abfragen
    RB = READBYTE               'Alle Bytes lesen
    If RB = -1 Then Exit Do     'und das letzte ...
    stat = RB
Loop

stat = READBYTE                 'Status vom Gateway Abfragen
LCD_Text_out = stat             'an die Funktion übergeben

End Function 

Private Sub Command_ZEICHEN_DEFINIEREN_Click()
'Eigene Zeichen für das LCD-Display im CGRAM ablegen
Dim stat, SteuBy, i, ii, Wert

stat = LCD_Befehl_out(1, 64)      'CG-Ram Adresse Zeile 1 40h
If stat <> 96 Then Exit Sub

SteuBy = 5                        'Steuerbyte (RW=0 RS=1 E2=0 E1=1)

SENDBYTE (170)                    'FF
SENDBYTE (Combo_Adresse.Text)     'Bus-Adresse des Gateways schreiben

For i = 0 To 7                    '8 Zeichen übertragen
  For ii = 0 To 7                 '8 Werte / Zeichen
     Wert = Cells(i + 13, ii + 3) 'Werte liegen in der Tabelle ab z13s3
     SENDBYTE (SteuBy)            'Steuerbyte senden
     SENDBYTE (Wert)              'Datenbyte (Zeichen)
  Next ii
Next i

End Sub 

Private Sub Command_ZEICHEN_AUSGEBEN_Click()
'Ersten acht Zeichen des LCDs in der ersten Zeile ausgeben
'Diese Zeichen können ggf. selbst definiert werden
Dim stat, z$, i, SteuBy

SteuBy = 5                      'Steuerbyte (RW=0 RS=1 E2=0 E1=1)
stat = LCD_Befehl_out(1, 128)   'DD-Ram Adresse Zeile 1 80h
If stat <> 96 Then Exit Sub

SENDBYTE (170)                  'FF
SENDBYTE (Combo_Adresse.Text)   'Bus-Adresse des Gateways schreiben

For i = 0 To 7
    SENDBYTE (SteuBy)           'Steuerbyte (Control-Byte)
    SENDBYTE (i)                'Datenbyte (Zeichen)
Next i

End Sub 

Private Sub Command_RAM_auslesen_Click()
'8 Bytes aus dem RAM-Inhalt des LCDs auslesen
' und in die Tabelle eintragen
Dim i, SteuBy, Wert, Adr, stat

'Ram Adresse aus Textbox in Dezimal wandeln
Adr = CLng("&H" & TextBox_RAM_ADR.Text)

'Register einstellen
stat = LCD_Befehl_out(1, Adr)
If stat <> 96 Then Exit Sub
    
'8 Bytes vom LCD lesen
SteuBy = 13                    'Steuerbyte (RW=1 RS=1 E2=0 E1=1)

SENDBYTE (170)                 'FF
SENDBYTE (Combo_Adresse.Text)  'Bus-Adresse des Gateways

For i = 0 To 7
    SENDBYTE (SteuBy)          'Steuerbyte (Control-Byte)
    SENDBYTE (0)               'Dummy-Bites schreiben
Next i

'Werte vom Eingangsbuffer lesen und in die Tabelle eintragen
For i = 0 To 7
    Wert = READBYTE
    Cells(30, i + 3) = Wert
    If Wert > 0 Then
        Cells(31, i + 3) = Chr$(Wert)
    End If
Next i
    
End Sub 

 

Beispiele als Excel Makro
RS232-LCD-Gateway_14.xls und port.dll (104 kB)
Excel-Makro mit je einem Beispiel zur Ansteuerung des LCD-Gateways über die RS232-Schnittstelle. Beschrieben wird die Initialisierung, Display Clear, Text schreiben und RAM vom LCD-Display auslesen
vba-makros.pdf (528 kB)
Bei den Makros kann es je nach Sicherheitseinstellungen zu Fehlermeldungen kommen. Eine Anleitung wie Sie die Makros ausführen können finden Sie in diesem Dokument

 

Bausätze können Sie günstig in unserem Onlineshop in der Rubrik
"I2C-Komponenten" bestellen.