	LIST      P=16F877            ; LIST DIRECTIVE TO DEFINE PROCESSOR
	#INCLUDE <P16F877.INC>        ; PROCESSOR SPECIFIC VARIABLE DEFINITIONS
	ERRORLEVEL -302
	__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_ENABLE_ON & _LVP_ON & _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		0X030		; LCD SUBROUTINES INTERNAL USE
DELAY           EQU		0X031		; USED IN DELAYXXX ROUTINES
X_DELAY         EQU		0X032		; USED IN X_DELAYXXX ROUTINES

; CTRL PORT BITS
#DEFINE	LCD_E			PORTC,7		; LCD ENABLE CONTROL LINE
#DEFINE	LCD_RW			PORTC,6		; LCD READ/WRITE CONTROL LINE
#DEFINE	LCD_RS  		PORTC,5		; LCD REGISTER-SELECT CONTROL LINE

#DEFINE	LCD_E_TRIS		TRISC,7
#DEFINE	LCD_RW_TRIS		TRISC,6
#DEFINE	LCD_RS_TRIS  	TRISC,5

;******************************************************************************
;******************************************************************************

	ORG 		0X000
	GOTO 		MAIN

	ORG			0X004
	GOTO		GLOBAL_ISR

MAIN
	CALL 		IO_INIT
	CALL 		TIMER1_INIT
	CALL		LCD_INIT
ENDLESS
	GOTO 		ENDLESS ;WAIT FOR INT

;==============================================================================
;INICIALIZALO SZUBRUTINOK------------------------------------------------------
;==============================================================================

;PIC INICIALIZALASA
IO_INIT
	CALL 		PORTA_INIT
	CALL 		PORTB_INIT
	CALL 		PORTC_INIT
	CALL		PORTD_INIT
	CALL		PORTE_INIT
	RETURN

PORTA_INIT
	BANKSEL 	TRISA
	MOVLW		B'00000000'			;PORTA TRIS BITEK (I/O) OOOOOO
	MOVWF 		TRISA
	BANKSEL 	PORTA
	CLRF 		PORTA
	CLRF 		PORTA_TMP
	RETURN
	
PORTB_INIT							;LCD-HEZ
	BSF			OPTION_REG, NOT_RBPU
	BANKSEL 	TRISB
	MOVLW		B'00000000'
	MOVWF		TRISB
	BANKSEL 	PORTB
	CLRF		PORTB
	RETURN

PORTC_INIT							;LCD CONTROL BITEK
	BANKSEL 	TRISC
	MOVLW		B'00000000'
	MOVWF		TRISC
	BANKSEL 	PORTC
	CLRF		PORTC
	BSF			PORTC,0
	RETURN
	
PORTD_INIT
	RETURN
	
PORTE_INIT
	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
	BSF			PORTC,1
	RETURN

;==============================================================================
;LCD VEZÉRLŐ INICIALIZÁSÁLA	
;==============================================================================
	
LCD_INIT
    CALL		LCD_CTRL_CLEAR      ; ALL PORT OUTPUT SHOULD OUTPUT LOW.
;    MOVLW		0X01E				; POWER-UP DELAY
	MOVLW		0X02F
    CALL		X_DELAY500          ; 30 * 0.5MS = 15MS
                                    ; BUSY FLAG SHOULD BE VALID FROM HERE
	MOVLW		0X038               ; 8-BIT-INTERFACE, 2-LINES
    CALL		LCDPUTCMD
    MOVLW		0X000               ; DISP.OFF, CURS.OFF, NO-BLINK
    CALL        LCDDMODE
    CALL        LCDCLEAR
    MOVLW       0X004               ; DISP.ON, CURS.OFF
    CALL        LCDDMODE
    MOVLW       0X002               ; AUTO-INC (SHIFT-CURSOR)
    CALL        LCDEMODE
    BSF			PORTC,2
	RETURN
	
;==============================================================================
;LCD VEZÉRLŐ TÖRLÉS SZUBRUTIN
;==============================================================================
LCD_CTRL_CLEAR
	BCF 		LCD_E
	BCF 		LCD_RW
	BCF 		LCD_RS
	RETURN

;==============================================================================
;LCD PARANCS KIADÁSA
;==============================================================================
LCDPUTCMD
	MOVWF		LCD_TEMP			; Command to be sent is in W
	CALL		LCDBUSY				; Wait for LCD to be ready
	BCF			LCD_RW				; Set LCD in read mode
	BCF			LCD_RS				; Set LCD in command mode
	BSF			LCD_E				; LCD E-line High
	MOVF		LCD_TEMP, W
	MOVWF		LCD_DATA			; Send data to LCD
	BCF			LCD_E				; LCD E-line Low
	RETURN	
	
;==============================================================================
;LCD FOGLALTSÁG ELLENŐRZÉSE
;==============================================================================
	
