;********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
               (
geocities.com/ece23314)