	LIST      P=16F877              ; LIST DIRECTIVE TO DEFINE PROCESSOR
	#INCLUDE  <P16F877.INC>         ; PROCESSOR SPECIFIC VARIABLE DEFINITIONS
	
	__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_ENABLE_ON & _LVP_OFF & _DEBUG_OFF & _CPD_OFF 

;############################################################################
;    VÁLTOZÓK ÉS KONSTANSOK DEFINIÁLÁSA                                     #
;############################################################################

;MEGSZAKÍTÁSOKHOZ
W_TEMP			EQU		0X20
STATUS_TEMP		EQU 	0X21

;TMR1 MEGSZAKÍTÁSHOZ
#DEFINE TMR1_CNT 		D'3035' 	; KB 500MSEC
PORTA_TMP 		EQU 	0X22

;LCD KEZELÉSHEZ

#DEFINE	LCD_DATA		PORTB		; LCD DATA LINE
#DEFINE LCD_DATA_TRIS	TRISB
#DEFINE	LCD_CTRL		PORTC		; LCD CONTROL LINE
#DEFINE LCD_CTRL_TRIS	TRISC

LCD_TEMP        EQU		0X22		; LCD SUBROUTINES INTERNAL USE
DELAY           EQU		0X23		; USED IN DELAYXXX ROUTINES
X_DELAY         EQU		0X24		; USED IN X_DELAYXXX ROUTINES

; CTRL PORT BITS
#DEFINE	LCD_RS  		PORTC,5		; LCD REGISTER-SELECT CONTROL LINE
#DEFINE	LCD_RW			PORTC,6		; LCD READ/WRITE CONTROL LINE
#DEFINE	LCD_E			PORTC,7		; LCD ENABLE CONTROL LINE

#DEFINE	LCD_RS_TRIS  	TRISC,5
#DEFINE	LCD_RW_TRIS		TRISC,6
#DEFINE	LCD_E_TRIS		TRISC,7

;############################################################################
;      PROGRAM START                                                        #
;############################################################################

	ORG 		0X000
	GOTO 		MAIN

	ORG			0X004
	GOTO		GLOBAL_ISR

MAIN
	CALL 		IO_INIT
	CALL 		TIMER1_INIT
	CALL		LCD_INIT
	CALL		TESZT
ENDLESS
	GOTO 		ENDLESS 			; WAIT FOR INT

;############################################################################
;#   INICIALIZÁLÓ SZUBRUTINOK                                               #
;############################################################################

;============================================================================
;PIC INICIALIZALASA
;============================================================================
IO_INIT
	BANKSEL 	TRISA				; PORTA_INIT
	MOVLW		B'00000000'			; PORTA TRIS BITEK (I/O) OOOOOO
	MOVWF 		TRISA
	BANKSEL 	PORTA
	CLRF 		PORTA
	CLRF 		PORTA_TMP
		
	BSF			OPTION_REG, NOT_RBPU
									; PORTB_INIT LCD-HEZ
	BANKSEL 	TRISB
	MOVLW		B'00000000'
	MOVWF		TRISB
	BANKSEL 	PORTB
	CLRF		PORTB

	BANKSEL 	TRISC				; PORTC_INIT + LCD CONTROL BITEK
	MOVLW		B'00000000'
	MOVWF		TRISC
	BANKSEL 	PORTC
	CLRF		PORTC
									; PORTD_INIT
									; PORTE_INIT

	BANKSEL		PORTC				;###DEBUG###
	BSF			PORTC,0				;###DEBUG###

	RETURN
	
;============================================================================
; TMR1 INICIALIZALASA (4MHZ OSC -> PONTOSAN 500 MSEC)
;============================================================================

TIMER1_INIT
	BCF			INTCON,7
	BCF			INTCON,6	
	BANKSEL 	PIR1
	BCF			PIR1,0				; CLEAR TMR1 INTERRUPT FLAG
	MOVLW		B'00110000' 		; PRESCALER AND TMR1 SETUP,
	MOVWF		T1CON	    		; TMR1 OFF
	MOVLW		HIGH(TMR1_CNT) 		; 500 MILLISECONDS ON 4MHZ
	MOVWF		TMR1H
	MOVLW		LOW(TMR1_CNT)
	MOVWF		TMR1L
	BSF			INTCON,7    		; ENABLE GLOBAL INTERRUPTS
	BSF			INTCON,6    		; ENABLE PERIPHERAL INTERRUPTS
	BANKSEL 	PIE1
	BSF			PIE1,0				; ENABLE TMR1 INTERRUPT
	BANKSEL 	T1CON
	BSF			T1CON,0				; TIMER 1 ON
	BANKSEL		PORTC				;###DEBUG###
	BSF			PORTC,1				;###DEBUG###

	RETURN

