;*******************************************************************
w	equ	0		;parametr instrukci
f	equ	1		;parametr instrukci
z	equ	2		;bit registru SWR
f0	equ	0x00		;registr neprimeho adresovani
swr	equ	0x03		;adresa SWR registru
fsr	equ	0x04		;registr adresy neprimeho adresovani
porta	equ	0x05		;adresa brany A
trisa	equ	0x85		;pouzijeme neprime adresovani
portb	equ	0x06		;adresa brany B
trisb	equ	0x86		;pouzijeme neprime adresovani
cnt1	equ	0x0C		;definice registru cnt1
cnt2	equ	0x0D		;definice registru cnt2
temp1	equ	0x0E		;definice registru temp1

;*******************************************************************
#define up	portb,0		;tlacitko nahoru
#define down	portb,1		;tlacitko dolu
#define bit_z	swr,2		;priznak nuloveho vysledku
;*******************************************************************
	list 	p = 16F84	
	__config 0x3FF1		;nastaveni konfigurace
;*******************************************************************
	org	0x0000		;adresa zacatku programu
	goto	main		;skoci na zacatek hlavniho programu
;*******************************************************************
;cekaci smycka

cekat	movwf	cnt1		;naplneni registru
	movf	cnt1,f		;nastaveni priznaku z
	btfsc	bit_z		;je bit z=0 , registr cnt1=0 ?
	return			;ano , navrat z cekaci smycky
				;ne , pokracovat v cekaci smycce

cekej_2	movlw	d'5'		;naplneni registru W
	movwf	cnt2		;presun W do cnt2
cekej_1	decfsz	cnt2,f		;odecte od registru 1.smycky 1
	goto	cekej_1		;skoci, je-li registr roven 0
	decfsz	cnt1,f		;odecte od registru 2.smyčky 1
	goto	cekej_2		;skoci, je-li registr roven 0
	
	return			;navrat z cekaci smycky

;*******************************************************************
;prepnuti portu na cteni tlacitek

cteni	movlw	trisa		;naplneni registru W
	movwf	fsr		;presun do registru FSR - neprima adresa
	movlw	B'11111111'	;naplneni registru W - vsechny piny jako vstupy
	movwf	f0		;presun do registru neprimeho adresovani
	movlw	trisb		;naplneni registru W
	movwf	fsr		;presun do registru FSR - neprima adresa
	movlw	B'11111111'	;naplneni registru W - vsechny piny jako vstupy
	movwf	f0		;presun do registru neprimeho adresovani

	return			;navrat

;*******************************************************************
;prepnuti portu na vystup, aktivni rada LED
	
zapis	movlw	trisa		;naplneni registru W				
	movwf	fsr		;presun do registru FSR - neprima adresa
	movlw	B'11111011'	;naplneni registru W - rada LED jako vystup
	movwf	f0		;presun do registru neprimeho adresovani
	movlw	B'11111011'	;naplneni registru - aktivni rada LED
	movwf	porta		;presun do portu A
	movlw	trisb		;naplneni registru W
	movwf	fsr		;presun do registru FSR - neprima adresa
	movlw	B'00000000'	;port b jako vystupy
	movwf	f0		;presun do registru neprimeho adresovani

	return			;navrat

;*******************************************************************
;hlavni program

main	movlw	D'128'		;naplneni registru W
	movwf	temp1		;presun do registru temp1

	
smycka	call	cteni		;prepnuti na cteni tlacitek

test_1	btfsc	up		;cteni tlacitka 1	
	goto	test_2		;tlacitko nebylo stisknuto
	decfsz	temp1,f		;registr temp1 - 1, test je-li vysledek 0
	goto	zobraz		;temp1>0 , skok na zobrazeni
	movlw	D'1'		;temp1=0 ---> temp1=1 , naplneni registru W 
	movwf	temp1		;presun do registru temp1


test_2	btfsc	down		;cteni tlacitka 2
	goto	zobraz		;tlacitko nebylo stisknuto
	incfsz	temp1,f		;registr temp1 + 1, test je-li vysledek 0
	goto	zobraz		;temp1<0 , skok na zobrazeni
	movlw	D'255'		;temp1>255 ---> temp1=255 , naplneni registru w
	movwf	temp1		;presun do registru temp1

	

zobraz	call	zapis		;prepnuti na vystupy, aktivni rada LED
	movlw	B'00001111'	;naplneni registru W
	movwf	portb		;presun do portu B
	movf	temp1,w		;naplneni registru W z registru temp1
	call	cekat		;skok do cekaci smycky, delky smycky v registru W
	comf	portb,f		;negace hodnoty brany B
	comf	temp1,w		;naplneni registru W negovanou hodnotou registru temp1
	call	cekat		;skok do cekaci smycky, delky smycky v registru W

	goto	smycka		;skok zpet na zacatek smycky hlavniho programu
	end
