;
;4 bites 2×16 karakteres LCD kezelő 
;A helyes működéshez rendeljünk az alábbi nevekhez
;a bekötésnek megfelelően
;RS, EN, D4, D5, D6, D7
;Az LCD-re kiírni kivánt karaktert az
; "LCD_adat" változóban tároljuk

;Wait macro	mennyit
;	movlw	mennyit
;	call	K0
;	endm

LCD_init
	Wait	.255
	bcf		EN
	bcf 	RS
	bcf		D7
	bcf		D6
	bsf 	D5
	bsf		D4
;*************************** 4 bites módba kapcsolás	
	bsf		EN				;Function set DL=1
	nop
	bcf		EN
	Wait	.5
	bsf		EN				;Function set DL=1
	nop
	bcf		EN
	Wait	.5
	bsf		EN				;Function set DL=1
	nop
	bcf		EN
	Wait	.5
	bcf		D4
	bsf		EN				;Function set DL=0
	nop
	bcf		EN
	Wait	.5
;*************************** 2 soros kijelzésre kapcsolás, felső bájt
	bsf		EN				;Function set N=1
	nop
	bcf		EN
	Wait	.5
;*************************** 2 soros kijelzésre kapcsolás, alsó bájt
	bsf		D7				;Function set N=1
	bcf		D5
	bsf		EN				
	nop
	bcf		EN
	Wait	.5
;************************** Kijelző letiltása, felső bájt
	bcf		D7
	bcf		D4
	bsf		EN				
	nop
	bcf		EN
	Wait	.5
;************************** Kijelző letiltása, alsó bájt
	bsf		D7
	bsf		EN				
	nop
	bcf		EN
	Wait	.5
;************************** Kijelző törlése, felső bájt
	bcf		D7
	bsf		EN				
	nop
	bcf		EN
	Wait	.5
;************************** Kijelző törlése, alsó bájt
	bsf		D4
	bsf		EN				
	nop
	bcf		EN
	Wait	.5
;************************** Kijelző engedélyezése, felső bájt
	bcf		D4
	bsf		EN				
	nop
	bcf		EN
	Wait	.5
;************************** Kijelző engedélyezése, alsó bájt
	bsf		D7
	bsf		D6
	bsf		EN				
	nop
	bcf		EN
	Wait	.5
;*************************
	return
	
LCD_command
	bcf		RS				;RS = 0
	bcf		D7
	bcf		D6
	bcf		D5
	bcf		D4
;************************* felső bájt kiküldése
	btfsc	LCD_adat,7
	bsf		D7
	btfsc	LCD_adat,6
	bsf		D6
	btfsc	LCD_adat,5
	bsf		D5
	btfsc	LCD_adat,4
	bsf		D4
	bsf		EN				
	nop
	bcf		EN
	Wait	.5
	bcf		D7
	bcf		D6
	bcf		D5
	bcf		D4
;************************* alsó bájt kiküldése
	btfsc	LCD_adat,3
	bsf		D7
	btfsc	LCD_adat,2
	bsf		D6
	btfsc	LCD_adat,1
	bsf		D5
	btfsc	LCD_adat,0
	bsf		D4
	bsf		EN				
	nop
	bcf		EN
	Wait	.5
	bcf		D7
	bcf		D6
	bcf		D5
	bcf		D4
	
	return
	
LCD_write
	bsf		RS				;RS = 1
	bcf		D7
	bcf		D6
	bcf		D5
	bcf		D4
;************************* felső bájt kiküldése
	btfsc	LCD_adat,7
	bsf		D7
	btfsc	LCD_adat,6
	bsf		D6
	btfsc	LCD_adat,5
	bsf		D5
	btfsc	LCD_adat,4
	bsf		D4
	bsf		EN				
	nop
	bcf		EN
	Wait	.5
	bcf		D7
	bcf		D6
	bcf		D5
	bcf		D4
;************************* alsó bájt kiküldése
	btfsc	LCD_adat,3
	bsf		D7
	btfsc	LCD_adat,2
	bsf		D6
	btfsc	LCD_adat,1
	bsf		D5
	btfsc	LCD_adat,0
	bsf		D4
	bsf		EN				
	nop
	bcf		EN
	Wait	.5
	bcf		D7
	bcf		D6
	bcf		D5
	bcf		D4
	
	return
	
; Kurzor pozicionálása.
LCD_Line1
     movlw   0x80             ; Az 1. sor 1. oszlopába helyezi a kurzort
	 movwf	 LCD_adat
     call    LCD_command
     return

LCD_Line2
     movlw   0xc0             ; A 2. sor 1. oszlopába helyezi a kurzort
	 movwf	 LCD_adat
     call    LCD_command
     return

LCD_Line1W
     addlw   0x80             ; Az 1. sor W oszlopába helyezi a kurzort
	 movwf	 LCD_adat
     call    LCD_command
     return

LCD_Line2W
     addlw   0xc0             ; A 2. sor W oszlopába helyezi a kurzort
	 movwf	 LCD_adat
     call    LCD_command
     return	

K0
     movwf   count1
K1
     movlw   0xC7             ; A késleltetés 1ms.
     movwf   counta
     movlw   0x01
     movwf   countb
Kesleltet_0
     decfsz  counta,f
     goto    $+2
     decfsz  countb,f
     goto    Kesleltet_0

     decfsz  count1,f
     goto    K1
     retlw   0x00