;*************************************************************
;                          
;*************************************************************
;Program: PIC16F877
;OSC	: 4MHz
;ASM	: MPASM
;=============================================================
;                      PROCESSOR TIPUSMEGADÁSA
;==============================================================================
 LIST P=PIC16F877
 #INCLUDE "P16F877.INC" 
 errorlevel -302 ;BANKHIBAJELZÉS ELNYOMÁSA A FORDÍTÓBAN 
 errorlevel -305 ; 

;KONFIGURÁCIÓS SZÓ
 __CONFIG _CP_OFF & _XT_OSC & _PWRTE_ON  & _WDT_OFF & _BODEN_ON & _LVP_OFF & _DEBUG_OFF & _WRT_ENABLE_ON & _CPD_OFF
;==============================================================================
;==============================================================================



;==============================================================================
;                      VÁLTOZÓK DEKLARÁLÁSA
;==============================================================================
LCD_DATA_PORT	EQU	PORTD	;LCD adatbusz portja
LCD_CTRL_PORT	EQU	PORTB	;LCD kontroll portja (RS,RW,E)
LCD_DATA_TRIS	EQU	TRISD
LCD_CTRL_TRIS	EQU	TRISB
LCD_DATA_BUS	EQU	8		;Adatbusz szélesség (4 vagy 8 bit)
LCD_DATA_BIT	EQU	0		;Adatbusz kezdőbitje (0 vagy 4)
LCD_RS			EQU	0		;Vonal bitszáma	
LCD_RW			EQU	1
LCD_E			EQU	2

 CBLOCK 0x20 			;ITT KEZDŐDIK A MEMÓRIA
	LCD_tmp
 	LCD_tris_tmp
	LCD_sor_tmp
	LCD_oszlop_tmp
	DELAYTMP_0
	DELAYTMP_1
	DELAYTMP_2
 ENDC
;==============================================================================

 ORG	0 
 GOTO program
;==============================================================================
program
	CLRF	PORTA
	CLRF	PORTB
	CLRF	PORTC
	CLRF	PORTD
	CLRF	PORTE

	BANKSEL ADCON1			;Komparátorok kikapcsolása
	MOVLW	b'00000110'
	MOVWF	ADCON1
;------------------------------------------------------------------------------
	MOVLW	b'00000000'		;Portok beállítása 1=bemenet,0=kimenet
	MOVWF	TRISA
	MOVLW	b'00000000'
	MOVWF	TRISB
	MOVLW	b'00000000'
	MOVWF	TRISC
	MOVLW	b'00000000'
	MOVWF	TRISD
	MOVLW	b'00000000'
	MOVWF	TRISE
 	BANKSEL PORTA	
;------------------------------------------------------------------------------
;AZ LCD PORTOKAT ÁLLÍTJA BE, MÁS BEÁLLÍTÁST NEM MÓDOSÍT
	BANKSEL LCD_DATA_TRIS	
		MOVLW	b'00000000'
		MOVWF	LCD_DATA_TRIS
		BCF		LCD_CTRL_TRIS,LCD_RS
		BCF		LCD_CTRL_TRIS,LCD_RW
		BCF		LCD_CTRL_TRIS,LCD_E
 	BANKSEL LCD_DATA_PORT	
;------------------------------------------------------------------------------
	CALL	LCD_init 
	MOVLW	'T'
	CALL	LCD_char
	MOVLW	'E'
	CALL	LCD_char
	MOVLW	'S'
	CALL	LCD_char
	MOVLW	'Z'
	CALL	LCD_char
	MOVLW	'T'
	CALL	LCD_char
	MOVLW	D'0'
	CALL	LCD_sor
	MOVLW	D'10'
	CALL	LCD_oszlop
	MOVLW	'A'
	CALL	LCD_char
ide
	GOTO	ide
;------------------------------------------------------------------------------
LCD_init
	MOVLW	D'60'
	CALL 	LCD_delay_10_msec	;30 ms várakozás
 	MOVLW   b'00111000'         ; 8-bit-interface, 2-lines
	CALL	LCD_command
	MOVLW	D'12'
	CALL 	LCD_delay_100_usec	;41 us várakozás
 	MOVLW   b'00001111'         ; display-on,cursor-on,blink-on
	CALL	LCD_command
	MOVLW	D'12'
	CALL 	LCD_delay_100_usec	;41 us várakozás
 	MOVLW   b'00000001'         ; display clear
	CALL	LCD_command
	MOVLW	D'3'
	CALL 	LCD_delay_10_msec	;1.53 ms várakozás
 	MOVLW   b'00000111'         ; 
	CALL	LCD_command
	MOVLW	D'60'
	CALL 	LCD_delay_10_msec	;30 ms várakozás
	RETURN
