list p=16f877          			;PIC definiálása
#include <p16f877.inc> 			;segédfálj definiálása 
	cblock 0x20    			;általános regiszterek "nevesítése"
	oral,orah,percl,perch,timl,timh,
	timm,tempW,temptimh,temptimm,
	temptiml,temprx, picstat,orabin,
	percbin,mpercbin,tempW2,tempbcd,
	temp2,bekapcsaO,bekapcsbO,bekapcscO,
	kikapcsaO,kikapcsbO,kikapcscO,
	bekapcsaP,bekapcsbP,bekapcscP,
	kikapcsaP,kikapcsbP,kikapcscP
	endc
	
	org	0x00			;program kezdete a 00H című memória rekeszbe
	nop				;erre a NOP-ra az ICD miatt van szükség
	goto	init			;ugrás inicializációra
	org	0x04			;megszakításvektor
;------------------------IT rutin------------------------------
itrutin					;megszakítás kezelése
	movwf	tempW			;Aku mentése
	movf	timl,w			;timl mentése
	movwf	temptiml		
	movf	timm,w			;timm mentése
	movwf	temptimm
	movf	timh,w			;timh mentése
	movwf	temptimh		

	banksel	intcon			;bankváltás
	bcf	intcon,7		;újabb megszakítás tiltása míg előzőt feldolgozzuk.
	banksel	porta			;bankváltás

	banksel	pir1			;bankváltás
	btfsc	pir1,0			;az időzítő váltott ki megszakítást ?
	call	oravalt			;akkor oravalt subrutin meghívása

	btfsc	pir1,5			;a soros porton adat érkezett ?
	call	sor_rx			;akkor sor_rx subrutin meghívása
		

	banksel	intcon			;újabb megszakítás engedélyezése
	bsf	intcon,7
	banksel	porta
	
	movf	temptiml,w		;elmentett változók visszaírása
	movwf	timl
	movf	temptimm,w
	movwf	timm
	movf	temptimh,w
	movwf	timh
	movf	tempW,W
	retfie				;visszatérés megszakításból
;---------------------Inicializálás----------------------------
init	
	banksel	trisa			;bankváltás
	clrf	trisa			;A, B, D portok kimenetbe állítása
	clrf	trisd
	clrf	trisb
	banksel	porta			;bankváltás
	clrf	porta			;A, B, D kimenetek 0-ba állítása
	clrf	portb
	clrf	portd
	clrf	picstat			;PIC státusz regiszter 0-ba állítása.
	clrf	mpercbin		;ora bináris számlálói 0-ba állítása.
	clrf	percbin			
	clrf	orabin
	banksel	pie1			;bankváltás
	movlw	b'00100001'		;usart vétel és tmr1 megszakítás engedélyezése
	movwf	pie1
	banksel	intcon			;bankváltás
	movlw	b'11000000'		;Periféria és global IT engedélyezése
	movwf	intcon
	banksel	t1con			;tmr0 beállítása
	movlw	b'00001111'		;indít, 8-as előosztó, külső kristály
	movwf	t1con
	
	banksel	spbrg
	movlw	d'129'
	movwf	spbrg
	banksel	txsta			;usart beállítása
	movlw	b'00100110'	
	movwf	txsta
	banksel	rcsta
	movlw	b'10011000'
	movwf	rcsta
	
	movlw	0xFF			;kijelző teszt
	movwf	portd			;8-as kiírása
	movlw	0x02			;első digit engedélyezés
	movwf	porta
	call	var
	call	var
	call	var
	movlw	0x04			;második digit
	movwf	porta
	call	var
	call	var
	call	var
	movlw	0x20			;harmadik digi
	movwf	porta
	call	var
	call	var
	call	var
	movlw	0x08			;negyedik digit
	movwf	porta
	call	var
	call	var
	call	var
	clrf	portd
	clrf	porta
	
	movlw	0xE9			;2005 felirat kiírása
	movwf	oraH
	movlw	0x6F
	movwf	oraL
	movlw	0x6F
	movwf	percH
	movlw	0xF6
	movwf	percL
	movlw	0x0A
	movwf	picstat
	movlw	0xFF
	movwf	bekapcsaO		;Hardwarese időzített be/kikapcsolások
	movwf	bekapcsaP		;tiltása
	movwf	bekapcsbO
	movwf	bekapcsbP
	movwf	bekapcscO
	movwf	bekapcscP
	movwf	kikapcsaO
	movwf	kikapcsaP
	movwf	kikapcsbO
	movwf	kikapcsbP
	movwf	kikapcscO
	movwf	kikapcscP
