; ; LIST P=16F648A,ST=OFF INCLUDE P16F648A.INC ERRORLEVEL -302,-306 __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTOSC_OSC_NOCLKOUT & _MCLRE_OFF & _LVP_OFF & _BOREN_OFF __IDLOCS H'FFFF' ; constants definition MAX_MIN equ 0x60 INF_MIN equ 0xef TMR_PREL equ 0x1e ; TMR1 value = (0x10000 - preset) TMR_PREH equ 0xfb CNT1_PRE equ 0x64 CNT2_PRE equ 0x3c SW_CYCLE equ 0x08 ; PORT A Bit definition DIGIT0 equ 0 DIGIT1 equ 1 SEG_DP equ 2 AC_OUT equ 3 ; file registers WORK_REG equ 0x20 LED_DATA equ WORK_REG + 1 ; SW_COUNT equ WORK_REG + 2 WK equ WORK_REG + 3 ; TM0 equ WORK_REG + 4 ; TM1 equ WORK_REG + 5 ; sec cnt W_WORK equ WORK_REG + 6 S_WORK equ WORK_REG + 7 org 0x0000 ; goto START ; ; org 0x0004 goto INT_SUB ; org 0x0010 INT_SUB ; movwf W_WORK ; W-reg & Staus Save movf STATUS, W movwf S_WORK btfss PIR1, TMR1IF ; check TMR1 int goto int_sw ; int_tmr bcf T1CON,TMR1ON ; TMR1 Off bcf PIR1, TMR1IF ; TMR1 overflow reset ; btfss PORTA, DIGIT0 goto dyndisp1 bcf PORTA, DIGIT0 ; 1桁目表示 bsf PORTA, DIGIT1 movlw 0x0f andwf LED_DATA, W goto dyndisp2 dyndisp1 bsf PORTA, DIGIT0 ; 10桁目表示 bcf PORTA, DIGIT1 swapf LED_DATA, W andlw 0x0f btfss STATUS, Z goto dyndisp2 movlw b'11111110' ; Zero suppress goto dyndisp3 dyndisp2 call GETSSEG ; dyndisp3 movwf PORTB ; movlw b'11111111' andwf LED_DATA, W ; if LED_DATA = 0 then AC_OUT = off btfss STATUS, Z goto TMR_ON ; bcf PORTA, AC_OUT ; AC off bsf PORTA, SEG_DP ; DP off goto TMR_1 TMR_ON movlw INF_MIN subwf LED_DATA, W ; if LED_DATA = INF_MIN then AC_OUT = on, continue btfss STATUS, Z goto TMR_CDown bsf PORTA, SEG_DP ; DP off goto TMR_1 ; TMR_CDown bsf PORTA, AC_OUT decfsz TM0, F goto TMR_1 ; ; movlw CNT1_PRE movwf TM0 btfss PORTA, SEG_DP goto TMR_0 bcf PORTA, SEG_DP goto TMR_00 TMR_0 bsf PORTA, SEG_DP TMR_00 decfsz TM1, F ; decriment min counter goto TMR_1 ; ; movlw CNT2_PRE ; preset min counter movwf TM1 movlw 1 subwf LED_DATA,F ; btfsc STATUS, DC goto TMR_01 movlw 0x06 subwf LED_DATA,F TMR_01 TMR_2 TMR_1 movlw TMR_PREH ; TMR1 preset movwf TMR1H movlw TMR_PREL movwf TMR1L bsf STATUS, RP0 bsf PIE1, TMR1IE ; Enable TMR1 INT bcf STATUS, RP0 bsf T1CON, TMR1ON ; TMR1 On goto int_final ; int_sw bcf INTCON, INTF ; clear INTF flag movlw CNT2_PRE ; SEC counter preset movwf TM1 call ROUND_MIN call STEP_MIN movwf LED_DATA ; preset display time bsf INTCON, INTE ; Enable INTE INT goto int_final ; int_final movf S_WORK, W ; Restore W-reg & STATUS movwf STATUS swapf W_WORK, F swapf W_WORK, W bsf INTCON, GIE retfie ; GETSSEG addwf PCL,F ; PCL=PCL+W ; fgabcdeX retlw b'01000000' ;0 retlw b'11100110' ;1 retlw b'10001000' ;2 retlw b'10000010' ;3 retlw b'00100110' ;4 retlw b'00010010' ;5 retlw b'00010000' ;6 retlw b'01000110' ;7 retlw b'00000000' ;8 retlw b'00000010' ;9 retlw b'00000100' ;A retlw b'00110000' ;b retlw b'10111000' ;c retlw b'10100000' ;d retlw b'10110000' ;o retlw b'10110100' ;n ; retlw b'10111110' ;- ; STEP_MIN addwf PCL, F retlw 0x00 retlw 0x02 retlw 0x05 retlw 0x10 retlw 0x20 retlw 0x30 retlw 0x60 retlw 0xef retlw 0x00 ; dummy ; ; ROUND_MIN ; LED_DATA = current Minute ; return Round up count in W clrf WK round_0 movf WK, W call STEP_MIN subwf LED_DATA, W btfss STATUS, C goto round_1 incf WK, F goto round_2 round_1 movf WK, W return round_2 btfss WK, 3 ; check > 7 goto round_0 clrf WK goto round_1 ; ; START clrf PORTA movlw b'00000111' movwf CMCON bcf STATUS, RP1 ; BANK = 1 bsf STATUS, RP0 ; clrf VRCON bsf PCON, OSCF ; 4MHz movlw b'10000011' ; PU-dis, INT-falling, TIMER, PS=1/16(ignored) movwf OPTION_REG movlw b'00000000' ; PORT-A All Output movwf TRISA ; movlw b'00000001' ; PORT-B All Output but PB0 is Input/INT movwf TRISB ; movlw b'00000001' ; TMR1 Int Enable movwf PIE1 bcf STATUS, RP0 ; BANK = 0 ; MAIN0 clrf LED_DATA ; LED display '0' clrf SW_COUNT ; SW Counter = 0 bsf PORTA, SEG_DP ; DP seg OFF bcf PORTA, AC_OUT ; AC out OFF movlw CNT1_PRE ; movwf TM0 ; preset second counter movlw CNT2_PRE movwf TM1 ; preset minute counter movlw b'00110000' ; TMR1 PS=1/8 movwf T1CON bcf PIR1, TMR1IF bsf INTCON, INTE ; PB0 INT Enable bsf INTCON, PEIE ; Peripheral Interrupt Enable bsf INTCON, GIE ; Interuppt Enable movlw TMR_PREH ; TMR1 preset movwf TMR1H movlw TMR_PREL movwf TMR1L bsf T1CON, TMR1ON ; TMR1 ON MAIN nop nop goto MAIN END