Another sample code in assembly (20x4)

;*************************************************************/07/30/08*****
; File: LCD_20x4_test.asm @ 4Mhz.
; Project name: LCD Test 4x20
;***************************************************************************
LIST P=16F84
INCLUDE "P16F84.INC"
__CONFIG H'3FF1'
RADIX HEX
ERRORLEVEL -302,-202
;***************************************************************************
; Pin configuration for 20x4 LCD
;***************************************************************************
; RB0 = D4
; RB1 = D5
; RB2 = D6
; RB3 = D7
; RB4 = E
; RB5 = RS
;***************************************************************************
LCD_TEMP1 EQU 0X20
LCD_TEMP2 EQU 0X22
LCD_TEMP3 EQU 0X23
COUNT1 EQU 0X24
COUNT2 EQU 0X25
#DEFINE EN PORTB,4
#DEFINE RS PORTB,5
;***************************************************************************
ORG 0X00
BSF STATUS,RP0
MOVLW 0X00
MOVWF TRISB
BCF STATUS,RP0
CLRF PORTB
CALL LCD_INIT
GOTO MAIN
;***************************************************************************
LCD_TABLE: ADDWF PCL,F
RETLW 0X32 ; Set 4-bit mode
RETLW 0X2C ; Set 2 lines LCD
RETLW 0X08 ; Display OFF
RETLW 0X06 ; Set so cursor addr is incremented
RETLW 0X0C ; Display ON, cursor OFF, blink OFF
RETLW 0X01 ; Clear display
RETLW 0X02 ; Home cursor, clear RAM
RETLW 0X00 ; Return zero as end marker
;***************************************************************************
ORG 0X100
SET_STRING: ADDWF PCL,F
; 01234567890123456789
MSG_L1: DT " I love ",0
MSG_L2: DT " electronicslab ",0
MSG_L3: DT " by: ",0
MSG_L4: DT " bulate1983 ",0
;***************************************************************************
MAIN: CALL LCD_LINE_1
MOVLW MSG_L1
CALL STRING_OUT
CALL LCD_LINE_2
MOVLW MSG_L2
CALL STRING_OUT
CALL LCD_LINE_3
MOVLW MSG_L3
CALL STRING_OUT
CALL LCD_LINE_4
MOVLW MSG_L4
CALL STRING_OUT
GOTO MAIN
;***************************************************************************
STRING_OUT: MOVWF LCD_TEMP1 ; Save the string
DECF LCD_TEMP1,F ; Subract 1 to string.
LOOP01: MOVLW 0X01
MOVWF PCLATH
MOVF LCD_TEMP1,W
CALL SET_STRING ; Add the Count text to PCL
XORLW 0X00
BTFSC STATUS,Z ; String = 0?
GOTO CLR_PCL
CALL LCD_CHAR ; display to LCD
INCF LCD_TEMP1,F ; Point to next character
GOTO LOOP01 ; Keep checking
CLR_PCL: CLRF PCLATH
RETURN
;***************************************************************************
; LCD Subroutine 20x4 Display
;***************************************************************************
LCD_INIT: CALL DELAY_5 ; Wait to Initialize the LCD
CLRF LCD_TEMP2
SET_LCD: MOVF LCD_TEMP2,W
CALL LCD_TABLE
XORLW 0X00
BTFSC STATUS,Z
RETURN
CALL LCD_CMD
INCF LCD_TEMP2,F
CALL DELAY_5
GOTO SET_LCD
;***************************************************************************
LCD_LINE_1: MOVLW 0X80 ; Go to start of line 1
CALL LCD_CMD ; Yes call Command Display
RETURN
LCD_LINE_2: MOVLW 0XC0 ; Go to start of line 2
CALL LCD_CMD ; Yes call Command Display
RETURN
LCD_LINE_3: MOVLW 0X94 ; Go to start of line 3
CALL LCD_CMD ; Yes call Command Display
RETURN
LCD_LINE_4: MOVLW 0XD4 ; Go to start of line 4
CALL LCD_CMD ; Yes call Command Display
RETURN
;***************************************************************************
PULSE_EN: BSF EN
NOP
BCF EN
RETURN
;***************************************************************************
LCD_CMD: MOVWF LCD_TEMP3
SWAPF LCD_TEMP3,W ; Send the upper nibble
ANDLW B'00001111' ; Clear the upper 4-bit of W
MOVWF PORTB
BCF RS
CALL PULSE_EN
MOVF LCD_TEMP3,W ; Send the lower nibble
ANDLW B'00001111' ; Clear the upper 4-bit of W
MOVWF PORTB
BCF RS
CALL PULSE_EN
CALL DELAY_1
RETURN
;***************************************************************************
LCD_CHAR: MOVWF LCD_TEMP3
SWAPF LCD_TEMP3,W ; Send the upper nibble
ANDLW B'00001111' ; Clear the upper 4-bit of W
MOVWF PORTB
BSF RS
CALL PULSE_EN
MOVF LCD_TEMP3,W ; Send the lower nibble
ANDLW B'00001111' ; Clear the upper 4-bit of W
MOVWF PORTB
BSF RS
CALL PULSE_EN
CALL DELAY_1
RETURN
;***************************************************************************
; Delay Subroutine @ 4Mhz.
;***************************************************************************
DELAY_1: MOVLW .200
MOVWF COUNT1
LOOP1: NOP
NOP
DECFSZ COUNT1,F
GOTO LOOP1
RETURN
DELAY_5: MOVLW .5
MOVWF COUNT2
LOOP2: CALL DELAY_1
DECFSZ COUNT2,F
GOTO LOOP2
RETURN
;***************************************************************************
END
Another sample code in assembly (20x4)

