;********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