;Interval timer(1sec=5msec*200,5msec*1000/0.125/4=10000,10000/256=39.06) INCLUDE "P16F819.INC" LIST P=16F819 ;コンフィグ→クロック信号INTOSC、パワーアップタイマのみオン __CONFIG _INTRC_IO & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _MCLR_OFF & _LVP_OFF & _CP_OFF ;ファイルレジスタ定義 N EQU 0x20 ;Converter to 7seg-LED ON EQU 0x21 ;Pulse detection flag TU EQU 0x22 ;Counter for 1sec-timer WB EQU 0x23 ;Backup of STATUS SB EQU 0x24 ;Reset of W TM EQU 0x25 ;Counter for 10sec-timer LX EQU 0x26 ;Dynamic light-on N1 EQU 0x27 ;10^0 N2 EQU 0x28 ;10^1 N3 EQU 0x29 ;10^2 N4 EQU 0x2A ;10^3 N5 EQU 0x2B ;Holder of N1 N6 EQU 0x2C ;Holder of N2 N7 EQU 0x2D ;Holder of N3 N8 EQU 0x2E ;Holder of N4 HF EQU 0x2F ;Hold Flag ; ORG 0 ;リセットベクタ GOTO START ORG 4 ;割込みベクタ BCF INTCON,TMR0IF ;割り込みフラグをクリア MOVWF WB ;Wレジスタ退避 SWAPF STATUS,0 ;STATUS取り出し MOVWF SB ;STATUS退避 BANKSEL TMR0 MOVLW 0xD9 ;カウント値=217(=256-39)を再ロード MOVWF TMR0 INCF TU,1 ;TUレジスタをカウントアップ BCF PORTA,0 ;全消灯 BCF PORTA,1 BCF PORTA,2 BCF PORTA,3 INCF LX,1 ;LXレジスタをカウントアップ MOVF LX,0 ADDLW 0xFC BTFSC STATUS,C ;LX=4ならばリセット(LX=0) CLRF LX SWAPF SB,0 ;STATUS戻し MOVWF STATUS SWAPF WB,1 ;Wレジスタ戻し SWAPF WB,0 RETFIE START BANKSEL OSCCON MOVLW B'01110100' ;内部クロック8MHz MOVWF OSCCON BANKSEL ADCON1 MOVLW B'00000110' ;All pins as digital I/O MOVWF ADCON1 BANKSEL TRISA MOVLW B'11110000' ;RA4-RA7を入力ポート、RA0-RA3を出力ポート MOVWF TRISA BANKSEL TRISB MOVLW B'00000000' ;RB0-RB7を出力ポート MOVWF TRISB BANKSEL OPTION_REG MOVLW 0x87 ;256カウントモード指定 MOVWF OPTION_REG ;プリスケーラへ出力 BANKSEL TMR0 MOVLW 0xD9 ;カウント値=217(=256-39) MOVWF TMR0 ;タイマーへ出力 BCF ADCON0,ADON BSF INTCON,TMR0IE ;タイマ割り込み許可 BSF INTCON,GIE ;全体割り込み許可 CLRF N1 ;N1,N2,N3,N4は1位から4位 CLRF N2 CLRF N3 CLRF N4 CLRF N5 ;N5,N6,N7,N8は保持用 CLRF N6 CLRF N7 CLRF N8 CLRF TU CLRF LX CLRF ON CLRF TMR1H CLRF TMR1L BSF HF,0 ;Hold ON ; MAIN BCF INTCON,TMR0IE ;タイマ割り込み禁止 CALL DSP ;7seg-LED display BSF INTCON,TMR0IE ;タイマ割り込み許可 BSF INTCON,GIE ;全体割り込み許可 BTFSS HF,0 ;If Hold Flag is set CALL LEDOFF ;If Hold Flag is clear BTFSS PORTA,5 ;Sellect SW GOTO SEL10 ;Sellect SW is clear SEL1 ;Sellect SW is set(count/1sec) BSF HF,0 MOVF TU,0 ;TUレジスタが200でリセット(5msec*200=1sec) ADDLW 0x38 ;256-200=56=0x38 BTFSS STATUS,C GOTO CINI ;Counting CLRF TU MOVF N1,0 ;計数保持 MOVWF N5 MOVF N2,0 MOVWF N6 MOVF N3,0 MOVWF N7 MOVF N4,0 MOVWF N8 CLRF N1 CLRF N2 CLRF N3 CLRF N4 GOTO MAIN ; SEL10 ;1sec毎にLED点滅 MOVF TU,0 ;TUレジスタが200でリセット(5msec*200=1sec) ADDLW 0x38 ;256-200=56=0x38 BTFSS STATUS,C GOTO CINI CALL HFEX CLRF TU INCF TM,1 ;TM=TM+1(sec) MOVF TM,0 ADDLW 0xF6 ;256-10=246=0xF6 BTFSS STATUS,C GOTO CINI CLRF TU CLRF TM SELX ;10sec毎に表示 MOVF N1,0 ;計数保持 MOVWF N5 MOVF N2,0 MOVWF N6 MOVF N3,0 MOVWF N7 MOVF N4,0 MOVWF N8 CLRF N1 CLRF N2 CLRF N3 CLRF N4 GOTO MAIN ; CINI BTFSS PORTA,4 ;RA4がクリアならばMAINへ GOTO CPAS BSF ON,0 ;(ON,0)をセット GOTO MAIN CPAS BTFSS ON,0 ;(ON,0)がクリアならばMAINへ GOTO MAIN PDOWN ;パルスの立下りを検出 MOVF TMR1H,0 ADDLW 0xF9 BTFSS STATUS,C ;TMR1H=256-7=249=0xF9 GOTO T1CLR MOVF TMR1L,0 ADDLW 0x30 BTFSC STATUS,C ;TMR1L=256-208=48=0x30 GOTO CSTART ;TMR=7*256+208=2000=1msec/(0.125usec*4) T1CLR ;TMR1リスタート CLRF TMR1H CLRF TMR1L MOVLW B'00000001' MOVWF T1CON CSTART INCF N1,1 ;N1=N1+1 MOVF N1,0 SUBLW 0x0A BTFSS STATUS,Z GOTO NCL CLRF N1 INCF N2,1 ;桁上がり(N2=N2+1) MOVF N2,0 SUBLW 0x0A BTFSS STATUS,Z GOTO NCL CLRF N2 INCF N3,1 ;桁上がり(N3=N3+1) MOVF N3,0 SUBLW 0x0A BTFSS STATUS,Z GOTO NCL CLRF N3 INCF N4,1 ;桁上がり(N4=N4+1) MOVF N4,0 SUBLW 0x0A BTFSS STATUS,Z GOTO NCL CLRF N4 NCL BCF ON,0 ;(ON,0)をクリア GOTO MAIN ; HFEX BTFSC HF,0 GOTO EX0 BSF HF,0 ;If Hold flag is clear RETURN EX0 BCF HF,0 ;If Hold flag is set RETURN ; LEDOFF CLRF PORTB ;Rev.2 BCF PORTA,0 BCF PORTA,1 BCF PORTA,2 BCF PORTA,3 RETURN ; DSP ;7seg-LED display LX0 MOVF LX,1 BTFSS STATUS,Z GOTO LX1 BTFSC PORTA,0 GOTO LXE MOVF N5,0 MOVWF N CALL SEG MOVWF PORTB BSF PORTA,0 ;RA0点灯(7-SEGがカソードコモンのため、NPNTr使用) GOTO LXE LX1 MOVF LX,0 SUBLW 0x01 BTFSS STATUS,Z GOTO LX2 BTFSC PORTA,1 GOTO LXE MOVF N6,0 MOVWF N CALL SEG MOVWF PORTB BSF PORTA,1 ;RA1点灯(7-SEGがカソードコモンのため、NPNTr使用) GOTO LXE LX2 MOVF LX,0 SUBLW 0x02 BTFSS STATUS,Z GOTO LX3 BTFSC PORTA,2 GOTO LXE MOVF N7,0 MOVWF N CALL SEG MOVWF PORTB BSF PORTA,2 ;RA2点灯(7-SEGがカソードコモンのため、NPNTr使用) GOTO LXE LX3 MOVF LX,0 SUBLW 0x03 BTFSS STATUS,Z GOTO LXE BTFSC PORTA,3 GOTO LXE MOVF N8,0 MOVWF N CALL SEG MOVWF PORTB BSF PORTA,3 ;RA3点灯(7-SEGがカソードコモンのため、NPNTr使用) LXE RETURN ; SEG ;7SEG変換 MOVF N,1 BTFSC STATUS,Z RETLW B'01111110' ;0 MOVF N,0 SUBLW 0x01 BTFSC STATUS,Z RETLW B'00110000' ;1 MOVF N,0 SUBLW 0x02 BTFSC STATUS,Z RETLW B'01101101' ;2 MOVF N,0 SUBLW 0x03 BTFSC STATUS,Z RETLW B'01111001' ;3 MOVF N,0 SUBLW 0x04 BTFSC STATUS,Z RETLW B'00110011' ;4 MOVF N,0 SUBLW 0x05 BTFSC STATUS,Z RETLW B'01011011' ;5 MOVF N,0 SUBLW 0x06 BTFSC STATUS,Z RETLW B'01011111' ;6 MOVF N,0 SUBLW 0x07 BTFSC STATUS,Z RETLW B'01110000' ;7 MOVF N,0 SUBLW 0x08 BTFSC STATUS,Z RETLW B'01111111' ;8 MOVF N,0 SUBLW 0x09 BTFSC STATUS,Z RETLW B'01111011' ;9 RETLW B'01001111' ;E ; END