Hey all...
I have the wierdest problem. I've created a small program that displays my computers IP-address, netmask and gateway on my LCD screen (a winstar with a HD44780). Now, the program worked fine, the LCD initialized, the info was written, all procedures for clearing, cursor movement etc. worked.
Then I accidently tried to print out a document and suddenly my LCD "hang". Suddenly I was unable to initialize the LCD any more, nor clear it or write anything to it. I tried to reboot but it didnt help. Then I tried to remove the LCD from the parallel port and reboot and then attach the LCD again - still nothing. Now my program doesnt work anymore.
The wierd thing is that other programs like LCDInfo and LCDSmarte 5.1 still works fine with the LCD.
Evern wierder is the fact that this happened to me once before while I developed the program. I was using a freeware parallel port interface (an ocx) but suddenly my LCD couldnt display anything. I removed the parallel port interface and installed dlportio from DriverLinx instead. After changing the code to the new dll everything worked fine again. I thought it was that other freeware dll that was buggy and forgot about the problem - but now Im back.
Perhaps I'm initializing the LCD wrong so it only works after some other program has put some of the bits in the right place? (although it still doesnt work, even if I use another LCD program first)
My question is then: How do I initialize the LCD properly? I hate the fact that other LCD programs that use dlportio works fine, but mine doesnt.(especially when it used to work and nothing was changed in the code).
Currently I'm initializing the display with RS set low and 3 times 0x30 (decimal 48) sent to the LCD.
Any help would be extremely welcome.
Thanks,
Jesper
(p.s. of course the program and source will be publicly available once Im done
- With you credited... hehe )
------------------------Code begin--------------------
Public Const BASE = &H378 ' Parallel port address
Public Const CTRL = BASE + 2 ' Control address (always address of parallel port + 2
Public Const E = 1 ' Enable bit to be used as a toggle (on/off)
Public Const RS = 4 ' RS bit H/L Register select, H=data, L=instruction
Public Const InitSequence = 48 ' Init sequence to run 3 times
Public Const DL = 16 ' interface data length 0=4 bit interface 1=8 bit interface
Public Const N = 8 ' Number of display lines 0=1/8 1=1/16
Public Const F = 4 ' Character font 0=5x7 1=5x10
Public Const D = 4 ' Display bit 0=off 1=on
Public Const C = 2 ' Cursor on/off 0=off 1=on
Public Const B = 1 ' Cursor blink 0=blink off 1=blink on
Public Const SC = 8 ' 0 = move cursor 1=shit display
Public Const RL = 4 ' Shit direction 0=shift left 1=shift right
Public Const DisplayControl = 8 ' Display control bit (set when you want to control display)
Public Const DisplayShift = 16 ' Display shift bit (set when you want to control cursor move dir etc)
Public Const FunctionSet = 32 ' Function bit (set when you want to control display lines etc.)
Public Const clear = 1
Public Sub LCDInit() 'Initializes the LCD
SetRSLow 'Enter command mode
For I = 1 To 3
LCDDataWrite InitSequence 'Run init sequence 3 times
SetEnable 'Toggle E-bit
Next
'Set interface to 8 bit + display lines to 1/16 (two line display)
LCDDataWrite FunctionSet + DL + N
SetEnable 'Toggle E-bit
'Set Display on + cursor showing
LCDDataWrite DisplayControl + D + C
SetEnable 'Toggle E-bit
'clear display
LCDDataWrite clear
SetEnable 'Toggle E-bit
End Sub
Public Sub SetEnable() 'Toggles the E (enable) bit
LCDControlWrite E, True 'Toggles E bit on
Sleep (10) 'Delay processing
LCDControlWrite E, False 'Toggles E bit off again
Sleep (10) 'Delay processing
End Sub
Public Sub SetRSHigh() 'Toggles RS bit for data
LCDControlWrite RS, True 'Toggles RS bit high
End Sub
Public Sub SetRSLow() 'Toggles RS bit for instructions
LCDControlWrite RS, False 'Toggles RS bit low
End Sub
Public Sub LCDControlWrite(data As Byte, Operator As Boolean) 'Writes to control address
If Operator = True Then
DlPortWritePortUchar CTRL, DlPortReadPortUchar(CTRL) Or data 'Write chosen bit high (+ leaves other bits intact)
Else
DlPortWritePortUchar CTRL, DlPortReadPortUchar(CTRL) And (255 - data) 'Write chosen bit low (+ leaves other bits intact)
End If
End Sub
Public Sub LCDDataWrite(data As Byte) 'Writes to parallel port with data
DlPortWritePortUchar BASE, data 'Writes chosen byte to parallel port
End Sub
------------------Code end--------------------