;------------------------------------------------------------------------------
LCD_busy
	BANKSEL	LCD_DATA_TRIS
	MOVFW	LCD_DATA_TRIS	;tris elmentése
	BANKSEL	LCD_DATA_PORT
	MOVWF	LCD_tris_tmp
	MOVLW	b'11111111'		;uj tris beállítás
	BANKSEL	LCD_DATA_TRIS
	MOVWF	LCD_DATA_TRIS
	BANKSEL	LCD_DATA_PORT
	BSF		LCD_CTRL_PORT,LCD_RW
	BSF		LCD_DATA_PORT,LCD_E
	MOVF	LCD_DATA_PORT,W	;port beolvasas
	BCF		LCD_DATA_PORT,LCD_E
	ANDLW   0x80            ; Check Busy flag, High = Busy
 	BTFSS   STATUS,Z
	GOTO 	LCD_busy
	BCF		LCD_CTRL_PORT,LCD_RW
	MOVFW	LCD_tris_tmp	;tris visszaállítás
	BANKSEL	LCD_DATA_TRIS
	MOVWF	LCD_DATA_TRIS
	BANKSEL	LCD_DATA_PORT
	RETURN
;------------------------------------------------------------------------------
LCD_command
	MOVWF	LCD_tmp
	CALL 	LCD_busy
	MOVF	LCD_tmp,W
	MOVWF	LCD_DATA_PORT	
	CALL	LCD_pulse
 	RETURN
;------------------------------------------------------------------------------
LCD_char
	BSF		LCD_CTRL_PORT,LCD_RS
	MOVWF	LCD_tmp
	CALL 	LCD_busy
	MOVFW	LCD_tmp
	MOVWF	LCD_DATA_PORT	
	CALL	LCD_pulse
	BCF		LCD_CTRL_PORT,LCD_RS
	RETURN	
;------------------------------------------------------------------------------
LCD_pulse
	BSF		LCD_CTRL_PORT,LCD_E
	NOP
	NOP
	BCF		LCD_CTRL_PORT,LCD_E
	RETURN
;------------------------------------------------------------------------------
LCD_sor
	MOVWF	LCD_sor_tmp
	BTFSS	LCD_sor_tmp,0	;ha 1 akkor a második sorra megy
	GOTO	elso_sor
	MOVLW	0x40
	GOTO	sorvaltas
elso_sor
	MOVLW	0x00
sorvaltas
	IORLW   0x80
	CALL	LCD_command
	RETURN
;------------------------------------------------------------------------------
LCD_oszlop			;
	MOVWF	LCD_oszlop_tmp
	BTFSS	LCD_sor_tmp,0	;ha 1 akkor a második sorra megy
	GOTO	elso_sor_o
	MOVLW	0x3F
	ADDWF	LCD_oszlop_tmp,0
	GOTO	sorvaltas_o
elso_sor_o
	MOVLW	0x00
	ADDWF	LCD_oszlop_tmp,0
	CALL	sorvaltas
sorvaltas_o
	IORLW   0x80
	CALL	LCD_command
	RETURN
;------------------------------------------------------------------------------
; Késleltető rutinok
;	LCD_delay_300_msec
;	LCD_delay_100_msec
;	LCD_delay_10_msec	Ennek külső értéket kell megadni
;	LCD_delay_500_usec
;	LCD_delay_100_usec	Ennek külső értéket kell megadni
;------------------------------------------------------------------------------
LCD_delay_300_msec 
	MOVLW	D'25'	;
	MOVWF	DELAYTMP_2
	CALL	LCD_delay_100_msec
	DECFSZ	DELAYTMP_2,F
	GOTO	$-2
	RETURN

LCD_delay_100_msec 
	NOP
	NOP
	MOVLW	D'195'					
LCD_delay_10_msec					;20 -as értékkel
	MOVWF	DELAYTMP_1
	CALL	LCD_delay_500_usec
	NOP
	NOP
	DECFSZ	DELAYTMP_1,F
	GOTO	$-4
	RETURN
	
LCD_delay_500_usec
	MOVLW	D'165'
	NOP
	NOP
	NOP
LCD_delay_100_usec					;33 -as értékkel
	MOVWF	DELAYTMP_0
	NOP
	DECFSZ	DELAYTMP_0,F
	GOTO	$-1
	RETURN
;------------------------------------------------------------------------------
 END