

#define E PORTC,7
#define RW PORTC,6
#define RS PORTC,5	


	cblock H'20' ;задаване на регистри с адрес 20h 
	
	count1
	count12
	count13
	count22
	count23
	count32
	count33

	endc

Estrobe 	MACRO
			bsf E; макрос за получаване на импулс (стробиращ сигнал) за управление на LCD
			nop
			nop
			nop; 3us закъснение
			bcf E
			ENDM	



;***********************************************************
;	инициализация на LCD модула
;***********************************************************
		
		movlw 0x1A; 26,2ms закъснение
		call delay2
		movlw 0x38
		movwf PORTB
		Estrobe
		movlw 0x06; 6,14ms закъснение
		call delay2
		Estrobe
		movlw 0x2C; 256us закъснение
		call delay1
		Estrobe; избор на 8-bit режим
		call busy
		movlw 0x06
		movwf PORTB; Entry mode set
		Estrobe
		call busy
		movlw 0x0c
		movwf PORTB; Turn ON-D,C
		Estrobe
		call busy
		movlw 0x01
		movwf PORTB; clear display
		Estrobe
		call busy



;*****************************************************************************************
;   време закъснение 5.75us до 1.47ms при 1us цикъл (5.75us * W = Delay) W = 1 до 255
;*****************************************************************************************

delay1  bcf STATUS,RP0
        movwf count1
cau0    decf count1
        nop
        btfss STATUS,Z
        goto cau0
        return

;*********************************************************************************
; 	време закъснение 1.279ms до 327.5ms при 1us цикъл (1.279ms * W = Delay)
;*********************************************************************************

delay2	bcf STATUS,RP0 
		movwf count12
		movlw 0xff
cou12	movwf count22
cou22	decf count22
		nop
		btfss STATUS,Z
		goto cou22
		decf count12
		btfss STATUS,Z
		goto cou12
		return

;*******************************************************************************
;	 време закъснение 326.5ms до 83.25s при 1us цикъл (326.5ms * W = Delay)
;*******************************************************************************

delay3	bcf STATUS,RP0 
		movwf count13
cou13	movlw 0xff
		movwf count33
cou23	movlw 0xff
		movwf count23
cou33	decf count23
		nop
		btfss STATUS,Z
		goto cou33
		decf count33
		btfss STATUS,Z
		goto cou23
		decf count13
		btfss STATUS,Z
		goto cou13
		return

;***********************************************************
; проверка на BF-флага за заетост на LCD
;***********************************************************

busy	bsf STATUS,RP0
		movlw 0xff
		movwf TRISB
		bcf STATUS,RP0
		bcf RS
		bsf RW
		nop ; 1us закъснение
		bsf E
		nop ; 3us закъснение
		nop
		nop
		btfss PORTB,7
		goto goo
		bcf E
		goto busy
goo		bcf E
		bcf RW
		bsf STATUS,RP0
		movlw 0x00
		movwf TRISB
		bcf STATUS,RP0
		return

;**********************************************************
;         подпрограма за изпращане на символи към LCD
;**********************************************************

sendch	bcf STATUS,RP0
		movwf PORTB
		bsf RS
		bcf RW
		movlw 0x05
		call delay1
		Estrobe
		return

;**********************************************************
;        подпрограма за изпращане на инструкций към LCD
;**********************************************************

sendins	bcf STATUS,RP0
		movwf PORTB
		bcf RS
		bcf RW
		movlw 0x05
		call delay1
		Estrobe
		bsf RS
		return
		end ;край на програмата