;############################################################################
;#   LCD VEZÉRLŐ KEZELÉSE                                                   #
;############################################################################

	
;==============================================================================
;LCD VEZÉRLŐ INICIALIZÁSÁLA	
;==============================================================================
	
LCD_INIT
	BANKSEL		LCD_CTRL
	BCF 		LCD_E
	BCF 		LCD_RW
	BCF 		LCD_RS

	CALL		DELAY50MS			; BUSY FLAG EZ UTÁN OLVASHATÓ
	MOVLW		0X38                ; 8BITES KÉTSOROS
    CALL		LCDPUTCMD
    MOVLW		0X08                ; DISP.OFF, CURS.OFF, BLINK.OFF
    CALL        LCDPUTCMD
    MOVLW		0X01				; LCD TÖRLÉS
	CALL        LCDPUTCMD
    MOVLW       0X0D                ; DISP.ON, CURS.OFF, BLINK.ON
    CALL        LCDPUTCMD
    MOVLW       0X06                ; AUTO-INC (SHIFT-CURSOR)
    CALL        LCDPUTCMD
	BANKSEL		PORTC				;###DEBUG###
	BSF			PORTC,2				;###DEBUG###

    RETURN
	

;==============================================================================
;LCD PARANCS KIADÁSA
;==============================================================================
LCDPUTCMD
	MOVWF		LCD_TEMP
	BANKSEL		PORTC
	BSF			PORTC,3
	CALL		LCDBUSY
	BCF			LCD_RW				; OLVASÁS MÓD
	BCF			LCD_RS				; PARANCS MÓD
	BSF			LCD_E				; TIK
	MOVF		LCD_TEMP, W
	MOVWF		LCD_DATA			; ADATKÜLDÉS
	BCF			LCD_E				; TAK
	RETURN	

;=============================================================================
; LCD KARAKTER KÜLDÉSE
;=============================================================================
LCDPUTCHAR
	MOVWF		LCD_TEMP
	CALL		LCDBUSY
	BCF			LCD_RW				; OLVASÁS MÓD
	BSF			LCD_RS				; ADATÍRÁS MÓD
	BSF			LCD_E				; TIK
	MOVF		LCD_TEMP, W
	MOVWF		LCD_DATA			; ADATKÜLDÉS
	BCF			LCD_E				; TAK
	RETURN
	
;==============================================================================
;LCD FOGLALTSÁG ELLENŐRZÉSE
;==============================================================================
	
LCDBUSY
	BANKSEL 	LCD_DATA_TRIS
	MOVLW		0xFF
	MOVWF		LCD_DATA_TRIS		; PORTB BEMENET
	BANKSEL		LCD_CTRL
LCDBUSYLOOP
	BCF			LCD_RS				; PARANCS MÓD
	BSF			LCD_RW				; OLVASÁS MÓD
	BSF			LCD_E				; TIK
	NOP								; 1uS
	MOVF		LCD_DATA , W		; BEOLVAS W-BE
	BCF			LCD_E				; TAK
	ANDLW		0x80				; BUSY FLAG ELLENŐRZÉSE
	BTFSS		STATUS, Z
	GOTO		LCDBUSYLOOP			; HA BUSY KEZDI UJRA
	BCF			LCD_RW
	BANKSEL		LCD_DATA_TRIS
	CLRF		LCD_DATA_TRIS		; PORTB KIMENET
	BANKSEL		LCD_DATA
	RETURN

;=============================================================================
; LCD SPECIÁLIS PARANCSOK
;=============================================================================
; LCD TÖRLÉS
;=============================================================================
LCDCLEAR
	MOVLW		0x001
	CALL		LCDPUTCMD
	RETURN
	
;=============================================================================
; LCD HOME
;=============================================================================
LCDHOME
	MOVLW		0x002
	CALL		LCDPUTCMD
	RETURN
	
