
list		p=16f877A	; list directive to define processor
	#include	<p16f877A.inc>	; processor specific variable definitions
	
	__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
    
w EQU 0
f EQU 1

DISP_ON 	EQU		 H'0C'
DISP_ON_C	EQU		 H'0E'
DISP_0N_B	EQU 	 H'0F'
DISP_OFF	EQU		 H'08'
CLR_DISP 	EQU 	 H'01'
ENTRY_INC	EQU		 H'06'
ENTRY_INC_S EQU		 H'07'
ENTRY_DEC   EQU 	 H'04'
ENTRY_DEC_S EQU		 H'05'
DD_RAM_ADDR1 EQU 	 H'80'
DD_RAM_ADDR2 EQU	 H'C0'

CBLOCK H'0C'
Counter 
LCD_temp 
BF_temp
ENDC
#define E PORTA,0
#define RW PORTA,1
#define RS PORTA,2

ORG H'0000'
goto start
;*****************************************************************************************************
start
		BSF STATUS,RP0 
		MOVLW 0x06 
		MOVWF ADCON1
		movlw B'10010101'
		movwf OPTION_REG	
		bcf 	STATUS,RP0
		clrf	PORTA
		clrf	PORTB
		bsf 	STATUS,RP0
		movlw	B'00000000'
		movwf 	TRISA
		clrf 	TRISB
		bcf 	STATUS,RP0
		goto 	main
;*************************************************************************************************************
Init_LCD
		
		movlw	D'250'
		movwf 	Counter
		call 	Wait 
		movlw	D'250'
		movwf 	Counter
		call 	Wait 
		movlw 	B'00110000'
		movwf 	PORTB
		bcf		RW
		bcf		RS
		bsf 	E
		call diod
		bcf		E
		movlw	D'250'
		movwf	Counter 
		call 	Wait 
		movlw 	B'00100000'
		movwf 	PORTB
		bcf		RW
		bcf		RS
		bsf 	E
		call diod
		bcf		E
		movlw 	B'00101000'
		call 	Send_command
		movlw 	DISP_OFF
		call 	Send_command
		movlw	DISP_ON_C
		call 	Send_command
		movlw	CLR_DISP 
		call 	Send_command
		movlw	ENTRY_INC
		call 	Send_command
		return 
;***************************************************************************************************************
Wait	clrf 	TMR0
again 	bcf		INTCON,T0IF
loop	btfss	INTCON,T0IF
		goto 	loop
		decfsz	Counter,f
		goto 	again 
		return
;*****************************************************************************************************************		
Send_command 

	movwf 	LCD_temp
	call	Check
	movf	LCD_temp,w
	andlw 	H'F0'
	movwf	PORTB
	bcf		RW
	bcf		RS
	bsf		E
	call diod
	bcf		E
	swapf	LCD_temp,w
	andlw	H'F0'
	movwf 	PORTB
	bsf		E
	call diod
	bcf		E
	return
;*****************************************************************************************************************
Send_char 

	movwf	LCD_temp
	call 	Check
	movf	LCD_temp,w
	andlw	H'F0'
	movwf	PORTB	
	bcf		RW
	bsf		RS
	bsf		E
	call diod
	bcf		E
	swapf	LCD_temp,w 
	andlw	H'F0'
	movwf	PORTB
	bsf		E
	call diod
	bcf		E
	return
;*****************************************************************************************************************
Check  movlw	D'250'
		movwf	Counter 
		call Wait
		return
;*****************************************************************************************************************
diod   bsf PORTB,3
		 movlw	D'20'
		movwf	Counter 
		call Wait
		bcf PORTB,3
		return
;****************************************************************************************************************


main	call 	Init_LCD
send_message
		movlw 	DD_RAM_ADDR1
		call	Send_command
		movlw	'V'
		call	Send_char
		movlw	'L'
		call	Send_char
		movlw	'A'
		call	Send_char
		movlw	'D'
		call	Send_char
		movlw	'O'
		call	Send_char
		movlw	' '
		call	Send_char
		movlw	'S'
		call	Send_char
		movlw	'Y'
		call	Send_char
		movlw	'S'
		call	Send_char
		movlw	'T'
		call	Send_char
		movlw	'E'
		call	Send_char
		movlw	'M'
		call	Send_char
second_line
		movlw	DD_RAM_ADDR2
		call 	Send_command
		movlw	'V'
		call	Send_char
		movlw	'E'
		call	Send_char
		movlw	'R'
		call	Send_char
		movlw	'.'
		call	Send_char
		movlw	'1'
		call	Send_char
		movlw	'.'
		call	Send_char
		movlw	'0'
		call	Send_char
		movlw	'A'
		call	Send_char
	
	stop_send 
		nop
		goto stop_send
	END
