	#include	p18f452.inc

	processor	18f452
	radix	dec
	list	f=INHX32
	config	OSCS=ON
	config	OSC=HS

	CBLOCK 0x30
		Timer1
		Timer2
		Counter
		Leds
	ENDC

RS	equ 0				;0=parancs mód	1=adat regiszter válsztás
RW	equ 1				;0=write  		1=read
EN	equ 2				;0=LCD tiltás	1=LCD engedélyezés

;------------------------------------------------------------------------------------------
RES_V	org 0x00
		nop
		bra Main
		
HI_INT	org 0x08
		bra high_int			
LO_INT	org 0x18
		bra	low_int
		
;-------------------------------------------------------------------------------------------
high_int
		negf	Leds
		movff	Leds, LATD
		movf	PORTB, W
		bcf		INTCON, RBIF
		retfie

low_int
		retfie			
;-------------------------------------------------------------------------------------------
Main
		
		movlw	0
		movwf	Leds	
;Gombok konfigurálása		
		bcf		RCON, IPEN			;INT prioritás tiltva
		movlw	B'00001000'			;portB megszakításai enged
		movwf	INTCON
		movlw	B'01110001'			;belső felhúzóellenállások bekapcs (aktív low), portB INT-ek High pr.
		movwf	INTCON2
		movlw	B'00110000'
		clrf	INTCON3				;külső megszakítások tiltva			
		movwf	TRISB				;RB5-RB4 bemenet, RB3-RB0 kimenet lesz
		bsf		TRISA, 3			;RA3, RA5 bemenet
		bsf		TRISA, 5
		movlw	B'00001110'			;RA3 és RA5 is digitális jelszintű
		movwf	ADCON1
		movlw	B'11110111'			;Alsó gombsorral kiküldünk low-t, és inicializáljuk high-ra a többit
		movwf	LATB
					
;LCD lábak konfigurálása
		clrf	TRISD
		clrf	LATD
		clrf	TRISE
		clrf	LATE
		bcf		LATE,RS				;parancs módb váltás
		movlw	B'00111000'			;8 bites interface, 2 sor 5x8-as karakterek
		rcall	write
		rcall	delay2ms			;Busy flag figyelés helyett
		movlw	B'00000110'			;increment mode
		rcall	write
		movlw	B'00001101'			;LCD=on, kurzor=off, villogás=off
		rcall	write
		movlw	B'00010000'			;moves cursor, shift display without DDRAM content change
		rcall	write
		movlw	B'00000001'			;képernyőtörlés, kurzor 0-ba áll
		rcall	write
		rcall	delay10ms			;2ms késleltetés
	
;--------------------------------------------------------------------------------------------
;adatküldés LCD-re
		clrf	TBLPTRU
		movlw	HIGH LCD_TABLAZAT
		movwf	TBLPTRH
		movlw	LOW LCD_TABLAZAT
		movwf	TBLPTRL

		movlw	16
		movwf	Counter
		movlw	128					;LCD cím 0
		rcall	write
		bsf		LATE, RS			;adat jön
elso_sor
		tblrd*+
		movf	TABLAT, W
		rcall	write
		decfsz	Counter, F
		bra		elso_sor

		movlw	16
		movwf	Counter
		bcf		LATE,RS				;parancs mód
		movlw	192		
		rcall	write
		bsf		LATE,RS				;adat mód
masodik_sor
		tblrd*+
		movf	TABLAT, W
		rcall	write
		decfsz	Counter, F
		bra		masodik_sor

		bsf		INTCON, 7			;megszakítások engedélyezve
		bra		stop
;--------------------------------------------------------------------------------------------
write
		movwf	LATD				;parancs kiküldés
		bsf		LATE, EN			;LCD be
		rcall	delay100			;100us kéleltetés
		bcf		LATE, EN
		return
;--------------------------------------------------------------------------------------------
delay100
		movlw	165					;(100.000-800)/(200+400)=165
		movwf	Timer1
loop	decfsz	Timer1, F
		bra		loop
		return
;-------------------------------------------------------------------------------------------
delay2ms
		movlw	20
		movwf	Timer2
loop2	rcall	delay100
		decfsz	Timer2
		bra		loop2
		return
;-------------------------------------------------------------------------------------------
delay10ms
		movlw	100
		movwf	Timer2
loop3	rcall	delay100
		decfsz	Timer2
		bra		loop3
		return
;-------------------------------------------------------------------------------------------
LCD_TABLAZAT
	db	"Lozsadi                   Attila"
;-------------------------------------------------------------------------------------------	
stop	bra	stop

	END




