;********LCD 8-bit Interface Using Shift Register*******
;         by: Eng'r Roland Michael A. dela Peña        *
;*******************************************************                 			                     			
	
	LIST            P=16F84	
	ERRORLEVEL      -302
	#INCLUDE        P16F84.INC       

;****************************************************************************
; 		REGISTER DEFINITIONS
;****************************************************************************
	CBLOCK	0CH
		ROLAND	  ; VARIABLE REGISTER (SEND CHARACTER TO LCD)
		COUNT	  ; BIT COUNTER
		LOOPS	  ; DELAY LOOP COUNTER
		LOOPS2	  ; DELAY LOOP COUNTER

	
	ENDC

;****************************************************************************
; 		BIT DEFINITIONS
;****************************************************************************
	#DEFINE CLK	PORTB,2		; CLOCK PIN (SHIFT REGISTER).
	#DEFINE DAT	PORTB,1		; CLOCK PIN (SHIFT REGISTER).
	#DEFINE STR	PORTA,0		; ENABLE PIN (LCD) & STROBE PIN (SHIFT REGISTER) ARE 
					; CONNECTED.
	#DEFINE RS	PORTA,3 	; REGISTER SELECT PIN (LCD).

;****************************************************************************
;		THIS PART INITIALIZES THE PORTS AND 
;		OTHER PHERIPERALS IN MICROCONTROLLER
;****************************************************************************
	ORG 	0000H		; SET POWER ON RESET VECTOR.
INIT
	BSF 	STATUS,RP0	; SET BANK = 1.
        BCF	OPTION_REG,7	; ENABLE BUILT-IN PULL-UP RESISTORS.
	BCF	OPTION_REG,5	; SET CLOCK SOURCE TO INTERNAL INSTRUCTION CYCLE CLOCK.
	BCF	OPTION_REG,3	; SET PRESCALER TO TMR0.
       	MOVLW 	B'00000000'	; SET ALL PORTB TO OUTPUT.
        MOVWF   TRISB           
	MOVLW	B'00000000'	; SET ALL PORTA TO OUTPUT.
	MOVWF	TRISA		
        BCF 	STATUS,RP0	; SET BANK = 0.
;****************************************************************************
; 		THIS ROUTINE INITIALIZE LCD.
;****************************************************************************

	MOVLW	B'00111000'
	CALL 	TRANSFER
	MOVLW	D'25'
	MOVWF	LOOPS
	CALL 	WAIT		; WAIT FOR 25MS UNTIL VCC RISES TO 4.5V.
	BCF	RS		; CLEAR RS LINE.
	MOVLW	B'00111000'
	CALL 	SENDCMD		; SEND COMMAND FOR 8-BIT INTERFACE.
	MOVLW	B'00000001'
	CALL 	SENDCMD		; SEND COMMAND FOR CLEAR DISPLAY.
	MOVLW	B'00000010'
	CALL 	SENDCMD		; SEND COMMAND FOR RETURN HOME.
	MOVLW	B'00001100'
	CALL 	SENDCMD		; SEND COMMAND FOR DISPLAY ON.
	MOVLW	B'00000110'	
	CALL 	SENDCMD		; SEND COMMAND FOR ENTRY MODE SET.

UPDTLCD
	MOVLW	B'10000000'
	CALL 	SENDCMD			; SEND DD RAM ADDRESS (1ST LINE).
	MOVLW	'R'
	CALL 	SENDCHAR
	MOVLW	'O'
	CALL 	SENDCHAR
	MOVLW	'L'
	CALL 	SENDCHAR
	MOVLW	'A'
	CALL 	SENDCHAR
	MOVLW	'N'
	CALL 	SENDCHAR
	MOVLW	'D'
	GOTO 	SENDCHAR
WAKAS
	GOTO 	WAKAS
;****************************************************************************
; 		DELAY ROUTINE
; 		THIS ROUTINE TAKES THE VALUE IN ‘LOOPS’
; 		AND MULTIPLIES IT TIMES 1 MILLISECOND TO
; 		DETERMINE DELAY TIME
;****************************************************************************

WAIT
	MOVLW	D'250'			; TIMING ADJUSTMENT VARIABLE.
	MOVWF	LOOPS2
TOP	 			
	NOP				; SIT AND WAIT.
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP	
	DECFSZ 	LOOPS2 			; INNER LOOPS COMPLETE?
	GOTO 	TOP			; NO, GO AGAIN.
	DECFSZ	LOOPS 			; OUTER LOOPS COMPLETE?
	GOTO 	WAIT 			; NO, GO AGAIN.
	RETLW 	D'0' 			; YES, RETURN FROM SUB.

;****************************************************************************
;		SENDS CHARACTER TO LCD
; 		THIS ROUTINE SPLITS THE CHARACTER INTO THE UPPER AND LOWER
; 		NIBBLES AND SENDS THEM TO THE LCD, UPPER NIBBLE FIRST 
; 		THE DATA IS TRANSMITTED ON THE PORTA RA3:RA0 PINS
;****************************************************************************

SENDCHAR
	BSF	RS			; SET LCD TO DATA MODE.
SEND
	MOVWF	ROLAND			; CHARACTER TO BE SENT IS IN W REGISTER.
	MOVLW	D'2'			; DELAY FOR SENDING DATA TO LCD.
	MOVWF	LOOPS
	CALL 	WAIT			; WAIT LCD TO BE READY.
	GOTO 	TRANSFER

;****************************************************************************
; 		SENDS COMMAND TO LCD
; 		THIS ROUTINE SPLITS THE COMMAND INTO THE UPPER AND LOWER
; 		NIBBLES AND SENDS THEM TO THE LCD, UPPER NIBBLE FIRST 
;****************************************************************************
SENDCMD
	BCF	RS			; SET LCD TO COMMAND MODE.
	GOTO 	SEND

;****************************************************************************
; 		THIS PART INITIATE THE DATA TO BE DISPLAYED ON LCD
;****************************************************************************

TRANSFER
	MOVLW	D'8'
	MOVWF	COUNT			; SET # OF BITS TO 8.
TRANSMIT	
	RLF	ROLAND			; ROTATE RIGHT TXBUF THROUGH CARRY OF STATUS FLAG.
	BTFSC	STATUS,0		; IS LEAST SIGNIFICANT BIT OF ROLAND = 0?
	BSF	DAT			; NO, SET DATA HIGH.
	BTFSS	STATUS,0		; IS LEAST SIGNIFICANT BIT OF ROLAND = 1?
	BCF	DAT			; YES, SET DATA LOW.
	BSF	CLK			; FOR CLOCK PULSE.
	BCF	CLK
	DECFSZ	COUNT			; DECREMENT BIT COUNT.
	GOTO 	TRANSMIT

;****************************************************************************
; 		THIS SUB ROUTINE STROBE THE DATA ON LCD
;****************************************************************************

STROBE
	BSF	STR			; STROBE THE DATA NOW.
	BCF	STR
	RETLW 	D'0'

	END

    Source: geocities.com/ece23314/prog

               ( geocities.com/ece23314)