;------------------------Fő hurok/program----------------------
mainprg					;hurok eleje
	clrf	porta			;A kimeneti port törlése
	clrf	portd			;D kimeneti port törlése
	btfss	picstat,1		;Ha kijelző nincs a engedélyezve újra hurok eleje
	goto	mainprg
	
	btfsc	picstat,0		;ha engedve óra engedélyezve van meghívja a bináris - 7szegmense
	call	binto7seg		;átalakító rutint.
	
	movlw	0x02			;első digit kiírása
	movwf	porta
	movf	oraH,w
	movwf	portd
	call	rvar			;várakozás, hogy ne folyanak össze a digitek
	
	movlw	0x04			;második digit
	movwf	porta
	movf	oraL,w
	movwf	portd
	call	rvar			;várakozás

	btfsc	picstat,3		;ha a LEDEK szinkronizálása engedélyezve van
	call	checkleds		;meghívja a szinkronizáló rutint.

	movlw	0x20			;harmadik digit
	movwf	porta
	movf	percH,w
	movwf	portd
	call	rvar			;várakozás

	movlw	0x08			;negyedik digit
	movwf	porta
	movf	percL,w
	movwf	portd
	call	rvar			;várakozás
	

	goto	mainprg			;vissza hurok elejére
;----------Subrutinok / LED szinkron---------------------------
checkleds				;ledeket szinkronizáló rutin
	btfsc	portb,5			;A kapcsoló kikapcsolva ?
	bsf	portb,2			;akkor A LED kikapcsol
	btfsc	portb,4			;B kapcsoló kikapcsolva ?
	bsf	portb,1			;akkor B LED kikapcsol
	btfsc	portb,3			;C kapcsoló kikapcsolba ?
	bsf	portb,0			;akkor C LED kikapcsol

	btfss	portb,5			;A kapcsoló bekapcsolva ?
	bcf	portb,2			;akkor A LED bekapcsol
	btfss	portb,4			;B kapcsoló bekapcsolva ?
	bcf	portb,1			;akkor B LED bekapcsol
	btfss	portb,3			;C kapcsoló bekapcsolva ?
	bcf	portb,0			;akkor C LED bekapcsol
	return				;visszatérés
;---------------Soros adat kiküldése---------------------------
ki_soros				;soros adat küldése W-ből (Aku)

	banksel	PIR1
	btfss	PIR1,4			;Várakozás amíg az előző adat kiér a bufferből	
	goto	ki_soros
	movwf	TXREG			;új adat kiküldése
	
	return				;visszatérés
;-----------------------Várakozó rutin 626ms-------------------
var	movlw	0x04			;várakozunk, várakozunk 
	movwf	TIMH			;626ms!
ide3	movlw	0xff		
	movwf	TIMM		
ide2	movlw	0xff		
	movwf	TIML		
ide	nop			
	decfsz	TIML		
	goto	ide		
	decfsz	TIMM		
	goto	ide2		
	decfsz	TIMH		
	goto	ide3		
	return		
;------------------------rövidebb várakozó rutin---------------
rvar	movlw	0x04			;várakozunk, várakozunk 
	movwf	TIMH		
ride3	movlw	0x0f		
	movwf	TIMM		
ride2	movlw	0x0f		
	movwf	TIML		
ride	nop			
	decfsz	TIML		
	goto	ride		
	decfsz	TIMM		
	goto	ride2		
	decfsz	TIMH		
	goto	ride3		
	return		
