Controlling 16×2 LCD Module Using VB6


Dim BasePort As Integer

Dim ctrl As Integer
‘control port is active low.
‘For LCD following lines are used
‘control.0 = nStrobe     ‘Assigned to E
‘control.1 = nAutoLF     ‘Not assigned
‘control.2 = nInit       ‘Not assigned
‘control.3 = nSelPrinter ‘Assigned to RS

Dim Staus As Integer ‘unused for LCD
‘Stat.3 = nError
‘Stat.4 = Select
‘Stat.5 = PaperOut
‘Stat.6 = nAck
‘Stat.7 = Busy

Private Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)

Public Function Hex2Long(hexstr As String)

Dim i As Integer
Dim c As Long
Dim d As Integer

hexstr = UCase(hexstr)
c = 0
For i = 1 To Len(hexstr)

c = c * 16
d = Asc(Mid(hexstr, i, 1))
If d >= &H30 And d <= &H39 Then
d = d – &H30
Else
d = d – &H41 + 10
End If
c = c + d
Next

Hex2Long = c

End Function

Private Sub LCDInit()

ctrl = 1 ‘E should be zero (ctrl.0 = 1)
RS_Low
LCDStrobe &H30
Sleep 50
LCDStrobe &H30
Sleep 1
LCDStrobe &H30
Sleep 1

RS_Low
LCDStrobe &H38 ‘8 bit interface. for 4 bit interface, use &H28
Sleep 1
LCDStrobe &H8  ‘ Display off
Sleep 1
LCDStrobe &H1  ‘clear screen
Sleep 1
LCDStrobe &H6  ‘Increment, no shift
Sleep 1
LCDStrobe &HE  ‘display on, show cursor, no blink

RS_Low
If (ctrl Mod 2) = 0 Then
ctrl = ctrl + 1 ‘E=0, or ctrl.0 = 1
End If

End Sub

Private Sub LCDStrobe(ByVal dbyte As Integer)

Dim i As Integer

‘Initially, E should be zero that is ctrl.0 = 1
i = ctrl Mod 2
If i = 0 Then
ctrl = ctrl + 1
End If
‘RS at required value and E = 0
Hwinterface1.OutPort BasePort + 2, ctrl

‘force E to high (ctrl.0 to low)
ctrl = ctrl – 1
Hwinterface1.OutPort BasePort + 2, ctrl
microSleep 10 ‘at least 4 microsecs

Hwinterface1.OutPort BasePort, dbyte
microSleep 5
‘Toggle E down (ctrl.0 to high) to transfer data
ctrl = ctrl + 1
Hwinterface1.OutPort BasePort + 2, ctrl
microSleep 10

Hwinterface1.OutPort BasePort, 0 ‘clear the data

End Sub

Private Sub LCDWrite(ByVal dbyte As Integer, ByVal line As Integer, ByVal pos As Integer)
‘dbyte is ascii char to be shown
‘line is 1 or 2
‘pos is 1 to 16

Dim addr As Integer
Dim data As Integer

dbyte = dbyte Mod 128
pos = (pos – 1) Mod 16

If line = 1 Then
addr = &H80 + pos
ElseIf line = 2 Then
addr = &HC0 + pos
Else
addr = &H80 + pos
End If

‘command – DDRam address
RS_Low
LCDStrobe addr

‘data – Data to be displayed
RS_High
LCDStrobe dbyte

End Sub

Private Sub microSleep(n As Integer)
‘n > 0, n is in micro seconds, approximately

Dim i As Integer
Dim j As Integer
Dim c As Integer

If n <= 0 Then
n = 1
ElseIf n > 1000 Then
n = 1000
End If

For i = 1 To n
For j = 1 To 100
‘change this 100 to higher value if your system is very fast
‘100 was ok on a Celeron 1.8GHz CPU
‘You may need to change only if LCD does not function well.
c = c ‘dummy.
Next
Next

End Sub

Private Sub RS_High()

‘RS-x-x-E:  1-0-0-0
ctrl = ctrl Mod 8  ‘make bit four zero (inverted)

End Sub

Private Sub RS_Low()

‘control port is active low.
‘also, there is hardware inversion on this bit
‘So invert all bits

‘RS-x-x-E:  0-0-0-0
‘keep other bits unchanged
ctrl = ctrl Mod 8
‘make control.3 high
ctrl = ctrl + 8

End Sub

Private Sub Command1_Click()

Dim i As Integer
Dim c As Integer
Dim s As String

LCDInit
Sleep 10

s = “Welcome”
For i = 1 To Len(s)
c = Asc(Mid(s, i, 1))
LCDWrite c, 1, i
Next
Text1 = s

s = “”
c = &H41 ‘Ascii A
For i = 1 To 16
LCDWrite c, 2, i
s = s & Chr(c)
c = c + 1
Next
Text2.Text = s

End Sub

Private Sub Command2_Click()
s = Text1.Text
s = Left(s, 16)
If Len(s) < 16 Then
s = s & Space(16 – Len(s))
End If

For i = 1 To Len(s)
c = Asc(Mid(s, i, 1))
LCDWrite c, 1, i
Next

s = Text2.Text
s = Left(s, 16)
If Len(s) < 16 Then
s = s & Space(16 – Len(s))
End If
For i = 1 To Len(s)
c = Asc(Mid(s, i, 1))
LCDWrite c, 2, i
Next

End Sub

Private Sub Form_Load()
Dim s As String

BasePort = &H3BC ‘Normally, LPT1 is at 0x378
s = GetSetting(“C-Quad”, “LCD”, “BasePort”, “378”)
BasePort = Hex2Long(s)

End Sub

Private Sub Text1_Change()

Dim i As Integer

s = Left(Text1.Text, 16)
If Len(s) < 16 Then
s = s & Space(16 – Len(s))
End If

For i = 1 To Len(s)
LCDWrite Asc(Mid(s, i, 1)), 1, i
Sleep 10
Next

End Sub

Private Sub Text1_LostFocus()
If Len(Text1.Text) > 16 Then
Text1.Text = Left(Text1.Text, 16)
End If

End Sub

Private Sub Text2_Change()

Dim i As Integer

s = Left(Text2.Text, 16)
If Len(s) < 16 Then
s = s & Space(16 – Len(s))
End If

For i = 1 To Len(s)
LCDWrite Asc(Mid(s, i, 1)), 2, i
Sleep 10
Next

End Sub

Private Sub Text2_LostFocus()
If Len(Text2.Text) > 16 Then
Text2.Text = Left(Text2.Text, 16)
End If
End Sub

Private Sub Text3_LostFocus()

BasePort = Hex2Long(Text3.Text)
SaveSetting “C-Quad”, “LCD”, “BasePort”, Text3.Text

End Sub

One response to “Controlling 16×2 LCD Module Using VB6

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s