;prietokomer pocita inpulzy-prerusenia na vstupe 16F628
;a po preteceni TMR ulozi hodnotu do MEM_IMPULZY a tuto
;hodnotu prevedie na prietok v BCD a posiela ju na posuvny
;reg.4094 3.miestneho led zobrazovaca
;----------------------------------------------------------
;definicia hardware
	LIST P=16F628,R=DEC
	INCLUDE<P16F628.INC>
	__CONFIG _PWRTE_ON & _WDT_OFF & _MCLRE_ON & _BODEN_OFF & _LVP_OFF & _XT_OSC
																				
	BTN_Y1	EQU	0	;RA0	KLAVESNICA RAD1				ZATIAL NIE JE V PROGRAME VYUZITE
	BTN_Y2	EQU	1	;RA1			   RAD2							-//-
	BTN_UP_DOWN	EQU	2	;RA2	VSTUP KLAVESNICA					-//-
	BTN_ESC_ENTER	EQU	3	;RA3	VSTUP KLAVESNICA				-//-
	LED1 	EQU	4	;RA4	LED1									-//-
					;MCLR
					;OSC2
					;OSC1
	INPUT	EQU 0	;RB0	VSTUP IMPULZOV		
	ANODA0	EQU	1	;RB1	DISPLAY SPOLOCNA ANODA1	
	ANODA1	EQU	2	;RB2	DISPLAY SPOLOCNA ANODA2
	ANODA2	EQU	3	;RB3	DISPLAY SPOLOCNA ANODA3
	STROBE	EQU	4	;RB4	VSTUP STROBE 4094		
	DATAX	EQU	5	;RB5	VSTUP DATA	4094
	CLOCK	EQU 6	;RB6	VSTUP CLOCK 4094	
	PIEZO	EQU	7	;RB7	VYSTUP PRE PIEZO						-//-
;----------------------------------------------------------
;premenne
	OFF_RAM		EQU	0x20		;OFFSET PAMATI 16F628
	MEM_W		EQU	OFF_RAM 	;PAMAT	PRAC.REGISTRU
	MEM_STATUS	EQU	OFF_RAM	+1	;		STATUS
	MEM_IMPULZY	EQU	OFF_RAM	+2	;		PREMENNA POCTU IMPULZOV PO PRERUSENI OD TMR
	MEM_IN		EQU	OFF_RAM	+3	;		PREMENNA AKTUALNEHO CITANIA
	MEM_PRIETOK	EQU	OFF_RAM	+4	;		PREMENNA HODNOTY PRIETOKU BIN
	MEM_PREVOD	EQU	OFF_RAM	+5	;		PREVODNA KONSTANTA IMPULZY>PRIETOK
	MEM_TMR0	EQU	OFF_RAM	+6	;		PREMENNA OFFSETU TMR0
	MEM_BCD0	EQU	OFF_RAM	+7	;		BCD 0
	MEM_BCD1	EQU	OFF_RAM	+8	;		BCD 1
	MEM_BCD2	EQU	OFF_RAM	+9	;		BCD 2
	POMOC_MAT	EQU OFF_RAM	+10	;		POMOCNA PAMAT PRE MATEMATICKE VYPOCTY
	CYKL		EQU OFF_RAM	+11	;		PREMENNA POCITANIA CYKLOV
	MEM_100		EQU	OFF_RAM	+12	;		RAD 100 PREMENNEJ IMPULZY
	MEM_10		EQU	OFF_RAM	+13	;		RAD	10	PREMENNEJ IMPULZY
	MEM_1		EQU	OFF_RAM	+14	;		RAD 1 PREMENNEJ IMPULZY
	POMOC_BCD	EQU	OFF_RAM	+15	;		POMOCNY REG.PRAVE ZOBRAZOVANEHO ZNAKU
	MEM_ZNAK	EQU	OFF_RAM	+16	;		
;----------------------------------------------------------
;program
;----------------------------------------------------------
	ORG	0
		GOTO	START	;ZACIATOK PROGRAMU
	ORG	4
		GOTO	INTPROC;OBSLUHA PRERUSENI
;----------------------------------------------------------
;hlavny program
	START		;INICIALIZACIA PROCESORA
		BSF	STATUS,RP0			;BANKA1
		MOVLW	0xC6			
		MOVWF	OPTION_REG		;NASTAVENIE OPTION
		MOVLW	0x0C	
		MOVWF	TRISA			;NASTAVENIE IO PORTU A
		MOVLW	0x01
		MOVWF	TRISB			;NASTAVENIE IO PORTU B
		BCF		STATUS,RP0		;BANKA0
		CLRF	PORTA			;CELY PORTA DO 0
		CLRF	PORTB			;CELY PORTB DO 0
		MOVLW	0xB0
		MOVWF	INTCON			;POVOLENIE PRERUSENIA,TMR0_ON,RB0_ON
		MOVLW	MEM_TMR0
		MOVWF	TMR0			;NASTAVENIE POCIATOCNEJ HODNOTY TMR0
