LCD-Ansteuerung mit Visual Basic (Version 3.3)

Soo, wieder ein wenig Zeit fürs programmieren - und was kommt dabei raus?
Eine neue Version der LCD-Ansteuerung.

Neue Features:
- Vereinfachte und übersichtlichere Ansteuerung
- Alle Funktionen mit dem Präfix "LCD." (kann sehr einfach geändert werden)
- Displays mit 2 Controllern werden unterstützt
- Ansteuerung im 8- sowie 4-Bit-Modus
- Schnellere Datenübertragung an das Display (und damit CPU-Entlastung)
- Optionen (Port, Displaygröße,...) werden im Modul temporär gespeichert
- Steuerung der Hintergrundbeleuchtung (momentan nur mit der B/L-Steuerung)
- Codeoptimierung

Das Modul wird nun über [Modulname].[Variable/Befehl] gesteuert.
Somit ist eine mehrfache Verwendung des Module möglich (wenn auch nur, indem das Modul mehrmals geladen wird)
Der Download ist, um die Spannung zu erhalten unten auf der Seite ;)
Achtung: Wenn das Modul nur einmal verwendet wird, können die Befehle auch ohne das Präfix benutzt werden.
Falls verschiedene Module mit gleichnamigen Funktionen vorhanden sind, muss das Präfix verwendet werden.

Funktionen & Variablen:

Variablen:
Port

Zum setzen und lesen den Port, an dem das Display angeschlossen wird.
Beispiel: Port = 888 'für LPT1

Size
Setzen/lesen der Displaygröße.
Bsp.: Size = s2x16 für ein Display mit 2 Zeilen mit je 16 Zeichen
Mögliche Werte: s2x08, s2x16, s2x20, s2x24, s2x40, s1x16, s4x16, s4x20, s4x27 und s4x40

Mode
Setzen/lesen des Displaymodi, also 8- oder 4-Bit-Ansteuerung.
Bsp.: Mode = m8Bit 'für 8-Bit-Modus oder Mode = m4Bit für 4-Bit-Modus.
Info: mDefault dient nur für für die Modulinterne Verarbeitung und sollte nicht gesetzt werden.
Mögliche Werte: m4Bit, m8Bit

Backlight
Setzen/lesen der Helligkeit der Hintergrundbeleuchtung (entspr. Hardware erforderlich).
Wenn auch nach dem setzen von Backlight die Variable unverändert bleibt, konnte die Helligkeit wegen der Displaygröße nicht gesetzt werden.
Bsp.: Backlight = 128 'setzt die Helligkeit auf 50%
Der Wert muss ganzzahlig zwischen 0 und 255 sein.

HighSpeed (neu!)
Wenn Highspeed = True ist, ließt das Modul bei der Ausgabe das BusyFlag des Displays aus. Dadurch kann die Übertragung sehr stark beschleunigt werden.

Funktionen:
WaitforLCD
Wartet etwa 0.8-1ms, damit das Display Zeit hat, die eintreffenden Daten zu bearbeiten.
Info: Bei eigenen Prozeduren in der Regel nicht notwendig, dient zur Modulinternen Verarbeitung
Neu: Wenn Highspeed = True ist, liest das Modul das Busyflag des Displays aus und wartet aktiv auf das Display

ConvertBintoDez(Bin as String)
Wandelt einen binären String in einen dezimalen Long um.
Bsp: 129 = ConvertBintoDez("01000001")

ConvertDeztoBin(Dez as Long)
Wandelt einen dezimalen Long in einen binären String um.
Bsp: "01000001" = ConvertDeztoBin(129)

TestingOutLcd(LcdDB7 As Boolean, LcdDB6 As Boolean, LcdDB5 As Boolean, LcdDB4 As Boolean, LcdDB3 As Boolean, _
                        LcdDB2 As Boolean, LcdDB1 As Boolean, LcdDB0 As Boolean, LcdRW As Boolean, LcdRS As Boolean)
Für die, die ein wenig mit dem Display "spielen" möchten.

