; LCD vezérlés
; chriskross ® 2010

	LIST		P=16F819
	#INCLUDE	"P16f819.INC"

	__CONFIG  _XT_OSC & _LVP_OFF & _BODEN_OFF  & _CP_OFF & _WDT_OFF & _PWRTE_OFF

;-----------[NAMING]-----------
; HARDWARE CONNECTION
;	PORTA 0 : LCD_ENABLE
;	PORTA 1 : LCD_REGISTER_SELECT
;	PORTA 2 : LED
;	PORTB 4-7: LCD DATA (DB4-DB7)

#DEFINE	LCD_ENABLE	PORTA,0
#DEFINE	LCD_RS		PORTA,1
#DEFINE	LED			PORTA,2

; VÁLTOZÓK
LCD_DATA 	EQU	PORTB
LCDCMD		EQU	PORTA

S_TIMER1	EQU	0x23
S_TIMER2	EQU	0x24
S_TIMER3	EQU	0x25

	org	0
	GOTO	INIT
;-------[INITIALIZATION]--------

INIT

	clrf	S_TIMER1
	clrf	S_TIMER2
	clrf	S_TIMER3
	BANKSEL TRISA
    CLRF	TRISA   	;PORTA mind kimenet
    CLRF	TRISB   	;PORTB mind kimenet
	BANKSEL PORTB		;BANK0
	clrf	PORTA
	clrf	PORTB

INI_LCD
	call	DELAY_20
	bcf		LCD_ENABLE
	bcf		LCD_RS
	movlw	B'00111000'	;8-bites, két soros, 5×8 pixeles
	call	SEND_COM

	movlw	B'00001111'	;kijelző be, kurzor be, villogtatás be
	call	SEND_COM

	GOTO 	MAIN

MAIN

	movlw	B'01110000'
	call	LCD_PUTCHAR	
	GOTO 	MAIN

;-----[MAIN/SUBROUTIINES]---

SEND_COM				;Parancs küldésének a szubrutinja
	BCF		LCD_RS		;RS=0 --> parancs
	movwf	PORTB		;kód kiküldése a PORT-ra
	bsf		LCD_ENABLE	;az engedélyező bit 1-be állítása
	call	DELAY_100	;vár 100us-t
	bcf		LCD_ENABLE	;engedélyező bit 0-ba
	call	DELAY_2		;vár 2ms-t (nem tudom miért kell)
	return

DELAY_2					;20*100usec=2msec késleltetés
	movlw	.20
	movwf 	S_TIMER2
	call 	DELAY_100
	decfsz	S_TIMER2
	goto	$-2
	return

DELAY_20
	movlw	.10			;10*2ms=20ms késleltetés
	movwf	S_TIMER3
	call	DELAY_2	
	decfsz	S_TIMER3
	goto	$-2
	return

DELAY_100				;100usec késleltetés
	movlw	.165		;20MHz órajel esetén
	movwf	S_TIMER1
	decfsz	S_TIMER1
	goto	$-1
	return

LCD_CMD
	banksel	PORTB
	bcf		LCD_RS
	movwf	PORTB
	bsf		LCD_ENABLE
	nop
	nop
	bcf		LCD_ENABLE
	call	DELAY_20
	RETURN

LCD_PUTCHAR
	banksel	PORTB
	bsf		LCD_RS
	movwf	LCD_DATA
	andlw	b'11110000'
	movwf	PORTB
	bsf		LCD_ENABLE
	nop
	nop
	bcf		LCD_ENABLE
	call	DELAY_20
	swapf	LCD_DATA,w
	andlw	b'11110000'
	movwf	PORTB
	bsf		LCD_ENABLE
	nop
	nop
	bcf		LCD_ENABLE
	call	DELAY_20
	RETURN

	END