;--------------------Soros utasítások fogadása-----------------
sor_rx	
	banksel	pir1			;bankváltás
	bcf	pir1,5			;vett adat átvéve buffer üres, jöhet újabb
	movf	rcreg,w
	movwf	temprx			;temprx-be másoljuk a vett adatot.
	sublw	d'65'			; ha vett adat 65
	btfsc	status,z		; meghívjuk a SETORAH subrutint
	call	setoraH
	
	movf	temprx,w
	sublw	d'66'			;ha vett adat 66
	btfsc	status,z		;meghívjuk a SETORAL subrutint
	call	setoraL

	movf	temprx,w
	sublw	d'68'			;ha vett adat 68
	btfsc	status,z		;meghívjuk a SETPERCL subrutint
	call	setpercL

	movf	temprx,w
	sublw	d'67'			;ha vett adat 67
	btfsc	status,z		;meghívjuk a SETPERCH subrutint
	call	setpercH

	banksel	portb
	movf	temprx,w
	sublw	d'73'			;ha vett adat 67
	btfsc	status,z		;A LED felkapcsolása
	bsf	portb,0			

	movf	temprx,w
	sublw	d'74'			;ha vett adat 74
	btfsc	status,z		;A LED lekapcsolása
	bcf	portb,0

	movf	temprx,w
	sublw	d'71'			;ha vett adat 71
	btfsc	status,z		;B LED felkapcsolása
	bsf	portb,1

	movf	temprx,w
	sublw	d'72'			;ha vett adat 72
	btfsc	status,z		;B LED lekapcsolása
	bcf	portb,1

	movf	temprx,w
	sublw	d'69'			;ha vett adat 69
	btfsc	status,z		;C LED felkapcsolása
	bsf	portb,2

	movf	temprx,w
	sublw	d'70'			;ha vett adat 70
	btfsc	status,z		;C LED lekapcsolása
	bcf	portb,2

	movf	temprx,w
	sublw	d'75'			;ha vett adat 75
	btfsc	status,z		;C kapcsoló bekapcsolása
	bsf	portb,5

	movf	temprx,w
	sublw	d'76'			;ha vett adat 76
	btfsc	status,z		;C kapcsoló kikapcsolása
	bcf	portb,5

	movf	temprx,w
	sublw	d'77'			;ha vett adat 77
	btfsc	status,z		;B kapcsoló bekapcsolása
	bsf	portb,4

	movf	temprx,w
	sublw	d'78'			;ha vett adat 78
	btfsc	status,z		;B kapcsoló kikapcsolása
	bcf	portb,4

	movf	temprx,w
	sublw	d'79'			;ha vett adat 79
	btfsc	status,z		;A kapcsoló bekapcsolása
	bsf	portb,3

	movf	temprx,w
	sublw	d'80'			;ha vett adat 80
	btfsc	status,z		;A kapcsoló kikapcsolása
	bcf	portb,3

	movf	temprx,w
	sublw	d'81'			;ha vett adat 81
	btfsc	status,z		;meghívja a statwr subrutint
	call	statwr

	movf	temprx,w
	sublw	d'82'			;ha vett adat 82
	btfsc	status,z		;meghívja orabeall subrutint
	call	orabeall

	movf	temprx,w
	sublw	d'83'			;ha vett adat 83
	btfsc	status,z		;meghívja beASET subrutint
	call	beASET

	movf	temprx,w
	sublw	d'84'			;ha vett adat 84
	btfsc	status,z		;meghívja beBSET subrutint
	call	beBSET

	movf	temprx,w
	sublw	d'85'			;ha vett adat 85
	btfsc	status,z		;meghívja beCSET subrutint
	call	beCSET

	movf	temprx,w
	sublw	d'86'			;ha vett adat 86
	btfsc	status,z		;meghívja kiASET subrutint
	call	kiASET

	movf	temprx,w
	sublw	d'87'			;ha vett adat 87
	btfsc	status,z		;meghívja kiBSET subrutint
	call	kiBSET

	movf	temprx,w
	sublw	d'88'			;ha vett adat 88
	btfsc	status,z		;meghívja kiCSET subrutint
	call	kiCSET

	movf	temprx,w
	sublw	d'90'			;ha vett adat 90
	btfsc	status,z		;meghívja orakuld subrutint
	call	orakuld

	movf	temprx,w
	sublw	d'91'
	btfsc	status,z		;ha vett adat 91
	call	kapcskuld		;meghívja kapcskuld subrutint
	
	movf	temprx,w
	sublw	d'92'			;ha vett adat 92
	btfsc	status,z		;meghívja kapcsidokuld subrutint
	call	kapcsidokuld

	movf	temprx,w
	sublw	d'93'			;ha vett adat 93
	btfsc	status,z		;meghívja ledstatekuld subrutint
	call	ledstatekuld

	movf	temprx,w
	sublw	d'94'			;ha vett adat 94
	btfsc	status,z
	call	picstatkuld		;meghívja picstatkuld subrutint

	return				;visszatérés

