;timer.pro... ;by_y.ishizuka LIST P=PIC16F84 INCLUDE "P16F84.INC" ;変数の設定************************************************************************ CNT1 EQU 0CH CNT2 EQU 0DH CNT3 EQU 0EH CNT4 EQU 0FH CNT5 EQU 10H SETT EQU 11H ;リセット************************************************************************** ORG 0 ;リセット ;初期設定************************************************************************** CLRF PORTB ;PORT-Bをオール0 BSF STATUS,RP0 ;バンク1へ CLRF TRISB ;PORT-Bを全て出力として設定 MOVLW H'000F' ;00001111 MOVWF TRISA ;PORT RA0からRA3を入力として設定 BCF STATUS,RP0 ;バンク0へ MOVLW H'00EF' ;11101111(RB4以外を全てHレベル) MOVWF PORTB ;POTR-Bに出力 ;スイッチの確認******************************************************************** COMF PORTA,W ;PORT-Aの情報を反転してWレジスタへ ANDLW H'000F' ;bit0-3のフィルター MOVWF SETT ;SETTレジスタへ格納 MOVF SETT ;Zフラグを変化 BZ LOOP ;0であればラベルLOOPへ0以外であれば次の行へ CALL LOOPSET ;ラベルLOOPSETへ MOVLW H'0000' ;00000000 MOVWF PORTB ;PORT-Bを全てLレベルに GOTO LOOP ;ラベルLOOPへ ;無限ループ************************************************************************ LOOP GOTO LOOP ;無限ループ ;0.5秒タイマ*********************************************************************** TIME500 MOVLW H'0014' ;14h MOVWF CNT3 ;CNT3レジスタに移動 LOOP3 MOVLW H'00F7' ;F7h MOVWF CNT4 ;CNT4レジスタに移動 NOP ;何もせず(時間の微調整) NOP ;何もせず(時間の微調整) NOP ;何もせず(時間の微調整) LOOP4 MOVLW H'0053' ;53h MOVWF CNT5 ;CNT5レジスタに移動 LOOP5 DECFSZ CNT5,F ;CNT5から1を引いて0ならば次の命令をスキップ GOTO LOOP5 ;ラベルLOOP5へ DECFSZ CNT4,F ;CNT4から1を引いて0ならば次の命令をスキップ GOTO LOOP4 ;ラベルLOOP4へ DECFSZ CNT3,F ;CNT3から1を引いて0ならば次の命令をスキップ GOTO LOOP3 ;ラベルLOOP3へ RETURN ;元に戻る ;0.5秒毎にLEDの点滅(1秒タイマ)***************************************************** LED CALL TIME500 ;ラベルTIME500(0.5秒タイマ)へ MOVLW H'00FF' ;11111111 MOVWF PORTB ;PORT-Bを全てHレベルに CALL TIME500 ;ラベルTIME500(0.5秒タイマ)へ MOVLW H'00EF' ;11101111 MOVWF PORTB ;RB4のみLレベルに RETURN ;元に戻る ;1分タイマ************************************************************************* TIME2 MOVLW H'003C' ;003Ch(60) MOVWF CNT2 ;CNT2レジスタに移動 LOOP2 CALL LED ;ラベルLEDへ DECFSZ CNT2,F ;CNT2から1を引いて0ならば次の命令をスキップ GOTO LOOP2 ;ラベルLOOP2へ RETURN ;元に戻る ;1時間タイマ*********************************************************************** TIME1 MOVLW H'003C' ;003Ch(60) MOVWF CNT1 ;CNT1レジスタに移動 LOOP1 CALL TIME2 ;ラベルTIME2(1分タイマ)へ DECFSZ CNT1,F ;CNT1から1を引いて0ならば次の命令をスキップ GOTO LOOP1 ;ラベルLOOP1へ RETURN ;元に戻る ;設定時間のカウント**************************************************************** LOOPSET CALL TIME1 ;ラベルTIME1(1時間タイマ)へ DECFSZ SETT,F ;SETTから1を引いて0ならば次の命令をスキップ GOTO LOOPSET ;ラベルLOOPSETへ RETURN ;元に戻る END