list p=16F84A
#include <p16F84A.inc>
;***********************Setup constants***********************
BLA equ 0x20
BLA2 equ 0x21
BLA3 equ 0x22
BLA4 equ 0x23
BLA5 equ 0x24
REG_1 equ 0x30
REG_2 equ 0x31
LOOP equ 0x32
LOOP2 equ 0x33
;***********************Setup the PORT************************
org 0x00
goto main
org 0x10
main
bsf STATUS,5 ;switch to Bank 1
MOVLW 0x00
MOVWF TRISA ;set all PORTA pins as outputs
MOVWF TRISB ;set all PORTB pins as outputs
bcf STATUS,5 ;switch back to Bank0
Start
bcf PORTA,2
CALL LDELAY
MOVLW 0x38 ;initialize LCD 5x7 Matrix
CALL COMNWRT
CALL LDELAY
MOVLW 0x38 ;initialize LCD 5x7 Matrix
CALL COMNWRT
CALL LDELAY
MOVLW 0x07
CALL COMNWRT
CALL LDELAY
MOVLW 0x06
CALL COMNWRT
CALL LDELAY
MOVLW 0x0F ;Display on, cursor blinking
CALL COMNWRT
CALL DELAY
MOVLW 0x85 ;cursor at line 1, position 5
CALL COMNWRT
CALL DELAY
MOVLW 0x41 ;Display letter 'A'
CALL DATAWRT
CALL DELAY
MOVLW 0x4E ;Display letter 'N'
CALL DATAWRT
CALL DELAY
MOVLW 0x44 ;Display letter 'D'
CALL DATAWRT
CALL DELAY
MOVLW 0x52 ;Display letter 'R'
CALL DATAWRT
CALL DELAY
MOVLW 0x45 ;Display letter 'E'
CALL DATAWRT
CALL DELAY
MOVLW 0x49 ;Display letter 'I'
CALL DATAWRT
CALL DELAY
MOVLW 0xC5 ;cursor at line 2, position 4
CALL COMNWRT
CALL DELAY
MOVLW 0x4D ;Display letter 'M'
CALL DATAWRT
CALL DELAY
MOVLW 0x4F ;Display letter 'O'
CALL DATAWRT
CALL DELAY
MOVLW 0x52 ;Display letter 'R'
CALL DATAWRT
CALL DELAY
MOVLW 0x4F ;Display letter 'O'
CALL DATAWRT
CALL DELAY
MOVLW 0x5A ;Display letter 'Z'
CALL DATAWRT
CALL DELAY
THERE Goto THERE ;stay here (I mean there).
COMNWRT ;send command to LCD
MOVWF REG_1 ;coppy W to reg_1
MOVLW 0x08 ;Load 8 to W
MOVWF LOOP ;Load 8 to Loop
HERE RLF REG_1,1 ;rotate right
BTFSS STATUS,0 ;check carry
bcf PORTB,1 ;clear RB1 if carry = 0
BTFSC STATUS,0 ;check carry
bsf PORTB,1 ;set RB1 if carry = 1
bcf PORTB,0 ;clear clock
bsf PORTB,0 ;L-to-H clock pule
bcf PORTB,0 ;clear clock
DECFSZ LOOP,1 ;repeat 8 times
GOTO HERE
bcf PORTA,0 ;RS = 0 for command
bcf PORTA,1 ;R/W = 0 for write
bsf PORTA,2 ;E = 1 for high pulse
CALL SDELAY ;make a wide en pulse
bcf PORTA,2 ;E = 0 for H-to-L pulse
RETURN
DATAWRT ;write data to LCD
;copy W to LCD Data Pin
MOVWF REG_2 ;coppy W to reg_2
MOVLW 0x08 ;Load 8 to W
MOVWF LOOP2 ;Load 8 to Loop2
HERE2 RLF REG_2,1 ;rotate right
BTFSS STATUS,0 ;check carry
bcf PORTB,1 ;clear RB1 if carry = 0
BTFSC STATUS,0 ;check carry
bsf PORTB,1 ;set RB1 if carry = 1
bcf PORTB,0 ;clear clock
bsf PORTB,0 ;L-to-H clock pule
bcf PORTB,0 ;clear clock
DECFSZ LOOP2,1 ;repeat 8 times
GOTO HERE2
BSF PORTA,0 ;RS = 1 for command
BCF PORTA,1 ;R/W = 0 for write
BSF PORTA,2 ;E = 1 for high pulse
CALL SDELAY ;make a wide en pulse
BCF PORTA,2 ;E = 0 for H-to-L pulse
RETURN
DELAY ;15.3mS LCD Write Delay
MOVLW 0x44
MOVWF BLA
MOVLW 0x19
MOVWF BLA2
BACK DECFSZ BLA,1
GOTO BACK
BACK2 DECFSZ BLA2,1
GOTO BACK2
RETURN
LDELAY ;4.5 second power-up delay
MOVLW 0xFA
MOVWF BLA3
MOVWF BLA4
MOVLW 0x02
MOVWF BLA5
BACK3 DECFSZ BLA3,1
GOTO BACK3
BACK4 DECFSZ BLA4,1
GOTO BACK4
BACK5 DECFSZ BLA5,1
GOTO BACK5
RETURN
SDELAY ;3uS En pulse delay
NOP
RETURN
END