
#INCLUDE "P16F84.INC"
	__CONFIG _CP_OFF & _XT_OSC & _PWRTE_OFF  & _WDT_OFF

PC      equ     02      ;program counter
RB EQU H'0006'
RA EQU H'0005'
;---- USER DEFINE ------
TCNT0 EQU H'C' ;= (0.6SEC /INT* PRESCAL*CLOCK)
INTR0 EQU H'D' ;AFTER INT, SAVE W VALUE
INTR1 EQU H'E' ;AFTER INT, SAVE STATUS
DD1 EQU H'F' ;DATA FOR INPUT RPM
DD2 EQU H'10'
DD3 EQU H'11'
DS1 EQU H'12' ;DTAT FOR DISPLAY
DS2 EQU H'13'
DS3 EQU H'14'
; DEINE VARIABLES
TMR EQU H'B5' ;(PRESCALE 64*1uS) * 75 = 4800 uS
TCNT EQU H'7D' ;(256-125),4.8mS*125=600mS

; DEFINE BIT
;W EQU 0 ;d VALUE FOR INCF......
;F EQU 1 ;d VALUE
OFF EQU 0 ;FLAG BIT 0,
RP0 EQU 5 ;STATUS BIT 5 & 6 =REGISTER BANK SELECT
RP1 EQU 6
INPUT EQU 7 ;RB7 AS INPUT PORT
TOIF EQU 2 ;INTCON TMR0 OVERLOW INT FLAG
TOIE EQU 5 ;INTCON TOIF ENABLE
GIE EQU 7 ;INTCON GLOBAL INT ENABLE

	;
;========== MAIN PROGRAM =========
	;
	ORG 0
	GOTO START
	;
	;----------------------------------------
	;
	ORG 4 ;INTERRUPT BEGIN
INTB MOVWF INTR0 ; SAVE W
	MOVF STATUS,W ; SAVE STATUS
	MOVWF INTR1
	BCF STATUS,RP0 ; MAKE SURE SELECT BANK0
	MOVLW TMR ; RESTORE TIMER0
	MOVWF TMR0 ;
	DECFSZ TCNT0,F ;SKIP IF ZERO
	GOTO SWEEP
RELOAD MOVLW TCNT ;RELOAD TCNT0
	MOVWF TCNT0
	MOVF DD3,W ;MOVE COUNTER DATA TO DISPLAY
	MOVWF DS3
	MOVF DD2,W
	MOVWF DS2
	MOVF DD1,W
	MOVWF DS1
	CLRF DD1
	CLRF DD2
	CLRF DD3
;---------------------------------------------------
SWEEP MOVLW H'FF'
	MOVWF RB ;OFF ALL DIGITALS
	BTFSS RA,1 ;IS RA1 LIGHT ON?
	GOTO xRA1 ;IF YES GOTO RA1
	BTFSS RA,2
	GOTO xRA2
xRA3 BSF RA,3 ;RA,1 & 2 ARE OFF, MUST BE RA,3
	BCF RA,2 ;NEXT TIME SHOULD BE RA,2
	MOVF DS2,W
	CALL TABLE ;HEX TO BCD CODE
	GOTO DISP ;PISPLAY DS3
xRA2 BSF RA,2
	BCF RA,1 ;NEXT TIME SHOULD BE RA,1
	MOVF DS1,W
	CALL TABLE
	GOTO DISP
xRA1 BSF RA,1
	BCF RA,3 ;NEXT TIME SHOULD BE RA,3
	MOVF DS3,W
	CALL TABLE
DISP MOVWF RB
	;-------------------------------------
xINTE MOVF INTR1,W ; RESTORE STATUS
	MOVWF STATUS
	MOVF INTR0,W ; RESTORE W
	BCF INTCON,TOIF ; RESET FLAG OF INT T0
	RETFIE
;
;
;-------------------------------------------------
;
TABLE ADDWF PC,F ; REMEBER PCH=00000B
	RETLW H'C0' ; 0
	RETLW H'F9' ; 1
	RETLW H'A4' ; 2
	RETLW H'B0' ; 3
	RETLW H'99' ; 4
	RETLW H'92' ; 5
	RETLW H'82' ; 6
	RETLW H'F8' ; 7
	RETLW H'80' ; 8
	RETLW H'90' ; 9
;
;
;=======================================
;---------- PROGRAM BEGIN -----------
;----------------------------------------
;
START BSF STATUS,RP0 ;SET 3,5 ENABLE BANK1
	MOVLW H'80'
	MOVWF TRISB ;SET PORTB 0-6 OUTPUT, 7 INPUT
	MOVLW 0
	MOVWF TRISA ;SET RA0-RA4 TO BE OUTPUT
	MOVLW B'10000101'
	MOVWF OPTION_REG ;INTERNAT CLOCK,TRM0,1:64
	BCF STATUS,RP0 ;ENABLE BANK0
	MOVLW H'F7'
	MOVWF RA ;RA,3=0, OTHERS=1
	MOVLW H'7F'
	MOVWF RB ;SET DISPLAY 000
	CLRF DD1 ;DISPLAY DATA
	CLRF DD2
	CLRF DD3
	MOVLW TMR ;75
	MOVWF TMR0
	MOVLW TCNT ;128
	MOVWF TCNT0
	BCF INTCON,TOIF
	BSF INTCON,TOIE
	BSF INTCON,GIE ;ENABLE INT
;----------
	MOVLW 1
	MOVWF DS1
	MOVLW 2
	MOVWF DS2
	MOVLW 3
	MOVWF DS3
 
;----------------------------------
MAIN1 BTFSC RB,7 ;IF INPUT=0, SKIP
	GOTO MAIN1
MAIN2 BTFSS RB,7 ;IF INPUT=1, SKIP
	GOTO MAIN2
MAIN3 INCF DD3,F
	MOVLW H'0A'
	SUBWF DD3,W
	SKPZ ;DIGITAL 1 =A, MUST AJUST
	GOTO MAIN1
	CLRF DD3
	INCF DD2,F
	MOVLW H'0A'
	SUBWF DD2,W
	SKPZ ;DIGITAL 1 =A, MUST AJUST
	GOTO MAIN1
	CLRF DD2
	INCF DD1,F ;DIGITAL 3 WILL NOT >9, SO NO CHECK
	GOTO MAIN1
	END
;==============================================
