#DEFINE	LCD_RS		PORTA,3
#DEFINE LCD_E		PORTA,4
#DEFINE	LCD_DATA_4	PORTB,4
#DEFINE	LCD_DATA_5	PORTB,5
#DEFINE	LCD_DATA_6	PORTB,6
#DEFINE	LCD_DATA_7	PORTB,7

CBLOCK 0x20 
LCD_DELAYus		;20
LCD_DELAYms		;21
LCD_DOCBUFF		;22
LCD_TEMP0		;23
LCD_TEMP1		;24
ENDC

LCD_INIT:
	MOVLW	B'00000100'	
	MOVWF	LCD_DOCBUFF
	MOVLW	.61		
	CALL 	DELAY_ms
	MOVLW	B'00110011'		; 2x 8bit resets
	CALL	LCD_COMMAND
	MOVLW	B'00110011'		; 2x 8bit resets
	CALL	LCD_COMMAND
	MOVLW	B'00110010'		; 8bit reset then 4bit reset
	CALL	LCD_COMMAND
	MOVLW	B'00101100'		; Function Set - 4bit, 2 lines
	CALL	LCD_COMMAND
	MOVLW	B'00000110'		; Mode Set - incr. w/crsr shift
	CALL	LCD_COMMAND
	MOVLW	B'00001100'		; Display on, cursor & blink off
	CALL	LCD_COMMAND
	MOVLW	B'00000001'		; Display Clear
	CALL	LCD_COMMAND
	MOVLW	B'00000010'		; Cursor Home
	CALL	LCD_COMMAND
	MOVLW	.61		
	CALL 	DELAY_ms
	RETURN
LCD_COMMAND:
	MOVWF	LCD_TEMP0		; Store byte in Temp 0
	BCF		LCD_RS			; RS low=instruction
	MOVLW	.10		
	CALL 	DELAY_10us
	GOTO	LCD_SEND
LCD_CHAR:
	MOVWF	LCD_TEMP0		; Store byte in Temp 0
	BSF		LCD_RS			; RS high=character
LCD_SEND:
	MOVLW	.10		
	CALL 	DELAY_10us
	BCF		LCD_DATA_7		; Clear data bits
	BCF		LCD_DATA_6
	BCF		LCD_DATA_5
	BCF		LCD_DATA_4
	BTFSC	LCD_TEMP0,7	; Load high nibble
	BSF		LCD_DATA_7
	BTFSC	LCD_TEMP0,6
	BSF		LCD_DATA_6
	BTFSC	LCD_TEMP0,5
	BSF		LCD_DATA_5
	BTFSC	LCD_TEMP0,4
	BSF		LCD_DATA_4
	CALL	PULSE_E
	MOVLW	.10		
	CALL 	DELAY_10us
	BCF		LCD_DATA_7		; Clear data bits
	BCF		LCD_DATA_6
	BCF		LCD_DATA_5
	BCF		LCD_DATA_4
	BTFSC	LCD_TEMP0,3	; Load low nibble
	BSF		LCD_DATA_7
	BTFSC	LCD_TEMP0,2
	BSF		LCD_DATA_6
	BTFSC	LCD_TEMP0,1
	BSF		LCD_DATA_5
	BTFSC	LCD_TEMP0,0
	BSF		LCD_DATA_4
	MOVLW	.10		
	CALL 	DELAY_10us
	CALL	PULSE_E
	RETURN
PULSE_E:
	BSF	LCD_E
	NOP
	NOP
	NOP
	BCF	LCD_E
	RETURN
DELAY_10us:	
 	MOVWF   LCD_DELAYus  
	NOP
	NOP 
	DECFSZ  LCD_DELAYus,f 
 	GOTO    $-1 
	RETURN
DELAY_ms:
	MOVWF   LCD_DELAYms  
	MOVLW	D'162'	
	CALL	DELAY_10us
	DECFSZ  LCD_DELAYms,f 
 	GOTO    $-2 
	RETURN
