;******************TIMER***************** ; by: Eng'r Roland Michael A. dela Peņa * ;**************************************** LIST P=16F84 ERRORLEVEL -302 #INCLUDE P16F84.INC ;**************************************************************************** ; REGISTER DEFINITIONS ;**************************************************************************** CBLOCK 0CH TEMPW ; TEMP REG BEFORE THE ACCUMULATOR WILL BE USE IN TIMER MILLI ; 100 MILLISECONDS (RTC) SEC ; ONES FOR SECONDS (RTC) SECT ; TENS FOR SECONDS (RTC) MIN ; ONES FOR MINUTES (RTC) MINT ; TENS FOR MINUTES (RTC) HOUR ; ONES FOR HOURS (RTC) HOURT ; TENS FOR HOURS (RTC) ENDC ;**************************************************************************** ; BIT DEFINITIONS ;**************************************************************************** #DEFINE STRT PORTA,0 ; START BUTTON #DEFINE STOP PORTA,1 ; STOP BUTTON ;**************************************************************************** ; THIS PART INITIALIZES THE PORTS AND OTHER PHERIPERALS IN MICROCONTROLLER ;**************************************************************************** ORG 0000H ; SET POWER ON RESET VECTOR. GOTO INIT ORG 0004H ; RESET VECTOR FOR INTERRUPT GOTO ISR INIT BSF STATUS,RP0 ; SET BANK = 1. BCF OPTION_REG,7 ; ENABLE BUILT-IN PULL-UP RESISTORS. BCF OPTION_REG,5 ; SET CLOCK SOURCE TO INTERNAL INSTRUCTION CYCLE CLOCK. BCF OPTION_REG,3 ; SET PRESCALER TO TMR0. MOVLW B'00000000' ; SET ALL PORTB TO OUTPUT MOVWF TRISB MOVLW B'11111111' ; SET ALL PORTA TO INPUT. MOVWF TRISA BCF STATUS,RP0 ; SET BANK = 0. ;**************************************************************************** ; MAIN ROUTINE (CRYSTAL = 10MHZ) ; 10 HOUR TIMER USING TIMER0 INTERRUPT ;**************************************************************************** START ; RESERVED FOR PROGRAM LINES ; ; BTFSC STRT ; IS START TIMER BUTTON PRESSED? GOTO STARTIME ; YES. GOTO START ; NO. ;************************************************************** ; ENABLING THE INTERRUPT AT TIMER0 ;************************************************************** STARTIME BTFSC STRT GOTO STARTIME MOVLW d'158' ; LOAD TIMER0 INTERVAL VALUE. MOVWF TMR0 ; SET TMR0 = 158 or 98 MORE COUNTS TO OVERFLOW. BSF INTCON,5 ; ENABLE TMR0. BSF INTCON,GIE ; TIMER0 IS NOW READY FOR INTERRUPT. ; TMR0 STARTS TO DECREMENT AFTER GIE = 1. STARTIME1 ; ADD ANY ROUTINE HERE ; LIKE DISPLAY ; BTFSC STOP ; IS STOP BUTTON PRESSED? GOTO STOP1 ; YES. GOTO STARTIME1 ; NO. ;************************************************************** ; DISABLING THE INTERRUPT AT TIMER0 ;************************************************************** STOP1 BTFSC STOP GOTO STOP1 BCF INTCON,GIE ; DISABLE GIE SO THAT NO INTERRUPT CAN OCCUR BCF INTCON,2 ; CLEAR T0IF FLAG GOTO START ;**************************************************************************** ; TIMER SUBROUTINE ;**************************************************************************** ISR BCF INTCON,GIE ; DISABLE GIE SO THAT NO INTERRUPT CAN OCCUR BCF INTCON,2 ; CLEAR T0IF FLAG MOVWF TEMPW MOVLW D'158' ; RELOAD TMR0 VALUE MOVWF TMR0 INCF MILLI MOVLW d'100' XORWF MILLI,0 BTFSS STATUS,2 ; IS 1 SEC OVER? GOTO ISR1 ; NO. INCF SEC ; 1 SEC WAS OVER. CLRF MILLI MOVLW d'10' XORWF SEC,0 BTFSS STATUS,2 GOTO ISR1 INCF SECT CLRF SEC MOVLW d'6' XORWF SECT,0 BTFSS STATUS,2 ; IS 1 MIN OVER? GOTO ISR1 ; NO. INCF MIN ; YES. CLRF SECT MOVLW d'10' XORWF MIN,0 BTFSS STATUS,2 GOTO ISR1 INCF MINT CLRF MIN MOVLW d'6' XORWF MINT,0 BTFSS STATUS,2 ; IS 1 HOUR OVER? GOTO ISR1 ; NO. INCF HOUR ; YES. CLRF MINT MOVLW d'10' XORWF HOUR,0 BTFSS STATUS,2 GOTO ISR1 INCF HOURT CLRF HOUR MOVLW d'10' XORWF HOURT,0 BTFSS STATUS,2 ; IS 10 HOURS OVER? GOTO ISR1 CLEAR HOURT ISR1 MOVFW TEMPW RETFIE END