picstatkuld				;elküldi PIC status regisztert.
	movf	picstat,w		;picstat akuba...
	call	ki_soros		;a tényleges küldés		
	return

ledstatekuld				;Ledek állapotát elküldi
	movf	oraH,w
	call	ki_soros
	movf	oraL,w
	call	ki_soros
	movf	percH,w
	call	ki_soros
	movf	percL,w
	call	ki_soros
	clrf	temp2
	btfss	portb,2
	bcf	temp2,0
	btfsc	portb,2
	bsf	temp2,0
	btfss	portb,1
	bcf	temp2,1
	btfsc	portb,1
	bsf	temp2,1
	btfss	portb,0
	bcf	temp2,2
	btfsc	portb,0
	bsf	temp2,2
	movf	temp2,w
	call	ki_soros
	return

kapcsidokuld				;hardware-es időzítés visszaküldése
	movf	bekapcsaO,w
	call	ki_soros
	movf	bekapcsaP,w
	call	ki_soros
	movf	kikapcsaO,w
	call	ki_soros
	movf	kikapcsaP,w
	call	ki_soros
	
	movf	bekapcsbO,w
	call	ki_soros
	movf	bekapcsbP,w
	call	ki_soros
	movf	kikapcsbO,w
	call	ki_soros
	movf	kikapcsbP,w
	call	ki_soros

	movf	bekapcscO,w
	call	ki_soros
	movf	bekapcscP,w
	call	ki_soros
	movf	kikapcscO,w
	call	ki_soros
	movf	kikapcscP,w
	call	ki_soros
	return

kapcskuld				;kapcsolók állapotának visszaküldése
	clrf	temp2
	btfss	portb,5
	bcf	temp2,0
	btfsc	portb,5
	bsf	temp2,0
	btfss	portb,4
	bcf	temp2,1
	btfsc	portb,4
	bsf	temp2,1
	btfss	portb,3
	bcf	temp2,2
	btfsc	portb,3
	bsf	temp2,2
	movf	temp2,w
	call	ki_soros
	return

orakuld					;óra visszaküldése
	movf	orabin,w
	call	ki_soros
	movf	percbin,w
	call	ki_soros
	movf	mpercbin,w
	call	ki_soros
	return
kiCSET					;C kapcsoló kikapcsolásának időpontjának beírása
	banksel	pir1
	btfss	pir1,5
	goto	kiCSET
	movf	rcreg,w
	movwf	kikapcscO
	btfss	pir1,5
	goto	$-1
	movf	rcreg,w
	movwf	kikapcscP

	return

kiBSET					;B kapcsoló kikapcsolásának időpontjának beírása
	banksel	pir1
	btfss	pir1,5
	goto	kiBSET
	movf	rcreg,w
	movwf	kikapcsbO
	btfss	pir1,5
	goto	$-1
	movf	rcreg,w
	movwf	kikapcsbP

	return

kiASET					;A kapcsoló kikapcsolásának időpontjának beírása
	banksel	pir1
	btfss	pir1,5
	goto	kiASET
	movf	rcreg,w
	movwf	kikapcsaO
	btfss	pir1,5
	goto	$-1
	movf	rcreg,w
	movwf	kikapcsaP

	return

beCSET					;C kapcsoló bekapcsolásának időpontjának beírása
	banksel	pir1
	btfss	pir1,5
	goto	beCSET
	movf	rcreg,w
	movwf	bekapcscO
	btfss	pir1,5
	goto	$-1
	movf	rcreg,w
	movwf	bekapcscP

	return