;*************************************************************/07/30/08*****
; File: LCD_20x4_test.asm @ 4Mhz.
; Project name: LCD Test 4x20
;***************************************************************************
LIST P=16F84
INCLUDE "P16F84.INC"
__CONFIG H'3FF1'
RADIX HEX
ERRORLEVEL -302,-202
;***************************************************************************
; Pin configuration for 20x4 LCD
;***************************************************************************
; RB0 = D4
; RB1 = D5
; RB2 = D6
; RB3 = D7
; RB4 = E
; RB5 = RS
;***************************************************************************
LCD_TEMP1 EQU 0X20
LCD_TEMP2 EQU 0X22
LCD_TEMP3 EQU 0X23
COUNT1 EQU 0X24
COUNT2 EQU 0X25
#DEFINE EN PORTB,4
#DEFINE RS PORTB,5
;***************************************************************************
ORG 0X00
BSF STATUS,RP0
MOVLW 0X00
MOVWF TRISB
BCF STATUS,RP0
CLRF PORTB
CALL LCD_INIT
GOTO MAIN
;***************************************************************************
LCD_TABLE: ADDWF PCL,F
RETLW 0X32 ; Set 4-bit mode
RETLW 0X2C ; Set 2 lines LCD
RETLW 0X08 ; Display OFF
RETLW 0X06 ; Set so cursor addr is incremented
RETLW 0X0C ; Display ON, cursor OFF, blink OFF
RETLW 0X01 ; Clear display
RETLW 0X02 ; Home cursor, clear RAM
RETLW 0X00 ; Return zero as end marker
;***************************************************************************
ORG 0X100
SET_STRING: ADDWF PCL,F
; 01234567890123456789
MSG_L1: DT " I love ",0
MSG_L2: DT " electronicslab ",0
MSG_L3: DT " by: ",0
MSG_L4: DT " bulate1983 ",0
;***************************************************************************
MAIN: CALL LCD_LINE_1
MOVLW MSG_L1
CALL STRING_OUT
CALL LCD_LINE_2
MOVLW MSG_L2
CALL STRING_OUT
CALL LCD_LINE_3
MOVLW MSG_L3
CALL STRING_OUT
CALL LCD_LINE_4
MOVLW MSG_L4
CALL STRING_OUT
GOTO MAIN
;***************************************************************************
STRING_OUT: MOVWF LCD_TEMP1 ; Save the string
DECF LCD_TEMP1,F ; Subract 1 to string.
LOOP01: MOVLW 0X01
MOVWF PCLATH
MOVF LCD_TEMP1,W
CALL SET_STRING ; Add the Count text to PCL
XORLW 0X00
BTFSC STATUS,Z ; String = 0?
GOTO CLR_PCL
CALL LCD_CHAR ; display to LCD
INCF LCD_TEMP1,F ; Point to next character
GOTO LOOP01 ; Keep checking
CLR_PCL: CLRF PCLATH
RETURN
;***************************************************************************
; LCD Subroutine 20x4 Display
;***************************************************************************
LCD_INIT: CALL DELAY_5 ; Wait to Initialize the LCD
CLRF LCD_TEMP2
SET_LCD: MOVF LCD_TEMP2,W
CALL LCD_TABLE
XORLW 0X00
BTFSC STATUS,Z
RETURN
CALL LCD_CMD
INCF LCD_TEMP2,F
CALL DELAY_5
GOTO SET_LCD
;***************************************************************************
LCD_LINE_1: MOVLW 0X80 ; Go to start of line 1
CALL LCD_CMD ; Yes call Command Display
RETURN
LCD_LINE_2: MOVLW 0XC0 ; Go to start of line 2
CALL LCD_CMD ; Yes call Command Display
RETURN
LCD_LINE_3: MOVLW 0X94 ; Go to start of line 3
CALL LCD_CMD ; Yes call Command Display
RETURN
LCD_LINE_4: MOVLW 0XD4 ; Go to start of line 4
CALL LCD_CMD ; Yes call Command Display
RETURN
;***************************************************************************
PULSE_EN: BSF EN
NOP
BCF EN
RETURN
;***************************************************************************
LCD_CMD: MOVWF LCD_TEMP3
SWAPF LCD_TEMP3,W ; Send the upper nibble
ANDLW B'00001111' ; Clear the upper 4-bit of W
MOVWF PORTB
BCF RS
CALL PULSE_EN
MOVF LCD_TEMP3,W ; Send the lower nibble
ANDLW B'00001111' ; Clear the upper 4-bit of W
MOVWF PORTB
BCF RS
CALL PULSE_EN
CALL DELAY_1
RETURN
;***************************************************************************
LCD_CHAR: MOVWF LCD_TEMP3
SWAPF LCD_TEMP3,W ; Send the upper nibble
ANDLW B'00001111' ; Clear the upper 4-bit of W
MOVWF PORTB
BSF RS
CALL PULSE_EN
MOVF LCD_TEMP3,W ; Send the lower nibble
ANDLW B'00001111' ; Clear the upper 4-bit of W
MOVWF PORTB
BSF RS
CALL PULSE_EN
CALL DELAY_1
RETURN
;***************************************************************************
; Delay Subroutine @ 4Mhz.
;***************************************************************************
DELAY_1: MOVLW .200
MOVWF COUNT1
LOOP1: NOP
NOP
DECFSZ COUNT1,F
GOTO LOOP1
RETURN
DELAY_5: MOVLW .5
MOVWF COUNT2
LOOP2: CALL DELAY_1
DECFSZ COUNT2,F
GOTO LOOP2
RETURN
;***************************************************************************
END
nakita ko po 'tong program and its working... pero ang project po namin ay maglagay ng switch para po machange yung mga message na nadisplay... so, pagnatrigger po yung switch, ibang message naman ang madi-display... pagna trigger po yung switch again, babalik po yung unang message na nadisplay.. we try enhancing the program pero wala pong lumabas na message.. di po gumana eh... can it be done using pic16f84a???
please.. pahlep po... T_T