LCDBUSY
	BANKSEL 	LCD_DATA_TRIS
	MOVLW		0x0FF
	MOVWF		LCD_DATA_TRIS
	BANKSEL		LCD_CTRL
	BCF			LCD_RS				; Set LCD for command mode
	BSF			LCD_RW				; Setup to read busy flag
	BSF			LCD_E				; LCD E-line High
	MOVWF		LCD_DATA			; Read busy flag + DDram address
	BCF			LCD_E				; LCD E-line Low
	ANDLW		0x80				; Check Busy flag, High = Busy
	BTFSS		STATUS, Z
	GOTO		LCDBUSY
LCDNOTBUSY	
	BCF	LCD_RW
	BANKSEL		LCD_DATA_TRIS
	MOVLW		0x000
	MOVWF		LCD_DATA_TRIS		; Set PORTB for output
	BANKSEL		LCD_DATA			; Select Register page 0
	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

;=============================================================================
; LCDCLEAR
; Clears display and returns cursor to home position (upper-left corner).
;
;=============================================================================
LCDCLEAR
	MOVLW		0x001
	CALL		LCDPUTCMD
	RETURN
;=============================================================================
; LCDHOME
; Returns cursor to home position.
; Returns display to original position (when shifted).
;
;=============================================================================
LCDHOME
	MOVLW		0x002
	CALL		LCDPUTCMD
	RETURN
;=============================================================================
; LCDEMODE
; Sets entry mode of display.
; Required entry mode must be set in W
;  b0	: 0 = no display shift	1 = display shift
;  b1	: 0 = auto-decrement	1 = auto-increment
;  b2-7	: don't care
; OK
;=============================================================================
LCDEMODE
	ANDLW		0x003				; Strip upper bits
	IORLW		0x004				; Function set
	CALL		LCDPUTCMD
	RETURN
;=============================================================================
; LCDDMODE
; Sets display control.
; Required display mode must be set in W
;  b0	: 0 = cursor blink off	1 = cursor blink on
;  b1	: 0 = cursor off	1 = cursor on
;  b2	: 0 = display off	1 = display on (display data remains in DDRAM)
;  b3-7	: don't care
; OK
;=============================================================================
LCDDMODE
	ANDLW		0x007				; Strip upper bits
	IORLW		0x008				; Function set
	CALL		LCDPUTCMD
	RETURN
;=============================================================================
; LCDSCGA
; Sets Character-Generator-RAM address. CGRAM is read/written after
;  this setting.
; Required CGRAM address must be set in W
;  b0-5	: required CGRAM address
;  b6-7	: don't care
;
;=============================================================================
LCDSCGA
	ANDLW		0x03F				; Strip upper bits
	IORLW		0x040				; Function set
	CALL		LCDPUTCMD
	RETURN
;=============================================================================
; LCDSDDA
; Sets the Display-Data-RAM address. DDRAM data is read/written after
;  this setting.
; Required DDRAM address must be set in W
;  b0-6	: required DDRAM address
;  b7	: don't care
; OK
;=============================================================================
LCDSDDA
	IORLW		0x080				; Function set
	CALL		LCDPUTCMD
	RETURN

;******************************************************************************
;MÉG NINCS ÁTNÉZVE
;******************************************************************************	
	
;=============================================================================
; LCDGADDR
; Returns address counter contents, used for both DDRAM and CGRAM.
; RAM address is returned in W
;
;=============================================================================
LCDGADDR
	BANKSEL LCD_DATA_TRIS			; Select Register page 1
	MOVLW	0x0FF					; Set PORTB for input
	MOVWF	LCD_DATA_TRIS
	BANKSEL LCD_DATA				; Select Register page 0
	BCF	LCD_RS						; Set LCD for command mode
	BSF	LCD_RW						; Setup to read busy flag
	BSF	LCD_E						; LCD E-line High
	MOVF	LCD_DATA, W				; Read busy flag + RAM address
	BCF	LCD_E						; LCD E-line Low
	ANDLW	0x07F					; Strip upper bit
	BCF	LCD_RW
	BANKSEL LCD_DATA_TRIS
	MOVLW	0x000
	MOVWF	LCD_DATA_TRIS			; Set PORTB for output
	BANKSEL LCD_DATA				; Select Register page 0
	RETURN
;******************************************************************************
;MÉG NINCS ÁTNÉZVE EDDIG
;******************************************************************************	

;=============================================================================
; LCDPUTCHAR
; Sends character to LCD
; Required character must be in W
; OK
;=============================================================================
LCDPUTCHAR
	MOVWF		LCD_TEMP			; Character to be sent is in W
	CALL		LCDBUSY				; Wait for LCD to be ready
	BCF			LCD_RW				; Set LCD in read mode
	BSF			LCD_RS				; Set LCD in data mode
	BSF			LCD_E				; LCD E-line High
	MOVF		LCD_TEMP, W
	MOVWF		LCD_DATA			; Send data to LCD
	BCF			LCD_E				; LCD E-line Low
	RETURN

		
;*****************************************************************************
;*****************************************************************************

;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

;==============================================================================
;TESZT RUTIN
;==============================================================================
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
;******************************************************************************