beBSET					;B kapcsoló bekapcsolásának időpontjának beírása
	banksel	pir1
	btfss	pir1,5
	goto	beBSET
	movf	rcreg,w
	movwf	bekapcsbO
	btfss	pir1,5
	goto	$-1
	movf	rcreg,w
	movwf	bekapcsbP

	return

beASET					;A kapcsoló bekapcsolásának időpontjának beírása
	banksel	pir1
	btfss	pir1,5
	goto	beASET
	movf	rcreg,w
	movwf	bekapcsaO

	btfss	pir1,5
	goto	$-1
	movf	rcreg,w
	movwf	bekapcsaP

	return

orabeall				;ora beállítása
	banksel	pir1
	btfss	pir1,5
	goto	orabeall
	movf	rcreg,w
	movwf	orabin			;ora fogadása
	
	btfss	pir1,5
	goto	$-1
	movf	rcreg,w
	movwf	percbin			;perc fogadása
		
	btfss	pir1,5			
	goto	$-1
	movf	rcreg,w
	movwf	mpercbin		;mperc fogadása
	return
statwr
	banksel	pir1			;PIC státusz regiszter visszaírása
	btfss	pir1,5
	goto	statwr
	movf	rcreg,w
	movwf	picstat
	return

setoraH
	banksel	pir1			;1. Digit beállítása
	btfss	pir1,5
	goto	setoraH
	movf	rcreg,w
	movwf	oraH
	return

setoraL
	banksel	pir1			;2. digit beállítása
	btfss	pir1,5
	goto	setoraL
	movf	rcreg,w
	movwf	oraL
	return

setpercH
	banksel	pir1			;3.digit beállítása
	btfss	pir1,5
	goto	setpercH
	movf	rcreg,w
	movwf	percH
	return

setpercL
	banksel	pir1
	btfss	pir1,5			;4. digit beállítása
	goto	setpercL
	movf	rcreg,w
	movwf	percL
	return
;----------------------Ora kezelő subrutin---------------------
oravalt
	banksel	pir1
	bcf	pir1,0
	banksel	porta
	
	incf	mpercbin
	incf	mpercbin
	movf	mpercbin,w
	sublw	d'60'
	btfss	status,z
	goto	next1
	clrf	mpercbin
	incf	percbin
	movf	percbin,w
	sublw	d'60'
	btfss	status,z
	goto	next1
	clrf	percbin
	incf	orabin
	movf	orabin,w
	sublw	d'24'
	btfsc	status,z
	clrf	orabin
	
next1	btfsc	picstat,2
	call	checkauto
	return
;-------------------Időzített kapcsolók ellenőrzése------------
checkauto
	movf	orabin,w
	bcf	status,z
	subwf	bekapcsaO,w
	btfss	status,z
	goto	ch1
	movf	percbin,w
	bcf	status,z
	subwf	bekapcsaP,w
	btfsc	status,z
	bsf	portb,5
ch1	movf	orabin,w
	bcf	status,z
	subwf	bekapcsbO,w
	btfss	status,z
	goto	ch2
	movf	percbin,w
	bcf	status,z
	subwf	bekapcsbP,w
	btfsc	status,z
	bsf	portb,4
ch2	movf	orabin,w
	bcf	status,z
	subwf	bekapcscO,w
	btfss	status,z
	goto	ch3
	movf	percbin,w
	bcf	status,z
	subwf	bekapcscP,w
	btfsc	status,z
	bsf	portb,3
ch3	movf	orabin,w
	bcf	status,z
	subwf	kikapcsaO,w
	btfss	status,z
	goto	ch4
	movf	percbin,w
	bcf	status,z
	subwf	kikapcsaP,w
	btfsc	status,z
	bcf	portb,5
ch4	movf	orabin,w
	bcf	status,z
	subwf	kikapcsbO,w
	btfss	status,z
	goto	ch5
	movf	percbin,w
	bcf	status,z
	subwf	kikapcsbP,w
	btfsc	status,z
	bcf	portb,4