OutLcd(LcdData As Byte, LcdRW As Boolean, LcdRS As Boolean, Controller As DspContr = cUp, Mode As DspMode = mDefault)
Die wohl wichtigste Funktion des ganzen Moduls: Hier werden die Daten an das LCD ausgegeben.
LcdData: Daten, die an das Display ausgegeben werden
LcdRW: Gibt an, ob vom Display gelesen oder in das Display geschrieben wird (Write = False)
Controller: Gibt an, welcher Controller angesprochen werden soll (cUp, cDown, cBoth; cUp ist Standard)
Mode: Gibt an, ob das Display im 8- oder 4-Bit-Modus angesprochen werden soll (m8Bit, m4Bit, mDefault; mDefault ist Standard. wenn mDefault angegeben wird, wird der Modus von der Variable "Mode" ausgelesen

Parsetext(Text as String) as String
Um gewisse Sonderzeichen korrekt darstellen zu können wird diese Funktion benötigt.
Da der Zeichensatz des HD44780 von ASCII-Zeichensatz abweicht, sind Zeichen wie ä,ö,ü,°,~,ß und µ nur mit verändern der ASCII-Codes möglich.
Einige Zeichen, wie Ä,Ö,Ü,\ und ´ sind nicht im Speicher des Controllers und können deshalb nicht bzw. nicht richtig angezeigt werden.
Bsp.: Writetext Parsetext("blökende Schäfer") *fg*

GetDDRamAddress(LcdRow As Long, LcdColumn as Long) As Long
Feststellen der DD-RAM-Adresse anhand der Reihe und Spalte, in die der Cursor gesetzt werden soll.
Die Displaygröße wird von der Variable Size verwendet.
Bsp.: 68 = GetDDRamAddress(2, 5)

SetPos(LcdRow As Long, LcdColumn as Long)
Setzen der Cursorposition auf dem Display.
Hier wird die Cursoradresse mit GetDDRamAddress festgestellt und danach auf das Display übertragen
Bsp.: SetPos 2, 5 'setzt den Cursor in die zweite Zeile und fünfte Spalte

Functionset(Interface8Bit As Boolean, Multiline As Boolean, Controller As DspContr = cUp)
Das ist die wohl wichtigste Funktion zum Initialisieren des Displays
Interface8Bit gibt an, ob das Display im 8- oder 4-Bit-Modus initialisiert werden soll (True = 8-Bit-Modus)
Multiline: Wenn True gesetzt wird, wird das Display im Multiline-Modus betrieben, andernfalls im Singleline-Modus
Controller: Bestimmt, welcher Controller angesprochen werden soll (cUp, cDown, cBoth; cUp ist Standard)
Bsp.: Functionset True, True, cBoth 'LCD im 8-Bit-Modus, Multiline, beide Controller werden angesprochen

Displayset(DisplayOn As Boolean, ShowCursor As Boolean, CursorBlink As Boolean, Controller As DspContr = cUp)
Bestimmt weitere Optionen des Displays
DisplayOn: Gibt an, ob das Display ein- oder ausgeschaltet werden soll (wenn das Display aus ist, kann es trotzdem Daten aufnehmen)
ShowCursor: Wenn ShowCursor True ist, wird der Cursor als "_" angezeigt.
CursorBlink: Bei True blinkt die Position des Cursor als schwarz ausgefüllter Block (kann gemeinsam mit ShowCursor verwendet werden)
Controller: Bestimmt, welcher Controller angesprochen werden soll (cUp, cDown, cBoth; cUp ist Standard)
Bsp.: Displayset True, False, True, cBoth 'Display an, Cursor als blinkender Block, beide Controller

Init(ShowCursor As Boolean, CursorBlink As Boolean, Controller As DspContr = cUp, Mode As DspMode = mDefault)
Fasst Functionset und Displayset in eine Funktion zusammen und wendet diese so an, dass das Display auf jeden Fall richtig initialisiert wird
ShowCursor: Wenn ShowCursor True ist, wird der Cursor als "_" angezeigt.
CursorBlink: Bei True blinkt die Position des Cursor als schwarz ausgefüllter Block (kann gemeinsam mit ShowCursor verwendet werden)
Controller: Bestimmt, welcher Controller angesprochen werden soll (cUp, cDown, cBoth; cUp ist Standard)
Mode: Gibt an, ob das Display im 8- oder 4-Bit-Modus angesprochen werden soll (m8Bit, m4Bit, mDefault; mDefault ist Standard. wenn mDefault angegeben wird, wird der Modus von der Variable "Mode" ausgelesen
Bsp.: Init True, False, , m4Bit 'Cursor als "_" jedoch nicht blinkend, oberer Controller, 4-Bit-Modus

ClearDisplay(Controller As DspContr = cUp)
Löscht den Inhalt des gesamten DD-Rams, also den Displayinhalt
Controller: Bestimmt, welcher Controller angesprochen werden soll (cUp, cDown, cBoth; cUp ist Standard)
Bsp.: ClearDisplay cDown 'untere Displayhälfte wird gelöscht

SetCursorHome(Controller As DspContr = cUp)
Setzt den Cursor auf die erste Reihe und erste Spalte
Controller: Bestimmt, welcher Controller angesprochen werden soll (cUp, cDown, cBoth; cUp ist Standard)
Bsp.: SetCursorHome cBoth 'Cursor wird auf beiden Displayhälften auf 1, 1 gesetzt

WriteText(LcdText As String)
Sendet den angegebenen Text an das Display
LcdText: Text, der an das Display gesendet wird
Info: der Einsatz von Parsetext ist empfehlenswert
Bsp.: WriteText "Hallo Welt" 'Das berühmte "Hallo Welt"-Beispiel wird bei der aktuellen Cursor-Position geschrieben

WriteChar(LcdChar As Byte)
Sendet ein einzelnes Zeichen an das Display
LcdChar: ASCII-Code des Zeichens, das gesendet werden soll
Info: Nützlich für den Umgang mit Selbstdefinierten Zeichen
Bsp.: WriteChar 0 'Das erste, selbst definierte Zeichen wird bei der aktuellen Cursor-Position geschrieben

DefineChar(SymbolNumber As Long, LcdSymbol As DspOwnSymbol, Controller As DspContr = cUp)
(Achtung: Die Zeilen der Character werden jetzt im dezimalen Format erwartet - nicht mehr im binären!)
Schreibt das in LcdSymbol angegebene Symbol als SymbolNumber-ntes Symbol in den CG-RAM
SymbolNumber: Nummer des Symbols ganzzahlig von 0 bis 7
LcdSymbol: Symbol, das in eine, als DspOwnSymbol definierte Variable gesetzt wurde
Controller: Bestimmt, welcher Controller angesprochen werden soll (cUp, cDown, cBoth; cUp ist Standard)
Bsp.: DefineChar 0, mySymbol, cBoth 'Schreibt das in "mySymbol" angegebene Symbol in den CG-RAM beider Displayhälften als erstes, selbst definiertes Symbol

DefineCharbyPic(SymbolNumber As Long, SymbolPic As PictureBox, Controller As DspContr = cUp)
Definiert ein eigenes Symbol anhand einem monochromen Bild in einer Picturebox (Bildgröße: 5x8 px)
SymbolNumber: Nummer des Symbols ganzzahlig von 0 bis 7
SymbolPoc: PictureBox, die das zu definierende Zeichen enthält
Controller: Bestimmt, welcher Controller angesprochen werden soll (cUp, cDown, cBoth; cUp ist Standard)
Bsp.: DefineCharbyPic 7, myPictureBox, cUp 'schreibt das in "myPictureBox" enthaltene Bild als als letztes, selbst definiertes Symbol in die obere Displayhälfte

MoveCursor(Direction As DspDir, AlsoDisplay As Boolean, Controller As DspContr = cUp)
Verschiebt den Cursor und (wenn angegeben) den Displayinhalt nach rechts bzw. links
Direction: entweder dRight für rechts oder dLeft für links
AlsoDisplay: Gibt an, ob der Displayinhalt verschoben werden soll
Controller: Bestimmt, welcher Controller angesprochen werden soll (cUp, cDown, cBoth; cUp ist Standard)
Bsp.: MoveCursor dLeft, True, cUp 'verschiebt den Displayinhalt der oberen Displayhälfte um eine Position nach links

Entrymodeset(PointerIncrement As Boolean, MoveDisplay As Boolean, Controller As DspContr = cUp)
Stellt ein, in welche Richtung der Cursor bei Dateneingang verschoben werden soll und ob der Displayinhalt verschoben werden soll
PointerIncrement: Wenn die Variable True ist, wird der Cursor nach rechts verschoben, bei False nach links
MoveDisplay: Gibt an, ob das Display auch verschoben werden soll
Controller: Bestimmt, welcher Controller angesprochen werden soll (cUp, cDown, cBoth; cUp ist Standard)
Bsp.: Entrymodeset True, False, cBoth 'der Cursor wird nach Dateneingang auf beiden Displayhälften nach rechts verschoben, der Displayinhalt wird nicht verschoben

TestLcdSpeed() As Currency
Misst die Zeit, die der Computer benötigt, um einen gesamten Displayinhalt (Rauschen) zu übertragen.
Der Rückgabewert entspricht der Zeit in ms (Bei meinem PC [P4, 3.0GHz, Windows XP, ParPort auf SPP] dauert die Übertragung ungefähr 30ms bei 8-Bit-Ausgabe, wenn Highspeed deaktiviert ist und 5ms (!!), wenn Highspeed aktiviert ist).

CheckConnected() As Boolean
Überprüft, ob vom Display gelesen werden kann oder nicht.
Vor allem Interessant in Verbindung mit der Variable Highspeed

HBar_Init()
Initialisiert den Zeichensatz für den horizontalen Bargraph

HBar(BarValue As Long, BarMin As Long, BarMax As Long, BarLen As Long, LcdRow As Long, LcdColumn As Long)
Stellt einen Bargraph mit der Länge BarLen an der Position LcdRow/LcdColumn dar.
BarValue stellt den aktuellen Wert des Bargraphs dar, der zwischen BarMin und BarMax definiert wird.
Bsp: HBar 23, 0, 50, 10, 1, 2 'Zeigt in der ersten Zeile ab dem zweiten Zeichen einen 10 Zeichen langen Bargraph mit dem Wert 23 an.

Downloads:
Modul: LCD (Code-Highlighting, LCD.bas befindet sich im Beispiel)
Programmbeispiel: LCD-Beispiel (VB6)

Nun wünsche ich viel Spaß beim Programmieren und Experimentieren!