;--------------------------------------------------------------------- ; 半田ごて切り忘れタイムスイッチ(デッドマンスイッチ) ; 2008.10.22 T.Nakamura ; ; 指定時間以内にハートビート(タクトスイッチ操作)を送らないと、 ; 電源オフとなるスイッチ。半田ごての消し忘れセーフスイッチ。 ; ; (1). 電源オン時には通電はオフ ; (2). ハートビートを送れば通電となり、指定時間のカウントダウン開始 ; (3). 制限時間内にハートビートを送れば残り時間は初期値にリセット ; (4). 残り時間1分時にビープ音 ; (5). 残り時間3秒でカウントダウンのビープ音 ; (6). 時間切れでビープ音後に通電オフ ; (7). 一旦スイッチがオフになったら、電源を再投入しないと通電しない ; ; ※電源オン後、ハートビート前に時間設定タクトスイッチを押すことで ; 制限時間をカウントアップ(5分〜95分まで5分単位)。 ; タクトスイッチ操作を2秒ほど行わないと、設定完了しハートビート待ち。 ; 設定時間はEEPROMに記憶し、電源オフ後も保持。 ; (頻繁に設定変更することは想定していない) ;--------------------------------------------------------------------- ; (1). RA0〜1 [out] : 7セグLED(アノード側)RA0:1の位、RA1:10の位 ; (2). RB0〜7 [out] : 7セグLED各セグメント(カソード側) ; (3). RA2 [out] : ソリッドステートリレー制御(LEDアノード) ; (4). RA3 [out] : 圧電ブザー ; (5). RA4 [in] : タクトSW(内部プルアップ) : ハートビート ; (6). RA5 [in] : タクトSW(内部プルアップ) : 時間設定 ;--------------------------------------------------------------------- ; ;--------------------------------------------------------------------- ; デバイス定義 ;--------------------------------------------------------------------- LIST P=PIC16F648A ;CPUの種類 INCLUDE "P16F648A.INC" __CONFIG _CP_OFF & _BODEN_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _LVP_OFF ERRORLEVEL -302 ;アセンブル時のバンク警告メッセージ抑制 ;--------------------------------------------------------------------- ; 変数レジスタの定義(BANK0) ;--------------------------------------------------------------------- ; 表示関係 ;--------------------------------------------------------------------- RABUF EQU 020H ; PORTAバッファ RBBUF EQU 021H ; PORTBバッファ LEDBUF1 EQU 022H ; LED表示バッファ(1桁目; 1の位) LEDBUF2 EQU 023H ; LED表示バッファ(2桁目;10の位) DIG1 EQU 024H ; 残り時間(分)の 1の位 DIG10 EQU 025H ; 残り時間(分)の10の位 DSPFLG EQU 026H ; 0ビット: ドット点滅用フラグ ; 1ビット: 1桁目のドット点滅用フラグ SEGCNT EQU 027H ; LEDのセグメントカウンタ(0〜15:2桁分) DIGPTN EQU 028H ; 数字の形状パターン LEDNO EQU 029H ; 表示するLED(01か10)アノード側信号 IDLNO EQU 02AH ; IDLE時のアニメーション番号 ; ;--------------------------------------------------------------------- ; 時間関係 ;--------------------------------------------------------------------- TIMEL EQU 030H ; 1秒カウンタLOW TIMEH EQU 031H ; 1秒カウンタHIGH TIMFLG EQU 032H ; 0ビット: 1秒毎に1になる SEC EQU 033H ; 秒 MIN EQU 034H ; 分 TIMEIDL EQU 035H ; IDLE時のアニメーション時間カウンタ WAITSEC EQU 036H ; スイッチが押されない時間測定カウンタ ; ;--------------------------------------------------------------------- ; 入力関係(タクトスイッチ状態検出) ;--------------------------------------------------------------------- SWFLG EQU 037H ; 0ビット:ハートビートSW状態(0:off, 1:on) ; 1ビット:時間設定SW状態(0:off, 1:on) CHATCNT EQU 038H ; チャタリング除去用カウンタ ; ;--------------------------------------------------------------------- ; ビープ音関係 ;--------------------------------------------------------------------- WCNT1 EQU 040H ; ウェイトカウンタ WCNT2 EQU 041H ; ウェイトカウンタ WCNT3 EQU 042H ; ウェイトカウンタ BCNT1 EQU 043H ; ビープ用 BWCNT EQU 044H ; ビープ用 BWCNT1 EQU 045H ; ビープ用 ; ;--------------------------------------------------------------------- ; 割り込み関係 ;--------------------------------------------------------------------- BKUPW EQU 052H ; Wレジ待避用 BKUPS EQU 053H ; STATUSレジ待避用 BKUPFR EQU 054H ; FSRレジ待避用 BKUPPCL EQU 055H ; PCLHレジ待避用 ; ;--------------------------------------------------------------------- ; その他 ;--------------------------------------------------------------------- WK1 EQU 060H WK2 EQU 061H ; EE_ADDR EQU 064H ; EEPROMアドレス EE_DATA EQU 065H ; EEPROMデータ ; ;--------------------------------------------------------------------- ; EEPROMデータ(デフォルト時間:15分) ;--------------------------------------------------------------------- ORG H'2100' DE D'15' ; ;--------------------------------------------------------------------- ; マクロ定義 ;--------------------------------------------------------------------- BANK0 MACRO BCF STATUS,RP0 ;BANK0に切り替える ENDM BANK1 MACRO BSF STATUS,RP0 ;BANK1に切り替える ENDM ;--------------------------------------------------------------------- ; リセットベクタ ;--------------------------------------------------------------------- ORG 00H ; リセット時の飛び込み先 RESET GOTO MAIN ; メイン処理へ ; ORG 04H ; 割り込み時の飛び込み先 GOTO INTRUPT ;--------------------------------------------------------------------- ; メイン処理 ;--------------------------------------------------------------------- MAIN CALL INIT ; 初期化 ; CALL TRGHEART ; 最初のハートビート待ち BTFSS SWFLG,1 ; 制限時間設定SWが押された GOTO START CALL SETTIME ; 時間設定を行う GOTO MAIN ; START CALL POWERON ; 電源ON MAINLOOP CALL GETTIME ; 制限時間をEEPROMから取り出して設定 CALL DSPTIME ; 残り時間表示 CALL INIT2 ; 時間関係のレジスタクリア CDWNLOOP CALL TRGSEC ; 秒トリガ か ハートビート待ち BTFSS TIMFLG,0 ; 秒トリガならカウントダウン GOTO MAINLOOP ; ハートビートなら初期状態に戻る DECSEC BCF TIMFLG,0 ; 秒トリガ解除 CALL BLINKDOT ; ドットの点滅 ; CALL CONTDWN ; カウントダウン BTFSS STATUS,Z ; Z=1ならタイムアウト GOTO CDWNLOOP ; TIMEOUT CALL DSPOFF ; 'OF.'の表示 CALL POWEROFF ; 電源OFF CALL BEEP2 ; タイムアウトBEEP(ポーン) GOTO $ ; ;--------------------------------------------------------------------- ; 初期化 ;--------------------------------------------------------------------- INIT BCF INTCON,GIE ;全割込み禁止 BANK1 MOVLW B'00110000' MOVWF TRISA ; ポートAはRA4,5以外出力 MOVLW B'00000000' MOVWF TRISB ; ポートBは全て出力 ; 割り込みタイマーセット MOVLW H'81' ; プリスケーラを1:4にする MOVWF OPTION_REG ; 976.5625Hzで割り込みが入るはず ; clock4MHz -> 1Mcycle ; 1Mcycle/256/4 = 976.5625Hz ; LED 16segmentの書き換え 976.5625/16=約61Hz BANK0 MOVLW 0x07 ; コンパレータOFF MOVWF CMCON ; ; CLRF PORTA ; PORTクリア CLRF PORTB CLRF RABUF ; PORTバッファクリア CLRF RBBUF CLRF SEGCNT ; LED SEGMENTカウンタクリア MOVLW D'10' MOVWF LEDBUF1 ; LEDバッファ消灯 MOVWF LEDBUF2 ; LEDバッファ消灯 CLRF DSPFLG ; LED表示フラグクリア CLRF SWFLG ; SWフラグクリア CLRF TIMEIDL ; IDLE時のアニメ用時間カウンタクリア CLRF IDLNO ; IDLE時のアニメ番号カウンタクリア MOVLW D'10' ; チャタリング回避カウンタ(約10ms) MOVWF CHATCNT ; BSF INTCON,T0IE ; タイマ0割り込みイネーブル BSF INTCON,GIE ; 割り込み許可 RETURN ; INIT2 CLRF TIMEL CLRF TIMEH CLRF TIMFLG ; 時間フラグクリア ; RETURN ;--------------------------------------------------------------------- ; 割り込み処理でダイナミック表示を行う。 ;--------------------------------------------------------------------- INTRUPT ;レジスタ待避 MOVWF BKUPW ;バックアップ(Wレジ) SWAPF STATUS,W ;バックアップ(STATUSレジ) MOVWF BKUPS MOVF FSR,W ;バックアップ(FSRレジ) MOVWF BKUPFR MOVF PCLATH,W ;バックアップ(PCLATHレジ) MOVWF BKUPPCL ; BCF INTCON,T0IF ;割り込みフラグリセット ; INCF TIMEIDL,F ; アニメ用カウンタUP INCF TIMEL,F ; 1秒を計るカウンタUP BTFSC STATUS,Z INCF TIMEH,F ; 桁上げがあったらHIGHカウンタUP ; MOVLW H'03' ; 977になったら1秒とする SUBWF TIMEH,W ; 正確には976.5625で1秒なので、 BTFSS STATUS,Z ; 0.0448%の誤差→90分で約2.4秒長くなる GOTO CHKSW ; しかし内蔵発振の誤差が±1%なので無視できる MOVLW D'209' ; 256*3+209=977 SUBWF TIMEL,W BTFSS STATUS,Z GOTO CHKSW CLRF TIMEL CLRF TIMEH BSF TIMFLG,0 ; 1秒経ったのでTIMFLG(0)=1 ; ; タクトスイッチの状態確認 ; CHKSW DECFSZ CHATCNT,F GOTO CHKSW_E ; BCF SWFLG,0 ; OFF BTFSS PORTA,4 ; ハートビートスイッチ状態確認(active low) BSF SWFLG,0 ; ON ; BCF SWFLG,1 ; OFF BTFSS PORTA,5 ; 時間設定スイッチ状態確認(active low) BSF SWFLG,1 ; ON ; MOVLW D'10' ; 10回(約10ミリ秒)でチャタリング回避 MOVWF CHATCNT CHKSW_E ; DSPLED ; ; 表示バッファの内容を1セグメント分出力 ; ; SEGCNT:0〜7なら1桁目のLED, 8〜15なら2桁目 BCF DSPFLG,1 ; 1桁目だけドットを点滅させるフラグ BTFSC SEGCNT,3 GOTO DSPLED2 DSPLED1 ; 1桁目 MOVLW H'01' MOVWF LEDNO MOVF LEDBUF1,W ; 1桁目の値 BTFSC DSPFLG,0 ; ドット点滅フラグ BSF DSPFLG,1 GOTO DSPLED0 DSPLED2 ; 2桁目 MOVLW H'02' MOVWF LEDNO MOVF LEDBUF2,W ; 2桁目の値 DSPLED0 CALL DECSEG ; セグメント表示データに変換 MOVWF DIGPTN BTFSC DSPFLG,1 ; ドット表示 BSF DIGPTN,7 ; ; 今のSEGCNTと一致したら表示(LOWにする) MOVF SEGCNT,W ANDLW H'07' ; 下位3ビット(セグメント番号) CALL DECBIT ; ビット位置に変換 ANDWF DIGPTN,F COMF DIGPTN,W ; 反転(カソード側をLOWにする) MOVWF RBBUF ; PORTBバッファ格納 ; MOVLW B'11111100' ANDWF RABUF,W ; LEDアノードをLOW(一旦両LED消灯) MOVWF PORTA ; MOVF RBBUF,W MOVWF PORTB ; PORTB(カソード側設定) MOVF LEDNO,W IORWF RABUF,W MOVWF PORTA ; PORTA 設定 ; NXTSEG INCF SEGCNT,W ANDLW H'0F' ; SEGCNTは0〜15 MOVWF SEGCNT ; RSTREG ;レジスタ復元 MOVF BKUPPCL,W ;復元(PCLATHレジ) MOVWF PCLATH MOVF BKUPFR,W ;復元(FSRレジ) MOVWF FSR SWAPF BKUPS,W ;復元(STATUSレジ) MOVWF STATUS SWAPF BKUPW,F ;復元(Wレジ) SWAPF BKUPW,W ; RETFIE ;割り込みから復帰 ; ;--------------------------------------------------------------------- ; 7seg LEDパターン定義 ;--------------------------------------------------------------------- DECSEG CLRF PCLATH ; ADDWF PCL,F RETLW B'00111111' ; 0 RETLW B'00000110' ; 1 RETLW B'01011011' ; 2 RETLW B'01001111' ; 3 RETLW B'01100110' ; 4 RETLW B'01101101' ; 5 RETLW B'01111101' ; 6 RETLW B'00000111' ; 7 RETLW B'01111111' ; 8 RETLW B'01101111' ; 9 RETLW B'00000000' ; 10: ; ゼロサプレス用(非表示) RETLW B'11110001' ; 11: F. ; 通電OFF時のF表示 RETLW B'00000001' ; 12: aセグのみ表示 RETLW B'00000010' ; 13: bセグのみ表示 RETLW B'00000100' ; 14: cセグのみ表示 RETLW B'00001000' ; 15: dセグのみ表示 RETLW B'00010000' ; 16: eセグのみ表示 RETLW B'00100000' ; 17: fセグのみ表示 RETLW B'01000000' ; 18: gセグのみ表示 RETLW B'10000000' ; 19: DOTのみ表示 ; DECBIT CLRF PCLATH ADDWF PCL,F RETLW B'00000001' ; 0 RETLW B'00000010' ; 1 RETLW B'00000100' ; 2 RETLW B'00001000' ; 3 RETLW B'00010000' ; 4 RETLW B'00100000' ; 5 RETLW B'01000000' ; 6 RETLW B'10000000' ; 7 ; ;--------------------------------------------------------------------- ; 制限時間の設定 ;--------------------------------------------------------------------- SETTIME CALL GETTIME ; 現状の制限時間をEEPROMから取り出して設定 CALL DSPTIME ; 時間表示 ; SETTIM1 BTFSC SWFLG,1 ; 離されるまで待つ GOTO $-1 CLRF TIMEL ; 秒カウンタクリア CLRF TIMEH CLRF WAITSEC BCF TIMFLG,0 ; SETTIM2 BTFSC SWFLG,1 ; 押されるまで待つ GOTO SETTIM3 ; 押されたので分インクリメント ; BTFSS TIMFLG,0 ; 秒トリガ確認 GOTO SETTIM2 ; トリガ無しなのでループ ; INCF WAITSEC,F BCF TIMFLG,0 ; 秒トリガクリア MOVLW D'2' ; 2秒押されなかったら確定 SUBWF WAITSEC,W BTFSS STATUS,Z GOTO SETTIM2 GOTO SETTIM4 ; 時間確定(EEPROMへ記録) ; SETTIM3 MOVF MIN,W SUBLW D'95' BTFSC STATUS,Z ; 最大95分 CLRF MIN MOVLW D'5' ; 5分毎にインクリメント ADDWF MIN,F CALL DSPTIME ; 時間表示 GOTO SETTIM1 ; SETTIM4 ; EEPROMへ設定時間を記録 MOVLW H'00' MOVWF EE_ADDR; MOVF MIN,W MOVWF EE_DATA CALL WRTEEP ; 書き込み RETURN ; ;--------------------------------------------------------------------- ; 秒トリガ か ハートビート待ち(秒トリガ TIMFLG[0]=1) ;--------------------------------------------------------------------- TRGSEC BTFSC TIMFLG,0 ; 秒トリガ確認 RETURN BTFSS SWFLG,0 ; SW状態確認(押されるのを待つ) GOTO TRGSEC ; CHKREL BTFSC TIMFLG,0 ; 秒トリガ確認 RETURN BTFSC SWFLG,0 ; SW状態確認(離されるのを待つ) GOTO CHKREL RETURN ; SWが押されて、離されたら初期値に戻る ; ;--------------------------------------------------------------------- ; 最初のハートビート待ち(最初のカウントダウントリガ) ;--------------------------------------------------------------------- TRGHEART CALL DSPIDL ; IDLEアニメ表示 BTFSC SWFLG,1 ; 時間設定SW状態確認 RETURN ; 押されていたらリターン BTFSS SWFLG,0 ; ハートビートSW状態確認(押されるのを待つ) GOTO TRGHEART ; CALL DSPIDL ; IDLEアニメ表示 BTFSC SWFLG,0 ; SW状態確認(離されるのを待つ) GOTO $-2 RETURN ; ;--------------------------------------------------------------------- ; 電源ON(IDLE)時 LED表示(最初のハートビートまで続く) ;--------------------------------------------------------------------- DSPIDL MOVF TIMEIDL,W SUBLW D'80' ; 128で約0.08秒、8パターンのアニメで約0.6秒 BTFSS STATUS,Z RETURN CLRF TIMEIDL ; MOVF IDLNO,W CALL IDLPTN1 MOVWF LEDBUF1 ; MOVF IDLNO,W CALL IDLPTN2 MOVWF LEDBUF2 ; INCF IDLNO,F ; IDLNOは0〜7 MOVLW H'07' ANDWF IDLNO,F RETURN IDLPTN1 ; LED 1 CLRF PCLATH ADDWF PCL,F RETLW D'15' RETLW D'10' RETLW D'10' RETLW D'10' RETLW D'10' RETLW D'12' RETLW D'13' RETLW D'14' IDLPTN2 ; LED 2 CLRF PCLATH ADDWF PCL,F RETLW D'10' RETLW D'15' RETLW D'16' RETLW D'17' RETLW D'12' RETLW D'10' RETLW D'10' RETLW D'10' ; ;--------------------------------------------------------------------- ; 残り時間のカウントダウン(タイムアウトならZ=1でリターン) ;--------------------------------------------------------------------- CONTDWN MOVLW D'1' SUBWF SEC,F ; 秒デクリメント BTFSC STATUS,C ; -1なら分デクリメント GOTO CHKTIM ; ; DECF MIN,F ; 分デクリメント MOVLW D'59' MOVWF SEC CALL DSPTIME ; 残り時間表示 ; CHKTIM ; BEEPを鳴らす時間/タイムアウト確認 MOVF MIN,W ; 1分00秒の確認 SUBLW D'1' BTFSS STATUS,Z GOTO CHKTIM2 ; 次の確認 MOVF SEC,F BTFSS STATUS,Z GOTO CHKTIM2 ; 次の確認 ; CALL BEEP ; 残り1分00秒のBEEP GOTO RETCDWN ; リターン CHKTIM2 MOVF MIN,W ; 0分03,02,01秒の確認 BTFSS STATUS,Z GOTO RETCDWN ; 0分ではないのでリターン ; MOVF SEC,F BTFSS STATUS,Z ; 残り0分00秒(タイムアウト) GOTO CHKTIM3 ; CALL BEEP2 ; タイムアウトBEEP(ポーン) ; BSF STATUS,Z RETURN ; タイムアウト時はZ=1でリターン ; CHKTIM3 MOVF SEC,W SUBLW D'3' BTFSC STATUS,C CALL BEEP ; 残り0分03,02,01秒のBEEP ; RETCDWN BCF STATUS,Z ; Z=0でリターン RETURN ; ;--------------------------------------------------------------------- ; ドットの点滅(ON/OFFのトグル、ON) ;--------------------------------------------------------------------- BLINKDOT BTFSS DSPFLG,0 GOTO $+3 BCF DSPFLG,0 GOTO $+2 BSF DSPFLG,0 RETURN ; ;--------------------------------------------------------------------- ; 分を表示(BCD変換して表示バッファに格納) ;--------------------------------------------------------------------- DSPTIME MOVF MIN,W ; 残り時間(分)をWへ CALL BINBCD ; 分をBCD変換 MOVF DIG10,W ; 10の位 BTFSC STATUS,Z MOVLW H'0A' ; ゼロサプレス; 0Aは何も表示しないコード MOVWF LEDBUF2 ; MOVF DIG1,W ; 1の位 MOVWF LEDBUF1 RETURN ;--------------------------------------------------------------------- ; Wレジ値をBCD変換(10の位と1の位に分ける)、10を引き続ける安直な方法 ;--------------------------------------------------------------------- BINBCD MOVWF WK1 MOVLW D'10' CLRF WK2 BINBCDL INCF WK2,F SUBWF WK1,F ; -10 BTFSC STATUS,C GOTO BINBCDL DECF WK2,W MOVWF DIG10 MOVLW D'10' ADDWF WK1,W MOVWF DIG1 RETURN ; ;--------------------------------------------------------------------- ; OFF(OF.)の表示 ;--------------------------------------------------------------------- DSPOFF MOVLW D'0' ; OFF 表示の'0' MOVWF LEDBUF2 MOVLW D'11' ; OFF 表示の'F.' MOVWF LEDBUF1 RETURN ; ;--------------------------------------------------------------------- ; POWER ON/OFF ;--------------------------------------------------------------------- POWERON BCF INTCON,GIE ;全割込み禁止 BSF RABUF,2 ; RA2(ソリッドステートリレー用LED) をON MOVF RABUF,W MOVWF PORTA BSF INTCON,GIE ;全割込み許可 RETURN ; POWEROFF BCF INTCON,GIE ;全割込み禁止 BCF RABUF,2 ; RA2(ソリッドステートリレー用LED) をOFF MOVF RABUF,W MOVWF PORTA BSF INTCON,GIE ;全割込み許可 RETURN ; ;--------------------------------------------------------------------- ; 制限時間を設定(EEPROMデータを読み出す) ;--------------------------------------------------------------------- GETTIME MOVLW H'00' MOVWF EE_ADDR CALL REDEEP ; 前回設定時間をEEPROMから読み出す MOVWF MIN ; 分カウンタ設定 CLRF SEC RETURN ; ;--------------------------------------------------------------------- ; EEPROMへ書き込む(アドレス:EE_ADDR, データEE_DATA) ;--------------------------------------------------------------------- WRTEEP MOVF EE_ADDR,W ;データエリアのアドレス指定 BSF STATUS,RP0 ;BANK1に切り替え MOVWF EEADR ;Address set BCF STATUS,RP0 ;BANK0に戻す ; MOVF EE_DATA,W ;書き込むデータ BSF STATUS,RP0 ;BANK1に切り替え MOVWF EEDATA ;Data set BSF EECON1,WREN ;WRITEイネーブル BCF INTCON,GIE ;割り込み禁止 ;WRITEシーケンス開始 MOVLW 55H ;Write Sequence MOVWF EECON2 ;Start write MOVLW 0AAh MOVWF EECON2 BSF EECON1,WR ;Go write BTFSC EECON1,WR ;wait for write complete GOTO $ - 1 ; BCF EECON1,WREN ;disable EE writes BSF INTCON,GIE ;割り込み許可 BCF STATUS,RP0 ;BANK0に戻す RETURN ;--------------------------------------------------------------------- ; EEPROMから読み出す(アドレス:EE_ADDR, 結果:W) ;--------------------------------------------------------------------- REDEEP MOVF EE_ADDR,W ;データエリアのアドレス指定 BSF STATUS,RP0 ;BANK1に切り替え MOVWF EEADR ;Set address register BSF EECON1,RD ;Start read MOVF EEDATA,W ;wレジスタにデータ取り出し BCF STATUS,RP0 ;BANK0に切り替え RETURN ;--------------------------------------------------------------------- ; BEEP音 1分前(ピッ)、3秒前から(ピッ、ピッ、ピッ、ポーン) ;--------------------------------------------------------------------- BEEP ; ピッ ; MOVLW D'44' ; 0.1秒 MOVLW D'22' ; 0.05秒 MOVWF BCNT1 MOVLW D'226' ; 440Hz ; MOVLW D'112' ; 840Hz MOVWF BWCNT GOTO BEEPL BEEP2 ; ポーン ; MOVLW D'255' ; 0.3秒 MOVLW D'127' ; 0.15秒 MOVWF BCNT1 MOVLW D'112' ; 840Hz ; MOVLW D'55' ; 1.6KHz MOVWF BWCNT BEEPL BCF INTCON,GIE ;全割込み禁止 BCF RABUF,3 ; RA3(圧電ブザー) をLOW MOVF RABUF,W ; 他のI/Oに提供を与えないように。 MOVWF PORTA BSF INTCON,GIE ;全割込み許可 CALL BWAIT ; ; BCF INTCON,GIE ;全割込み禁止 BSF RABUF,3 ; RA3 を HIGH MOVF RABUF,W MOVWF PORTA BSF INTCON,GIE ;全割込み許可 CALL BWAIT ; DECFSZ BCNT1,F GOTO BEEPL RETURN ; BWAIT MOVF BWCNT,W MOVWF BWCNT1 BWAITL NOP NOP DECFSZ BWCNT1,F GOTO BWAITL RETURN ; ;--------------------------------------------------------------------- END ;--------------------------------------------------------------------- ; 終わり ;---------------------------------------------------------------------