;----------------------------------------------------------
;slucka hlavneho programu
	MAIN
		MOVLW	0xF1
		MOVWF	MEM_IMPULZY		;NASTAVENIE POCTU IMP PRE TESTOVANIE
								;V KONECNEJ VERZII VYMAZAT
		CALL BIN_DEC
		MOVF	MEM_100,W 
		CALL DEC_BCD
		MOVWF	MEM_BCD2
		BSF	PORTB,ANODA0
		MOVFW	MEM_BCD2
		CALL OUT_4094
		MOVF	MEM_10,W
		CALL DEC_BCD
		BCF PORTB,ANODA0
		BSF	PORTB,ANODA1
		MOVWF	MEM_BCD1
		MOVF	MEM_ZNAK,1
		MOVFW	MEM_BCD1
		CALL OUT_4094
		MOVF	MEM_1,W
		CALL DEC_BCD
		BCF	PORTB,ANODA1
		BSF	PORTB,ANODA2
		MOVWF	MEM_BCD0
		MOVF	MEM_ZNAK,0
		MOVFW	MEM_BCD0
		CALL OUT_4094
		BCF	PORTB,ANODA2
		GOTO MAIN
;----------------------------------------------------------
;podprogramy
	BIN_DEC			;PREVOD NA DEC
		MOVF	MEM_IMPULZY,W	;MEM_IMPULZY DO W
		MOVWF	POMOC_MAT		;W DO POMOC_MAT
		CLRF	CYKL			;NULOVANIE CYKL
	    RAD_100					;VYPOCET RAD 100
	  		MOVLW	100
			SUBWF	POMOC_MAT,W
			BTFSS	STATUS,C
			GOTO	END_100
			MOVWF	POMOC_MAT
			INCF	CYKL,F
			GOTO RAD_100
		END_100
			MOVF	CYKL,W
			MOVWF	MEM_100
		CLRF	CYKL			;NULOVANIE CYKL
	    RAD_10					;VYPOCET RAD 100
	  		MOVLW	10
			SUBWF	POMOC_MAT,W
			BTFSS	STATUS,C
			GOTO	END_10
			MOVWF	POMOC_MAT
			INCF	CYKL,F
			GOTO RAD_10
		END_10
			MOVF	CYKL,W
			MOVWF	MEM_10
			MOVF	POMOC_MAT,W
			MOVWF	MEM_1
	RETURN
	DEC_BCD						;PREVOD DEC NA BCD
			ADDWF PCL,F
			RETLW	0x40	;0
			RETLW	0x79	;1
			RETLW	0x24	;2
			RETLW	0x30	;3
			RETLW	0x19 	;4
			RETLW	0x12	;5
			RETLW	0x02	;6
			RETLW	0x78	;7
			RETLW	0x00	;8
			RETLW	0x10	;9
	OUT_4094		;ZNAK Z W NA VYSTUP
			MOVWF	POMOC_BCD	;ZNAK Z W DO POMOC_BCD
			MOVLW	8
			MOVWF	CYKL		;CYKLUS 8 BIT
		LOOP8_BIT
			BCF	PORTB,DATAX
			RLF	POMOC_BCD,F
			BTFSC	STATUS,C
			BSF	PORTB,DATAX
			BCF	PORTB,CLOCK
			BSF	PORTB,CLOCK
			DECFSZ	CYKL,F
			GOTO	LOOP8_BIT
	RETURN
;----------------------------------------------------------
;Obsluha preruseni
	INTPROC
		MOVWF	MEM_W			;ULOZENIE OBSAHU PRAC.REGISTRU
		MOVF	STATUS,W
		MOVWF	MEM_STATUS		;ULOZENIE OBSAHU STATUS
		BTFSS	INTCON,T0IF		;TEST PRERUSENIA OD TMR0
		GOTO 	INT_RB0			;AK NIE SKOK OBSLUHU PRERUSENIA RB0			
		GOTO	INT_TMR			;AK ANO SKOK NA OBSLUHU PRERUSENIA OD TMR
	  END_INT
		MOVF 	MEM_STATUS,W		;OBNOVA STATUS
		MOVWF	STATUS
		MOVF	MEM_W,W
	RETFIE					
	INT_RB0
 		BCF INTCON,INTF			;NULOVANIE PRERUSENIA OD RB0
		INCF	MEM_IN,MEM_IN	;INCREMENT POCTU VSTUPNYCH IMPULZOV	
	GOTO END_INT
	INT_TMR
		BCF	INTCON,T0IF			;NULOVANIE PRIZNAKU PRERUSENIA OD TMR0
		MOVFW	MEM_IN			;PREPISANIE MEM_IN
		MOVWF	MEM_IMPULZY		;...DO MEM_IMPULZY
		CLRF	MEM_IN			;VYNULOVANIE MEM_IN
		MOVLW	MEM_TMR0
		MOVWF	TMR0			;NASTAVENIE POCIATOCNEJ HODNOTY TMR
	GOTO END_INT
;----------------------------------------------------------
	END