ch5	movf	orabin,w
	bcf	status,z
	subwf	kikapcscO,w
	btfss	status,z
	goto	ch6
	movf	percbin,w
	bcf	status,z
	subwf	kikapcscP,w
	btfsc	status,z
	bcf	portb,3
ch6	
	return
;--------------BIN to BCD átalakító órához---------------------
binto7seg
	movf	orabin,w
	movwf	temp2
	bcf	status,c
	movf	temp2,w
	sublw	d'9'		;ha 9>=orabin
	btfsc	status,c
	goto	vege1
	
	movf	temp2,w
	sublw	d'19'		;ha 19>=orabin
	btfss	status,c
	goto	kovet1
	movlw	0x06
	addwf	temp2
	goto	vege1

kovet1	movlw	0x0C
	addwf	temp2
vege1	movf	temp2,w
	movwf	tempbcd
	bcf	tempbcd,7
	bcf	tempbcd,6
	bcf	tempbcd,5
	bcf	tempbcd,4
	movf	tempbcd,w
	call	tabla
	movwf	oraL
	movf	temp2,w
	movwf	tempbcd
	bcf	tempbcd,3
	bcf	tempbcd,2
	bcf	tempbcd,1
	bcf	tempbcd,0
	swapf	tempbcd,w
	call	tabla
	movwf	oraH

	
	movf	percbin,w
	movwf	temp2
	bcf	status,c
	movf	temp2,w
	sublw	d'9'		;ha 9>=percbin
	btfsc	status,c
	goto	vege2
	
	movf	temp2,w
	bcf	status,c
	sublw	d'19'		;ha 19>=percbin
	btfss	status,c
	goto	kovet2
	movlw	0x06
	addwf	temp2
	goto	vege2

kovet2	
	movf	temp2,w
	bcf	status,c
	sublw	d'29'
	btfss	status,c
	goto	kovet3	
	movlw	0x0C
	addwf	temp2
	goto	vege2
	
kovet3	movf	temp2,w
	bcf	status,c
	sublw	d'39'
	btfss	status,c
	goto	kovet4
	movlw	0x12
	addwf	temp2
	goto	vege2
	
kovet4	movf	temp2,w
	bcf	status,c
	sublw	d'49'
	btfss	status,c
	goto	kovet5
	movlw	0x18
	addwf	temp2
	goto	vege2

kovet5	movf	temp2,w
	bcf	status,c
	sublw	d'59'
	btfss	status,c
	goto	vege2
	movlw	0x1E
	addwf	temp2

vege2	movf	temp2,w
	movwf	tempbcd
	bcf	tempbcd,7
	bcf	tempbcd,6
	bcf	tempbcd,5
	bcf	tempbcd,4
	movf	tempbcd,w
	call	tabla
	movwf	percL
	movf	temp2,w
	movwf	tempbcd
	bcf	tempbcd,3
	bcf	tempbcd,2
	bcf	tempbcd,1
	bcf	tempbcd,0
	swapf	tempbcd,w
	call	tabla
	movwf	percH

return
;----------------BCD to  7SEGMENS átalakító órához-------------
tabla
	movwf	tempw2
	sublw	d'0'
	btfsc	status,z
	retlw	b'01101111'
	movf	tempw2,w
	sublw	d'1'
	btfsc	status,z
	retlw	b'00001010'
	movf	tempw2,w
	sublw	d'2'
	btfsc	status,z
	retlw	b'11101001'
	movf	tempw2,w
	sublw	d'3'
	btfsc	status,z
	retlw	b'11101010'
	movf	tempw2,w
	sublw	d'4'
	btfsc	status,z
	retlw	b'10001110'
	movf	tempw2,w
	sublw	d'5'
	btfsc	status,z
	retlw	b'11100110'
	movf	tempw2,w
	sublw	d'6'
	btfsc	status,z
	retlw	b'11100111'
	movf	tempw2,w
	sublw	d'7'
	btfsc	status,z
	retlw	b'01001010'
	movf	tempw2,w
	sublw	d'8'
	btfsc	status,z
	retlw	b'11101111'
	movf	tempw2,w
	sublw	d'9'
	btfsc	status,z
	retlw	b'11101110'
	return

end				;Program vége