;=============================================================================
; LCD AKTUÁLIS CÍM W-BE
;=============================================================================
LCDGADDR
	BANKSEL 	LCD_DATA_TRIS		
	MOVLW		0x0FF				; PORTB BEMENET
	MOVWF		LCD_DATA_TRIS
	BANKSEL 	LCD_DATA
	BCF			LCD_RS				; PARANCS MÓD
	BSF			LCD_RW				; OLVASÁS MÓD
	BSF			LCD_E				; TIK
	MOVF		LCD_DATA, W			; CÍM BEOLVASÁSA
	BCF			LCD_E				; TAK
	ANDLW		0x07F				; BUSY FLAG LEVÁGÁSA
	BCF			LCD_RW
	BANKSEL 	LCD_DATA_TRIS
	CLRF		LCD_DATA_TRIS		; PORTB KIMENET
	BANKSEL 	LCD_DATA
	RETURN
	
;==============================================================================
;LCD DELAY SZUBRUTINJA
;==============================================================================

DELAY500	
	MOVLW		D'165'
	MOVF		DELAY, W
DELAY500_LOOP	
	DECFSZ		DELAY, F
	GOTO		DELAY500_LOOP
DELAY500_END	
	RETURN
;
X_DELAY500	
	MOVWF		X_DELAY
X_DELAY500_LOOP	
	CALL		DELAY500
	DECFSZ		X_DELAY, F
	GOTO		X_DELAY500_LOOP
X_DELAY500_END	
	RETURN
	
DELAY50MS
	MOVLW		D'100'				; POWER-UP DELAY
    CALL		X_DELAY500          ; 40 * 0.5MS = 20MS
	RETURN


;############################################################################
;#   MEGSZAKÍTÁS KEZELÉS                                                    #
;############################################################################

;==============================================================================
;INTERRUPT HANDLER
;==============================================================================

GLOBAL_ISR
	MOVWF   	W_TEMP          	; SAVE OFF CURRENT W REGISTER CONTENTS
	MOVF		STATUS,W         	; MOVE STATUS REGISTER INTO W REGISTER
	MOVWF		STATUS_TEMP      	; SAVE OFF CONTENTS OF STATUS REGISTER

	BTFSC 		PIR1,0				; HA A MEGSZAKITAS TIMER1 GENERALTA
	CALL 		TIMER1_ISR
	
	MOVF    	STATUS_TEMP,W     	; RETRIEVE COPY OF STATUS REGISTER
	MOVWF		STATUS            	; RESTORE PRE-ISR STATUS REGISTER CONTENTS
	SWAPF   	W_TEMP,F
	SWAPF   	W_TEMP,W          	; RESTORE PRE-ISR W REGISTER CONTENTS
	RETFIE                    		; RETURN FROM INTERRUPT

;==============================================================================
;INERRUPT SZUBRUTINOK
;==============================================================================
;TMR1 SZUBRUTIN
;==============================================================================

TIMER1_ISR
	BANKSEL 	T1CON
	BCF			T1CON,0				; TIMER 1 OFF
	BANKSEL 	PIR1
	BCF			PIR1,0				; CLEAR TMR1 INTERRUPT FLAG
	MOVLW		HIGH(TMR1_CNT) 		; 500 MILLISECONDS ON 4MHZ
	MOVWF		TMR1H
	MOVLW		LOW(TMR1_CNT)
	MOVWF		TMR1L
	BANKSEL 	T1CON
	BSF			T1CON,0				; TIMER 1 ON
	BANKSEL 	PORTA
	BTFSC 		PORTA_TMP,0
	GOTO 		CLEAR
	GOTO 		SETHIGH
CLEAR
	BCF 		PORTA,0
	BCF 		PORTA_TMP,0
	RETURN
SETHIGH
	BSF 		PORTA,0
	BSF 		PORTA_TMP,0
	RETURN

;############################################################################
;#   TESZTELÉS                                                              #
;############################################################################

TESZT
	CALL LCD_TESZT
	RETURN

;LCD TESZT

LCD_TESZT
	CALL		LCDCLEAR
	CALL		LCDHOME
	MOVLW 		'H'
	CALL		LCDPUTCHAR
	MOVLW 		'e'
	CALL		LCDPUTCHAR
	MOVLW 		'l'
	CALL		LCDPUTCHAR
	MOVLW 		'l'
	CALL		LCDPUTCHAR
	MOVLW 		'o'
	CALL		LCDPUTCHAR
	MOVLW 		'!'
	CALL		LCDPUTCHAR
	RETURN

;############################################################################
;    VÉGE
;############################################################################
	END
;******************************************************************************
