

	LIST P=16F628A, R=DEC
	INCLUDE<P16F628A.INC>

	__CONFIG _PWRTE_ON & _WDT_OFF & _MCLRE_OFF & _BODEN_OFF & _LVP_OFF & _XT_OSC



W_save		equ	20h	; zaloha pri preruseni
Sta_sav		equ	21h	; zaloha pri preruseni
PCL_sav		equ	22h	; zaloha pri preruseni
FSR_sav		equ	23h	; zaloha pri preruseni
jednotky		equ	24h
desiatky		equ	25h
test			equ	26h
stovky			equ	27h
tisicky			equ	28h
desattisicky	equ	29h
cislo			equ	30h
TMP1			equ	31h
TMP0			equ	32h
TMP2			equ	33h
PC				equ	02h
hodnota			equ	.244
#DEFINE	A1		PORTA,0
#DEFINE	A2		PORTA,1
#DEFINE	A3		PORTA,2
#DEFINE	A4		PORTA,3
#DEFINE	A5		PORTB,0
;


;-----------------------------------------------------------------------------------------------

	org	00h
	goto	INIT


;************************************************************************** 

;-----------------------------------------------------------------------


;----------------------------------------------------------------------


	org	04h		; ulozeni hlavnich registru
	movwf	W_save		; W
	movf	STATUS,W
	clrf	STATUS		; Banka 0
	movwf	Sta_sav		; STATUS
	movf	PCLATH,w
	movwf	PCL_sav		; PCLATH
	movf	FSR,w
	movwf	FSR_sav		; FSR
	GOTO	PRERUS
;--------------------------------------------
INIT	MOVLW	B'00000111'	; typ komparatoru (off)
	MOVWF	CMCON
	BSF	STATUS,RP0	; nastaveni In / Out
	MOVLW	B'00000000'
	MOVWF	TRISA
	MOVLW	B'00000000'
	MOVWF	TRISB
	MOVLW	B'00000011';delička 32/B'00000011'/
	MOVWF	OPTION_REG
	BCF	STATUS,RP0
	MOVLW	B'10100000'	; povoleni preruseni pouze od TMR0
	MOVWF	INTCON
	MOVLW	hodnota
	MOVWF	cislo
;--------------------------------------------------------------
	MOVLW	.0
	MOVWF	jednotky	
	MOVLW	.0
	MOVWF	desiatky
	MOVLW	.0
	MOVWF	stovky
	MOVLW	.0
	MOVWF	tisicky
	MOVLW	.8
	MOVWF	desattisicky
	BSF		test,0;príznak pre dekrementovanie desiatok a jednotiek
	MOVLW	.0
	MOVWF	PORTA
	MOVWF	PORTB
;--------------------------------------------------------------
main 	call	zob1
		call	zob10
		call	zob100
		call	zob1000
		call	zob10000
		goto	$-5

;************************************************************************** 

;-----------------------------------------------------------------------


;----------------------------------------------------------------------


PRERUS	BTFSC	INTCON,2;test či bolo prerušenie od TMR0
		GOTO	PRER0		; od TMR0
		GOTO	PRERKON		; nezname = nic-vrati sa naspäť vykon.prgm.

PRER0	BCF	INTCON,2	; smazat priznak a vykonávať prerušenie.
		DECF	cislo,1
		BTFSC	STATUS,Z;ak je nula skáč
		goto	vypočeta	;odtialto sa skáče na obsluhu prerušenia.




konec	GOTO	PRERKON;choď na ukončenie prerušenia


PRERKON	MOVLW	B'10100000'	; povoleni zpet pozadovanych preruseni
	MOVWF	INTCON
	clrf	STATUS		; Banka 0	obnoveni ulozenych registru
	movf	FSR_sav,w	; FSR
	movwf	FSR
	movf	PCL_sav,w	; PCLATH
	movwf	PCLATH
	movf	Sta_sav,w	; Status
	movwf	STATUS
	swapf	W_save,f	; W
	swapf	W_save,w
	retfie

;--------------------------------------------
vypočeta	MOVLW .191  ;197 DEC
         	MOVWF TMP2
        	DECFSZ TMP2,F
        	GOTO $-1
			clrf	TMR0
			nop
			goto	vypočet
;--------------------------------------------
;--------------------------------------------
;--------------------------------------------

;--------------------------------------------
dec_tis_set_sto_des_jedn
							decf	tisicky,1
							call	set_sto
							call	set_des
							call	set_jedn
							bsf		test,0
							goto	konec
;-----------------------------------------------------------------
dec_desattisicky_setall		movf	desattisicky,W;kontrola či sú desattisicky na nule
							sublw	.0
							btfsc	STATUS,Z	
							goto 	konec
							decf	desattisicky,1
							call	set_tisic
							call	set_sto
							call	set_des
							call	set_jedn
							bsf		test,0
							goto	konec
