-
2 Attachment(s)
serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
Hello everyone,
I'de like to share this project, may come handy for hobbyist working around LCD display.
My search for a serial LCD that can receive serial data from 300 to 19200 baud on the internet was not successful
then I roll-up my sleeves and build this LCD backpack that use a common Hitachi HD44780 display. (still popular today)
My project was simple with parts already on hand like PIC16F690, NPN smd transistor, potentiometer, resistor. and PBP3 Basic code.
So enjoy,
Code:
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Name : 16F690 LCD BACKPACK
' Date : Sep 27-2025
' Note : 393 words used of 2048
' Notes : Serin2 Baud Rate 300 ~ 19200 Intrc_OSC 8Mhz
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
#CONFIG
cfg = _INTRC_OSC_NOCLKOUT
cfg&= _WDT_OFF
cfg&= _PWRTE_OFF
cfg&= _MCLRE_OFF
cfg&= _CP_OFF
cfg&= _CPD_OFF
cfg&= _BOD_OFF
cfg&= _IESO_OFF
cfg&= _FCMEN_OFF
__CONFIG cfg
#ENDCONFIG
DEFINE OSC 8 ' Core is running at EXT-CRYSTAL 16MHz PBP 33,217
ANSEL = 0 ' Set all pins digital
ANSELH = 0 ' Set all pins digital
OPTION_REG.7 = 0 ' PORTA/PORTB pull-ups are enabled by individual port latch values
CM1CON0 = 0 ' Analog comparators off
En var Portb.4 : low en
RS var Portb.6 : low rs
B1 var byte : b1 = 0
' 300=3313 600=1646 1200=813 2400=396 4800=188 9600=84 19200=32
BaudR var byte : baudr = 32
TRISA = 0 : TRISB = 100000 : TRISC = 0
PORTA = 0 : PORTB = 0 : PORTC = 0
OSCCON = $70
high Porta.0 ' Backlight ON
gosub LCDinit ' initialise LCD
'Serin2
main:
serin2 Portb.5,baudr,3,main,[b1]
if b1 < 253 then ' Characters
PORTC = b1
HIGH EN : PAUSEus 5 : LOW EN
goto main
elseif b1 = 254 then ' LCD Command
low RS
serin2 Portb.5,baudr,3,main,[b1]
PORTC = b1 ' output the data
HIGH EN : PAUSEus 5 : LOW EN
high RS ' character mode
goto main
elseif b1 = 255 then
low rs ' LCD Command
serin2 Portb.5,baudr,3,main,[b1]
if b1 = 0 then
low porta.0 ' Back Light OFF
high rs
endif
if b1 = 8 then
high porta.0 ' Back Light ON
high rs
endif
goto main ' loop back to top
ENDIF
LCDINIT: ' Standard LCD Module Initialisation
PORTC = 000001 ' 2, Clear Display
HIGH EN : PAUSEus 300 : LOW EN ' Send data
pause 4
PORTC = 000010 ' 4, Return Home
HIGH EN : PAUSEus 300 : LOW EN
pause 4
PORTC = 111000 ' 1, 8 bit, 2 line, 5x8 Characters
HIGH EN : PAUSEus 300 : LOW EN
pause 4
' PORTC = 001100 ' Display on, no cursor, no blink
PORTC = 001110 ' 1, Display on, cursor, blink
HIGH EN : PAUSEus 300 : LOW EN
pause 4
PORTC = 000110 ' 1, Entry mode
HIGH EN : PAUSEus 300 : LOW EN
pause 4
high rs ' character mode
RETURN
Attachment 9989
Attachment 9990
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
Here's an code update
on the LCD backpack code the line
BaudR var byte should be replace with: BaudR var Word
and here's the serial sender code updated as well. (use an 12F683)
Code:
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Project : 12F683 Serial LCD Test 300 ~ 19200 baud for 16F690 Lcd Backpack
'Date : Sep 27-2025
'Notes : 285 words used of 2048
'Notes : Serout2 300 ~ 19200 Intrc_OSC 8Mhz
'300=3313 600=1646 1200=813 2400=396 4800=188 9600=84 19200=32
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
#CONFIG
__config _INTOSCIO & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _BOD_OFF & _CP_OFF & _CPD_OFF
#ENDCONFIG
DEFINE OSC 8 ' Core is running at EXT-CRYSTAL 16MHz PBP 33,217
LCD Var GPIO.0 ' Serial out
ANSEL = 0 ' Set all digital PULLUP Resistor page:10
TRISIO = %00000000 ' INPUT=1 OUTPUT = 0
OSCCON = $70 ' $70=8Mhz $60=4mhz $50=2MHZ $40=1MHZ $30=500KHZ
BaudR var word
baudR = 32 ' 300=3313 600=1646 1200=813 2400=396 4800=188 9600=84 19200=32
Pace var byte ' for serout2
pace = 0
SEROUT2 lcd,baudR,pace,[ 254, 1] ' Clear LCD
pause 40
DO
' LCD 1602
sEROUT2 lcd,baudR,pace,[254,128,"ABCDEFGHIJKLMNOP"] ' Line 1 16 Char.
SEROUT2 lcd,baudR,pace,[254,192,"0123456789-=,./>"] ' Line 2 16 Char.
' LCD 2004
'SEROUT2 lcd,BaudR,pace,[254,128,"ABCDEFGHIJkLMNOPQRST"] ' Line 1 20 Char.
'SEROUT2 lcd,BaudR,pace,[254,192,"0123456789-=,./;!@#$"] ' Line 2 20 Char.
'SEROUT2 lcd,BaudR,pace,[254,148,"ABCDEFGHIJkLMNOPQRST"] ' Line 3 20 Char.
'SEROUT2 lcd,BaudR,pace,[254,212,"0123456789-=,./;!@#$"] ' Line 4 20 Char.
PAUSE 2000
SEROUT2 lcd,baudR,pace,[ 255, 0] ' Back Light OFF
PAUSE 200
SEROUT2 lcd,baudR,pace,[ 255, 8] ' Back Light ON
PAUSE 2000
SEROUT2 lcd,baudR,pace,[ 254, 1] ' Clear LCD
pause 1000
LOOP
END
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
final code update in "16F690 LCD BACKPACK"
the low rs and high rs lines are not needed, since it control PortA.0 and not the HD44780 chip.
Quote:
elseif b1 = 255 then
' low rs ' LCD Command
serin2 Portb.5,baudr,3,main,[b1]
if b1 = 0 then
low porta.0 ' Back Light OFF
' high rs
endif
if b1 = 8 then
high porta.0 ' Back Light ON
' high rs
endif
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
Thanks for posting your project.
But why not use the Hardware USART instead of the Software one?
Ioannis
-
1 Attachment(s)
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
Hello Ioannis,
good question,
when I design the PCB I used the PortB.5 with a 20Mhz crystal with bigger pcb foot print 46x17mm
then I decided to lower the parts count and the PCB foot print to a bare minimum (41 x 17mm)
Also theses HD44780 are still in use by many hobbyist around the world, I guess, and the baud rate I was looking is plenty for this kind of display.
thank's for asking.
Attachment 9991
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
Hello,
you're right
my assumption was that software or hardware control serial communication are the same
and one way or another I'll get the same result.
if I may ask in this project what the benefit of hardware over software serial control.
thank's again.
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
Less code usage. If for some reason you need Serin, it may hang if the device is not replying correctly. Hserin has timout and will save the day.
For your project it may not have any meaning, but I think it is good practice to use as much as you can the hardware features than the emulated software.
Ioannis
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
Quote:
if I may ask in this project what the benefit of hardware over software serial control.
doubtful there is any since the 690 does nothing else anyway and the lcd's speed is the real bottle neck
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
I aggree on both comment, Hserin is more convenient than Serin2
the goal of this project was to learn base on inexpensive parts on-hand
you can strech the total cost for less than $12 pcb included not bad for an hobbyist who's looking to add a simple but pratical alphanumeric display
I really appreciate comments
btw , what is happening with MELab Forum, is it close for good.
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
The Melabs Forum is(was?) supported by the company itself. So little is known as to what is happening.
The company does not really have a future.
Some of us here are also dinosaures and reluctant to switch to C or other platforms. So we stay and try to support its operation, as long as our host, honorable Lester, allows this forum to live.
Ioannis
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
very kind of you to reply,
Roughly 12 years ago, I started learning Basic Pic programming with Picaxe, then GCBasic
now I'm mostly using MELab PBP Pro, and Positron both are like twin of Pic Basic compiler.
my guess is these IDE Compilers are the last ones on the market, now the current trend is
with Arduino, Python etc..
if I may ask,
are you aware of any good sources on how,
to learn asm, and understand the asm files structure, to write assembler code, compile it and to download to a PIC
regards.
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
What is the use of learning ASM when C is better with great support and portable too?
I think it is a waste of time if you choose ASM. Also you have to deal with pages, Banks and will be very much difficult to keep your mind checking all the time if your code has to change banks, pages etc in order to access registers correctly.
But if you insist on diving in the deep dark waters of ASM, then I guess Microchip is the first to think. But these video tutorials also help https://www.youtube.com/@IESD2013
Ioannis
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
thanks for the advice, it's helping what to consider.
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
as for C is considered, which IDE/Compiler you use or recommend
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
quick update for the Backpack code: High RS line should be remove to avoid random character on screen when booting.
PORTC = %00000110 : High En : DelayUS 1 : Low En : DelayMS 1 ' Entry mode
' High RS
Return
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
correct order for display control
PORTC = %00001110 ' %00001DCB Display on/off, cursor on/off, blink y/n
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
Regarding C, MPLABX is the one to try and sure the last. It includes also the MCC tool to setup any microcontroller with ease.
Tried a couple of times C but i guess i am too old to change ...
Ioannis
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
I did try MPLAB X a year ago and it's was a bitter chalenge comparing to what I'm used to do with PBP3,Picaxe, Positron
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
Oct 2 2025
update on 16F690 Backpack, new LCDINT pause to accomodate 28800,38400 baud rate for (Xtal = 20Mhz)
#CONFIG
__config _HS_OSC & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _IESO_OFF & _FCMEN_OFF
#ENDCONFIG
LCDINIT: ' Standard LCD Module Initialisation
PORTC = %00000001 : HIGH EN : PAUSEus 1 : LOW EN : pause 4 ' Clear Display
PORTC = %00000010 : HIGH EN : PAUSEus 1 : LOW EN : pause 2 ' Return Home
PORTC = %00111000 : HIGH EN : PAUSEus 1 : LOW EN : Pause 2 ' 8 bit, 2 line, 5x8 Characters
PORTC = %00000110 : HIGH EN : PAUSEus 1 : LOW EN : Pause 2 ' Entry mode
PORTC = %00001110 : HIGH EN : PAUSEus 1 : LOW EN : Pause 2 ' %00001DCB Display on/off, Cursor on/off, Blink y/n
RETURN
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
Agree that MPLABX is a bit scarry but has all the tools to complete a task regarding C at least.
You have MCC, Simulator, breakpoints etc. Basic does not give all these goodies.
As for your LCD driver, I think it is a little bit dependant on the specific LCD characteristics. Some are slow and some are a bit faster, so user has take that into account.
Ioannis
-
1 Attachment(s)
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
totally agree, the LCD is kind of an old tech, but for an hobbyist it's a good learning tool.
to clarify the baud rate turn around, just include this chart to figure it out.
with each OSC setup, it can manage baud rate from 300 ~ 38400.
Attachment 9992
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
I meant the LCD timing specs that have differencies. So the end user may have to take into account that.
Things to adjust include these DEFINEs (from the manual):
' Set command delay time in us
DEFINE LCD_COMMANDUS 1500
' Set data delay time in us
DEFINE LCD_DATAUS 44
44 maybe on the edge. 50 maybe more safe.
Ioannis
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
I know you have already done your PCBs, but an idea for future update, might be to include other type of Character LCDs like:
2x20,
2x40,
4x16
4x20
and be able the user to select these with jumpers. Or even sending serial commands only! This would better need feedback on the serial port but no need for jumpers, so can be implemented on your current PCB.
Ioannis
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
for my money i would let pbp do all the heavy lifting and leverage their nice efficent routines like this
works for 4 or 8 bit mode and all
Code:
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '
'Name : 16F690 LCD BACKPACK
' Date : oct 2025 richard
' Note : 300 words used of 2048
' Notes : Serin2 Baud Rate 300 ~ 19200 Intrc_OSC 8Mhz
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
#CONFIG
cfg = _INTRC_OSC_NOCLKOUT
cfg&= _WDT_OFF
cfg&= _PWRTE_OFF
cfg&= _MCLRE_OFF
cfg&= _CP_OFF
cfg&= _CPD_OFF
cfg&= _BOD_OFF
cfg&= _IESO_OFF
cfg&= _FCMEN_OFF
__CONFIG cfg
#ENDCONFIG
DEFINE OSC 8
ANSEL = 0 ' Set all pins digital
ANSELH = 0 ' Set all pins digital
OPTION_REG.7 = 0 ' PORTA/PORTB pull-ups are enabled by individual port latch values
CLEAR
DEFINE LCD_BITS 8 'defines the number of data interface lines (4 or 8)
DEFINE LCD_DREG PORTC 'defines the port where data lines are connected to
DEFINE LCD_RSREG PORTB 'defines the port where RS line is connected to
DEFINE LCD_RSBIT 6 'defines the pin where RS line is connected to
DEFINE LCD_EREG PORTB 'defines the port where E line is connected to
DEFINE LCD_EBIT 4 'defines the pin where E line is connected
DEFINE LCD_COMMANDUS 1500 'defines the delay after LCDOUT statement
DEFINE LCD_DATAUS 50 'delay in micro seconds
B1 var byte
Bl var byte
' 300=3313 600=1646 1200=813 2400=396 4800=188 9600=84 19200=32
BaudR var byte : baudr = 32
TRISC = 0
TRISA = % 11111110
OSCCON = $70
PAUSE 500
Porta.0 = 1 ' Backlight ON
LCDOUT $FE,1
' LCDOUT "ready @19200"
@ bsf LCD_RSREG ,LCD_RSBIT
main:
serin2 Portb.5,baudr,3,main,[b1]
if bl then
if b1 = 0 then
porta.0 = 0 ' Back Light OFF
endif
if b1 = 8 then
porta.0 = 1 ' Back Light ON
endif
bl = 0
goto main
endif
if b1 = 255 then
bl = 1
goto main
endif
if b1 = 254 then
@ bcf LCD_RSREG ,LCD_RSBIT
goto main
endif
@ MOVE?BB _B1,R3
@ L?CALL lcdsend
@ bsf LCD_RSREG ,LCD_RSBIT
goto main ' loop back to top
ps forgot to add it is now so easy to add a flash screen on boot
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
what is that bl (second line after main)? I guess bl should be b1.
But then, if b1 gets a 0 from the serial in, how the if-then's will work?
Ioannis
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
One var is B1 the other is BL, as in bl for bachlight .
I would need to paid more for properly named vars and valid meaningful comments
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
Well, ok then. BL stands for the back light. But where does it get set?
Ioannis
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
yes that's a very good idea, the one I have tested are 1601, 1602, 2004
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
Here's a shrink down version for displaying messages from internal arrays no serial input involved.
practical if just an operating device with control buttons attach to the remaining 5 ports is needed
Code:
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Project : LCD Backpack Self Text (Write text on LCD no serial port)
' Name : 16F690 LCD BACKPACK for Hitachi HD44780 1601 / 1602 / 2004
' Date : Oct 3 2025
' Notes : 320 words used of 4096
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Device = 16F690
'Declare Xtal = 8
'Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_OFF, MCLRE_OFF, CP_OFF, CPD_OFF, IESO_OFF, FCMEN_OFF
Declare Xtal = 20
Config HS_OSC, WDT_OFF, PWRTE_OFF, MCLRE_OFF, CP_OFF, CPD_OFF, IESO_OFF, FCMEN_OFF
ANSEL = 0 ' Set all pins digital
ANSELH = 0 ' Set all pins digital
TRISA = 0 : TRISB = %00100000 : TRISC = 0 : PORTA = 0 : PORTB = 0 : PORTC = 0
OSCCON = $70
Dim I As Byte
' 1601 1602 16 Char 1/2 Lines
Dim MyArrayA[16] As Byte = "0123456789ABCDEF"
Dim MyArrayB[16] As Byte = "abcdefghijklmnop"
' 2004 20 Char 4 Lines
'Dim MyArrayC[20] As Byte = "ABCDDE1234567890ABCD"
'Dim MyArrayD[20] As Byte = "abcdefghijklmnop1234"
'Dim MyArrayE[20] As Byte = "ABCDDE1234567890abcd"
'Dim MyArrayF[20] As Byte = "abcdefghijklmnop1234"
GoSub LCDINIT ' initialise LCD
PORTA = 1 ' Backlight ON
main:
' 1601 / 1602
PORTB = 0 : PORTC = 128 : PORTB = %00010000 : DelayUS 1 : PORTB = 0 : PORTB = %01000000 : DelayMS 3 ' Line 1
For I = 0 To 15
PORTC = MyArrayA[I] : PORTB = %01010000 : DelayUS 1 : PORTB = %01000000 : DelayMS 1
Next I
PORTB = 0 : PORTC = 192 : PORTB = %00010000 : DelayUS 1 : PORTB = 0 : PORTB = %01000000 : DelayMS 3 ' Line 2
For I = 0 To 15
PORTC = MyArrayB[I] : PORTB = %01010000 : DelayUS 1 : PORTB = %01000000 : DelayMS 1
Next I
' 2004
(*PORTB = 0 : PORTC = 128 : PORTB = %00010000 : DelayUS 1 : PORTB = 0 : PORTB = %01000000 : DelayMS 3 ' Line 1
For I = 0 To 19
PORTC = MyArrayC[I] : PORTB = %01010000 : DelayUS 1 : PORTB = %01000000 : DelayMS 1
Next I
PORTB = 0 : PORTC = 192 : PORTB = %00010000 : DelayUS 1 : PORTB = 0 : PORTB = %01000000 : DelayMS 3 ' Line 2
For I = 0 To 19
PORTC = MyArrayD[I] : PORTB = %01010000 : DelayUS 1 : PORTB = %01000000 : DelayMS 1
Next I
PORTB = 0 : PORTC = 148 : PORTB = %00010000 : DelayUS 1 : PORTB = 0 : PORTB = %01000000 : DelayMS 3 ' Line 3
For I = 0 To 19
PORTC = MyArrayE[I] : PORTB = %01010000 : DelayUS 1 : PORTB = %01000000 : DelayMS 1
Next I
PORTB = 0 : PORTC = 212 : PORTB = %00010000 : DelayUS 1 : PORTB = 0 : PORTB = %01000000 : DelayMS 3 ' Line 4
For I = 0 To 19
PORTC = MyArrayF[I] : PORTB = %01010000 : DelayUS 1 : PORTB = %01000000 : DelayMS 1
Next I*)
DelayMS 2000
PORTB = 0 : PORTC = 1 : PORTB = %00010000 : DelayUS 1 : PORTB = 0 : PORTB = %01000000 : DelayMS 4 ' Clear display
DelayMS 255
PORTA = 0 ' Bacck Light off
DelayMS 255
PORTA = %00000001 ' Bacck Light on
DelayMS 255
GoTo main
LCDINIT:
PORTC = %00000001 : PORTB = %00010000 : DelayUS 1 : PORTB = 0 : DelayMS 4 ' Clear display
PORTC = %00000010 : PORTB = %00010000 : DelayUS 1 : PORTB = 0 : DelayMS 2 ' Return Home
PORTC = %00111000 : PORTB = %00010000 : DelayUS 1 : PORTB = 0 : DelayMS 2 ' 5x8 Character 8 Bit, 2 Line
PORTC = %00001100 : PORTB = %00010000 : DelayUS 1 : PORTB = 0 : DelayMS 2 ' %00001DCB Display on/off, cursor on/off, blink y/n
PORTC = %00000110 : PORTB = %00010000 : DelayUS 1 : PORTB = 0 : DelayMS 2 ' Entry mode
Return
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
This code is not for PicBasic dialect...
Ioannis
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
Tried to test Richards code, but seems i cant make the LCD work at all.
For starters the Backlight does not turn off.
What is the sequence that should be sent over the serial port to control backlight and then send some text over to LCD?
Ioannis
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
The backlight is controlled by 255d and 0d or 255d and 8d.
Have yet to send some text over the LCD.
Ioannis
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
OOP'S!
usualy I code in both Positron & PBP3.
here's the PBP3 code. (added Pause C)
Code:
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Name : 16F690 LCD BACKPACK Self Text
' Date : Oct 4-2025
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Serin2
'#CONFIG
' __config _INTRC_OSC_CLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _IESO_OFF & _FCMEN_OFF
'#ENDCONFIG
' HSERIN
#CONFIG
__config _HS_OSC & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _IESO_OFF & _FCMEN_OFF
#ENDCONFIG
DEFINE OSC 20 ' Core is running at EXT-CRYSTAL 20MHz PBP 33,217
ANSEL = 0 ' Set all pins digital
ANSELH = 0 ' Set all pins digital
OPTION_REG.7 = 0 ' PORTA/PORTB pull-ups are enabled by individual port latch values
CM1CON0 = 0 ' Analog comparators off
En var Portb.4 : low en
RS var Portb.6 : low rs
B1 var byte : b1 = 0
C VAR BYTE : C = 10
I VAR BYTE
' 1601 - 1602
ArrayA var Byte [16] : ARRAYWRITE ArrayA,["ABCDEF1234567890"] ' Line 1
ArrayB var Byte [16] : ARRAYWRITE ArrayB,["1234567890!@#$%^"] ' Line 2
' 2004
'ArrayC var Byte [20] : ARRAYWRITE ArrayC,["ABCDEF1234567890!@#$"] ' Line 1
'ArrayD var Byte [20] : ARRAYWRITE ArrayD,["1234567890!@#$%^!@#$"] ' Line 2
'ArrayE var Byte [20] : ARRAYWRITE ArrayE,["ABCDEF1234567890!@#$"] ' Line 3
'ArrayF var Byte [20] : ARRAYWRITE ArrayF,["1234567890!@#$%^!@#$"] ' Line 4
TRISA = 0 : TRISB = %00100000 : TRISC = 0
PORTA = 0 : PORTB = 0 : PORTC = 0
OSCCON = $70
pause 100
high Porta.0 ' Backlight ON
gosub LCDinit ' initialise LCD
pause 100
main:
' 1601 - 1602
Low RS : PORTC = 128 : High En : PauseUS 1 : Low En : High RS : Pause 3 ' Line 1
For I = 0 To 15
PORTC = ArrayA[I]
High En : PauseUS 1 : Low En
Pause C
Next I
Low RS : PORTC = 192 : High En : PauseUS 1 : Low En : High RS : Pause 3 ' Line 2
For I = 0 To 15
PORTC = ArrayB[I]
High En : PauseUS 1 : Low En
Pause C
Next I
' 2004
'Low RS : PORTC = 128 : High En : PauseUS 1 : Low En : High RS : Pause 3 ' Line 1
'For I = 0 To 19
' PORTC = ArrayC[I]
' High En : PauseUS 1 : Low En
' Pause C
'Next I
'Low RS : PORTC = 192 : High En : PauseUS 1 : Low En : High RS : Pause 3 ' Line 2
'For I = 0 To 19
' PORTC = ArrayD[I]
' High En : PauseUS 1 : Low En
' Pause C
'Next I
'Low RS : PORTC = 148 : High En : PauseUS 1 : Low En : High RS : Pause 3 ' Line 3
'For I = 0 To 19
' PORTC = ArrayE[I]
' High En : PauseUS 1 : Low En
' Pause C
'Next I
'Low RS : PORTC = 212 : High En : PauseUS 1 : Low En : High RS : Pause 3 ' Line 4
'For I = 0 To 19
' PORTC = ArrayF[I]
' High En : PauseUS 1 : Low En
' Pause C
'Next I
Pause 1000
Low RS : PORTC = 1 : High En : PauseUS 1 : Low En : High RS : PauseUS 4 ' Clear display
Pause 500
'Low PORTA.0 ' Bacck Light off
Pause 200
High PORTA.0 ' Bacck Light on
Pause 200
GoTo main
LCDINIT: ' Standard LCD Module Initialisation
PORTC = %00000001 : HIGH EN : PAUSEus 1 : LOW EN : pause 4 ' Clear Display
PORTC = %00000010 : HIGH EN : PAUSEus 1 : LOW EN : pause 2 ' Return Home
PORTC = %00111000 : HIGH EN : PAUSEus 1 : LOW EN : Pause 2 ' 8 bit, 2 line, 5x8 Characters
PORTC = %00000110 : HIGH EN : PAUSEus 1 : LOW EN : Pause 2 ' Entry mode
PORTC = %00001100 : HIGH EN : PAUSEus 1 : LOW EN : Pause 2 ' %00001DCB Display on/off, Cursor on/off, Blink y/n
RETURN
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
the code I use are similar, you can try to adapt.
for the Hitachi HD44780 the decimal 254 represent the low RS then you need ot receive the line # as 128 line #1, 192 line #2, 148 line #3, 212 line #4
sEROUT2 lcd,baudR,pace,[254,128,"ABCDEFGHIJKLMNOP"] ' Line 1 16 Char
as for Richard code , for the Back Light he's using a toggle on,off with b1. (by receiving b1 turn On, then again turn Off)
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
Quote:
as for Richard code , for the Back Light he's using a toggle on,off with b1. (by receiving b1 turn On, then again turn Off)
Or more like
SEROUT2 lcd,baudR,pace,[ 255, 8] ' Back Light OFF
SEROUT2 lcd,baudR,pace,[ 255, 0] ' Back Light ON
depending on how you connected the backlight of course
-
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
just set:
BaudR var word
work fine here
-
1 Attachment(s)
Re: serial LCD 1602 Backpack using PIC16F690 for Hitach HD44780
tested richard code, work fine 300 to 9600 at 8Mhz (_INTRC_OSC_NOCLKOUT)
19200 not working at 8Mhz and 20Mhz Xtal
back light working fine 300~19200
Attachment 9993