	list	p=16F873A
	#include <p16F873A.inc>
	__CONFIG	_CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC & _LVP_OFF
;---Дефиниране---
w		EQU	0
f		EQU	1
Begin_value 	EQU	D'176'

		CBLOCK 	H'020'	; Адрес на първия регистър от GPR
		Counter_s1
		Counter_s2
		Counter_m1
		Counter_m2
		Counter_h1
		Counter_h2
		Cycle_counter
		Cycle_counter2
		Temp_PORTC
		ENDC

;---Дефиниране битовете на регистъра Flag_register---
#define		Dig_s1		PORTC,0
#define		Dig_s2		PORTC,1
#define		Dig_m1		PORTC,2
#define		Dig_m2		PORTC,3
#define		Dig_h1		PORTC,4
#define		Dig_h2		PORTC,5
;-----------------------------------------------------
		ORG	H'0000'		;Начално зареждане
		goto	start

		ORG	H'0004'		;Прекъсване
		goto 	Int_service
;----Инициализация----
start		bcf	STATUS,RP0	;Избор на банка 0
		clrf	PORTC		;Нулиране PORTC
		clrf	PORTB		;Нулиране PORTB
		bsf	STATUS,RP0	;Избор на банка 1
		movlw	B'11000000'	;Дефиниране на входове-изходи
		movwf	TRISC
		clrf	TRISB
		bcf	STATUS,RP0
		goto	main	
;----Обслужване на прекъсванията----
Int_service	btfss	INTCON,T0IF	; Прекъсване от TMR0?
		goto	end_int		; Не, връщане от ISR
TMR0_int	movlw	Begin_value	; Begin value > W
		movwf	TMR0		; W > TMR0
		call	Inc_timer	; Актуализиране на таймера
		call	Update_disp	; Обновяване на индикаторите
end_int		bcf	INTCON,T0IF	;Нулиране на T0IF и връщане към главната програма
		retfie
;----Актуализиране на дисплея----
Inc_timer	incf	Cycle_counter,w	; W=(Cycle_counter)+1
		xorlw	D'200'		; W XOR 200 -> W
		btfsc	STATUS,Z	; W=200? (изтекла е 1сек)
		goto	Inc_timer2	; 
		incf	Cycle_counter,f	; Не, Cycle_counter=(Cycle_counter)+1
		return			; Връщане към ISR
Inc_timer2	incf	Cycle_counter2,w	; W=(Cycle_counter)+1
		xorlw	D'2'		; W XOR 2 -> W
		btfsc	STATUS,Z	; W=2
		goto	inc_counters	; Да, уваличи брояча на таймера
		incf	Cycle_counter2,f; Не, Cycle_counter=(Cycle_counter)+1
		clrf	Cycle_counter
		return			; Връщане към ISR
inc_counters	clrf	Cycle_counter	; 00 Cycle_counter
		clrf	Cycle_counter2
		incf	Counter_s1,f	; Counter_s1=(Counter_s1)+1
		movlw	D'10'
		xorwf	Counter_s1,w	; (Counter_s1) XOR W -> W
		btfss	STATUS,Z	; (Counter_s1) = 10
		return			; Не, връщане към ISR
		clrf	Counter_s1	; Да, нулиране на Counter_s1
inc_s2		incf	Counter_s2,f
		movlw	D'6'
		xorwf	Counter_s2,w
		btfss	STATUS,Z
		return
		clrf	Counter_s2
inc_m1		incf	Counter_m1,f
		movlw	D'10'
		xorwf	Counter_m1,w
		btfss	STATUS,Z
		return
		clrf	Counter_m1
inc_m2		incf	Counter_m2,f
		movlw	D'6'
		xorwf	Counter_m2,w
		btfss	STATUS,Z
		return
		clrf	Counter_m2
inc_h1		incf	Counter_h1,f	; Counter_h1 + 1
		movlw	D'2'		; Проверка за
		xorwf	Counter_h2,w	; (Counter_h2)=2 ?
		goto	h1_cont		; Не
		movlw	D'4'		; Да
		xorwf	Counter_h1,w
		btfss	STATUS,Z
		return
		clrf	Counter_h1
		goto	inc_h2
h1_cont		movlw	D'10'
		xorwf	Counter_h1,w
		btfss	STATUS,Z
		return
		clrf	Counter_h1
inc_h2		incf	Counter_h2,f
		movlw	D'3'
		xorwf	Counter_h2,w
		btfss	STATUS,Z
		return
		clrf	Counter_h2
		return
;----Обновяване на дисплея----
Update_disp	movf	Temp_PORTC,w	; Temp_PORTC -> W
		movwf	PORTC		; W -> PortC
		btfsc	Dig_s1		; Обновяване индикатор s1?
		goto	update_s1	; Да
		btfsc	Dig_s2		; Не. Обновяване индикатор s2?
		goto	update_s2	; Да
		btfsc	Dig_m1		; Не. Обновяване индикатор m1?
		goto	update_m1	; Да
		btfsc	Dig_m2		; Не. Обновяване индикатор m2?
		goto	update_m2	; Да
		btfsc	Dig_h1		; Не. Обновяване индикатор h1?
		goto	update_h1	; Да
		goto	update_h2	; Не
update_s1	movf	Counter_s1,w
		call 	Table
		movwf	PORTB
		goto 	end_update
update_s2	movf	Counter_s2,w
		call 	Table
		movwf	PORTB
		goto 	end_update
update_m1	movf	Counter_m1,w
		call 	Table
		movwf	PORTB
		goto 	end_update
update_m2	movf	Counter_m2,w
		call 	Table
		movwf	PORTB
		goto 	end_update
update_h1	movf	Counter_h1,w
		call 	Table
		movwf	PORTB
		goto 	end_update
update_h2	movf	Counter_h2,w
		call 	Table
		movwf	PORTB
end_update	bcf	STATUS,C
		rlf	Temp_PORTC,f	; Обновяване на следващ индикатор
		btfss	Temp_PORTC,6	; Обновен ли е h2?
		return			; Не, връщане към ISR
		movlw 	B'00000001'
		movwf	Temp_PORTC
		return
;---- Таблица ----
Table		addwf	PCL,f		; W + PCL = PCL
		retlw	b'10111111'
		retlw	b'10000110'
		retlw	b'11011011'
		retlw	b'11001111'
		retlw	b'11100110'
		retlw	b'11101101'
		retlw	b'11111101'
		retlw	b'10000111'
		retlw	b'11111111'
		retlw	b'11101111'
;----Конфигуриране и инициализация на таймера----
Timer_config		bsf	STATUS,RP0
		movlw	B'10000100'
		movwf	OPTION_REG
		bcf	STATUS,RP0
		clrf	Counter_s1
		clrf	Counter_s2
		clrf	Counter_m1
		clrf	Counter_m2
		clrf	Counter_h1
		clrf	Counter_h2
		clrf	Cycle_counter
		movlw	B'00000001'
		movwf	Temp_PORTC
		movlw	Begin_value
		movwf	TMR0
		return
;----Главна програма----
main		call	Timer_config
		movlw	B'10100000'
		movwf	INTCON
loop		nop
		goto	loop
		END