;dec_tis_set_sto_des_jedn
;---------------------------------------------------------
kontr_nul_stoviek	movf	jednotky,W;kontrola či sú jednotky na nule
					sublw	.0
					btfss	STATUS,Z
					goto	jump2
					movf	desiatky,W;kontrola či sú desiatky na nule
					sublw	.0
					btfss	STATUS,Z
					goto	jump2
					movf	stovky,W;kontrola či sú stovky na nule
					sublw	.0
					btfss	STATUS,Z
					goto	jump2
					goto	dec_tis_set_sto_des_jedn

;---------------------------------------------------------
kontr_nul_tisicok	movf	jednotky,W;kontrola či sú jednotky na nule
					sublw	.0
					btfss	STATUS,Z
					goto	jump1
					movf	desiatky,W;kontrola či sú desiatky na nule
					sublw	.0
					btfss	STATUS,Z
					goto	jump1
					movf	stovky,W;kontrola či sú stovky na nule
					sublw	.0
					btfss	STATUS,Z
					goto	jump1
					movf	tisicky,W
					sublw	.0
					btfss	STATUS,Z
					goto	jump1	
					goto	dec_desattisicky_setall

;---------------------------------------------------------
dec_stovky	decf	stovky,1
			call	set_jedn
			call	set_des
			bsf		test,0
			goto	konec
;---------------------------------------------------------
set_des		movlw	.5
			movwf	desiatky
			return
;----------------------------------------------------------
set_sto		movlw	.9
			movwf	stovky
			return
;------------------------------------------------------
set_tisic	movlw	.5
			movwf	tisicky
			return

;----------------------------------------------------
set_jedn	movlw	.9
			movwf	jednotky
			return
;----------------------------------------------------------------
decr_des_set_jedn	decf	desiatky,1
					call	set_jedn
					bsf		test,0
					goto	konec	

;************************************************************************************************
decr_jedn	decf	jednotky,1
			btfsc	STATUS,Z;otestuje či sú jednotky v nule
			bcf		test,0;choď na dec.dec
			return
;***************************************vypocet ///////////////
vypočet		movlw	hodnota
		movwf	cislo
		goto	kontr_nul_tisicok
jump1	goto	kontr_nul_stoviek
jump2	movf	jednotky,W;kontrola či sú jednotky na nule
		sublw	.0
		btfss	STATUS,Z
		goto	$+6;1-9 nie sú
		movf	desiatky,W;kontrola či sú desiatky na nule
		sublw	.0
		btfss	STATUS,Z
		goto	$+2	;nie sú
		goto	dec_stovky     ;sú
		btfss	test,0;pokiaľ nie je nula skáče
		goto	decr_des_set_jedn
		btfsc	test,0;otestuje či se test,0 v nule
		call	decr_jedn
		goto	PRERKON
;************************************************************************************************
;----------------------------podprogramy--------------------------------------------
wait    MOVLW .5  
        MOVWF TMP1
        MOVLW .5 
        MOVWF TMP0
        DECFSZ TMP0,F
        GOTO $-1
        DECFSZ TMP1,F
        GOTO $-3
		RETURN
;------------------------------------------------------------------------
zob1	movf	jednotky,0;načítaj obsah reg.jednotky do WREG
		call	zobraz
		bsf		A1
		call	wait
		bcf		A1
		return
;---------------------------------------------------------------
zob10	movf	desiatky,0
		call	zobraz
		bsf		A2;zapni spol.anódy č.2
		call	wait
		bcf		A2;vypni A2
		return
;-----------------------------------------------------------------
zob100	movf	stovky,0
		call	zobraz
		bsf		A3
		call	wait
		bcf		A3
		return
;----------------------------------------------------------------
zob1000		movf	tisicky,0
			call	zobraz
			bsf		A4
			call	wait
			bcf		A4
			return
;-----------------------------------------------------------------
zob10000	movf	desattisicky,0
			call	zobraz
			bsf		A5
			call	wait
			bcf		A5
			return
		



		

;*************************************************************
koduj	addwf	PC,f		;preskoc W instrukciu
		retlw	B'10000000'	;vystupy pre nulu
		retlw	B'11110010'	;vystupy pre jednicku
		retlw	B'01001000'	;vystupy pre dvojku
		retlw	B'01100000'	;vystupy pre trojku
		retlw	B'00110010'	;vystupy pre stvorku
		retlw	B'00100100'	;vystupy pre petku
		retlw	B'00000100'	;vystupy pre sestku
		retlw	B'11110000'	;vystupy pre sedmicku
		retlw	B'00000000'	;vystupy pre osmicku
		retlw	B'00110000'	;vystupy pre deviatku
		retlw	B'11111111'	;zhasnuty displej
		retlw	B'11111111'	;zhasnuty displej
		retlw	B'11111111'	;zhasnuty displej
		retlw	B'11111111'	;zhasnuty displej
		retlw	B'11111111'	;zhasnuty displej
		retlw	B'11111111'	;zhasnuty displej
;*************************************************************
zobraz	andlw	0fh		;zamaskuj horne styri bity zaciatok zobrazovania
		call	koduj
		movwf	PORTB		;nastav vystupy portu A
		return
;************************************************************************** 

;-----------------------------------------------------------------------


;----------------------------------------------------------------------




	END
	