cblock 0x20
count
count1
counta
countb
tmp1
tmp2
templcd
templcd2
endc
LCD_PORT Equ PORTA
LCD_TRIS Equ TRISA
LCD_RS Equ 0x04
LCD_RW Equ 0x06
LCD_E Equ 0x07
org 0x0000
Initialise clrf count
clrf PORTA
clrf PORTB
SetPorts bsf STATUS, RP0
movlw 0x00
movwf LCD_TRIS
bcf STATUS, RP0
call Delay100
call LCD_Init
clrf count
Message movf count, w
call Text
xorlw 0x00
btfsc STATUS, Z
goto NextMessage
call LCD_Char
call Delay255
incf count, f
goto Message
NextMessage call LCD_Line2
clrf count
Message2 movf count, w
call Text2
xorlw 0x00
btfsc STATUS, Z
goto EndMessage
call LCD_Char
incf count, f
goto Message2
EndMessage
Stop goto Stop
;Subroutines and text tables
;LCD routines
;Initialise LCD
LCD_Init movlw 0x20
call LCD_Cmd
movlw 0x28
call LCD_Cmd
movlw 0x06
call LCD_Cmd
movlw 0x0d
call LCD_Cmd
call LCD_Clr
retlw 0x00
; command set routine
LCD_Cmd movwf templcd
swapf templcd, w
andlw 0x0f
movwf LCD_PORT
bcf LCD_PORT, LCD_RS
call Pulse_e
movf templcd, w
andlw 0x0f
movwf LCD_PORT
bcf LCD_PORT, LCD_RS
call Pulse_e
call Delay5
retlw 0x00
LCD_CharD addlw 0x30
LCD_Char movwf templcd
swapf templcd, w
andlw 0x0f
movwf LCD_PORT
bsf LCD_PORT, LCD_RS ;RS line to 1
call Pulse_e
movf templcd, w
andlw 0x0f
movwf LCD_PORT
bsf LCD_PORT, LCD_RS ;RS line to 1
call Pulse_e
call Delay5
retlw 0x00
LCD_Line1 movlw 0x80
call LCD_Cmd
retlw 0x00
LCD_Line2 movlw 0xc0
call LCD_Cmd
retlw 0x00
LCD_Line1W addlw 0x80
call LCD_Cmd
retlw 0x00
LCD_Line2W addlw 0xc0
call LCD_Cmd
retlw 0x00
LCD_CurOn movlw 0x0d
call LCD_Cmd
retlw 0x00
LCD_CurOff movlw 0x0c
call LCD_Cmd
retlw 0x00
LCD_Clr movlw 0x01
call LCD_Cmd
retlw 0x00
LCD_HEX movwf tmp1
swapf tmp1, w
andlw 0x0f
call HEX_Table
call LCD_Char
movf tmp1, w
andlw 0x0f
call HEX_Table
call LCD_Char
retlw 0x00
Delay255 movlw 0xff ;delay 255 mS
goto d0
Delay100 movlw d'100' ;delay 100mS
goto d0
Delay50 movlw d'50' ;delay 50mS
goto d0
Delay20 movlw d'20' ;delay 20mS
goto d0
Delay5 movlw 0x05 ;delay 5.000 ms (4 MHz clock)
d0 movwf count1
d1 movlw 0xC7 ;delay 1mS
movwf counta
movlw 0x01
movwf countb
Delay_0
decfsz counta, f
goto $+2
decfsz countb, f
goto Delay_0
decfsz count1 ,f
goto d1
retlw 0x00
Pulse_e bsf LCD_PORT, LCD_E
nop
bcf LCD_PORT, LCD_E
retlw 0x00
;end of LCD routines
HEX_Table ADDWF PCL , f
RETLW 0x30
RETLW 0x31
RETLW 0x32
RETLW 0x33
RETLW 0x34
RETLW 0x35
RETLW 0x36
RETLW 0x37
RETLW 0x38
RETLW 0x39
RETLW 0x41
RETLW 0x42
RETLW 0x43
RETLW 0x44
RETLW 0x45
RETLW 0x46
Text addwf PCL, f
retlw 'H'
retlw 'e'
retlw 'l'
retlw 'l'
retlw 'o'
retlw 0x00
Text2 ADDWF PCL, f
RETLW 'R'
RETLW 'e'
RETLW 'a'
RETLW 'd'
RETLW 'y'
RETLW '.'
RETLW '.'
RETLW '.'
RETLW 0x00
end