;--------------------------------------------------------------------- ; マトリックスLED内を動き回るワーム(に見えるか?) ; ; 2008.06.30 T.Nakamura ; ; (1). RC0〜7 [out] : 行(データポート) LEDアノード側 ; (2). RA0〜2,4,RB4〜7 [out] : 列(スキャンポート) LEDカソード側 ; (3). RA3 [in] : タクトスイッチ ; (4). RA5 [out] : 圧電ブザー ;--------------------------------------------------------------------- ;--------------------------------------------------------------------- ; デバイス定義 ;--------------------------------------------------------------------- LIST P=PIC16F689 INCLUDE "P16F689.INC" __CONFIG _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT ERRORLEVEL -302 ;アセンブル時のバンク警告メッセージ抑制 ;--------------------------------------------------------------------- ; 変数レジスタの定義(マトリックスLEDプラットフォーム) ;--------------------------------------------------------------------- DSPBUF EQU 020H ; 表示バッファ 8バイト(20H〜27H, 28H) ; ; 28HはLEDなし(スクロール時の次の列データ) ROWCNT EQU 029H ; マトリックスLEDのROWカウンタ FLAG EQU 02AH ; 各種フラグ 0ビット:LED点灯:1,消灯:0 ; 1ビット:SW-変化:1,変化なし:0 ; 2ビット:SW-ON:1,OFF:0 BKUPW EQU 02BH ; Wレジ待避用 BKUPS EQU 02CH ; STATUSレジ待避用 BKUPFR EQU 02DH ; FSRレジ待避用 BKUPPCL EQU 02EH ; PCLHレジ待避用 BKPORTA EQU 02FH ; PORTA状態(ビープ音用) ; POSX EQU 030H ; LED座標X POSY EQU 031H ; LED座標Y BUFCNT1 EQU 032H ; 表示バッファ作業用 BUFCNT2 EQU 033H ; 表示バッファ作業用 CNT EQU 034H ; カウンタ WCNT1 EQU 035H ; ウェイトカウンタ WCNT2 EQU 036H ; ウェイトカウンタ BCNT1 EQU 037H ; ビープ用 BWCNT1 EQU 038H ; ビープ用 CHATCNT EQU 039H ; チャタリング除去用カウンタ ; MSGCNT EQU 03AH ; メッセージカウンタ MSGPTR EQU 03BH ; メッセージポインタ ; ;--------------------------------------------------------------------- ; 変数レジスタの定義(アプリ用) ;--------------------------------------------------------------------- WMBODY EQU 040H ; ワーム胴体 5バイト(40H〜44H) ; 各1バイトの上位4bit:X座標,下位4bit:Y座標 WMHPTR EQU 045H ; ワームの頭を指すポインタ WWMHPTR EQU 046H ; 〃(作業用) NOWDIR EQU 047H ; ワームの頭が向かっている方向 NXTPOSX EQU 048H ; 次にワームの頭が移る位置X座標 NXTPOSY EQU 049H ; 次にワームの頭が移る位置Y座標 NXTDIR EQU 04AH ; 次にワームの頭が向かう方向 ; WKPOSX EQU 04DH ; 作業用X座標 WKPOSY EQU 04EH ; 作業用Y座標 WK1 EQU 04FH ; 作業用 WK2 EQU 050H ; 作業用 ; RNDVAL EQU 051H ; 乱数 WDCNT EQU 052H ; ワッチドッグカウンタ(袋小路脱出用) SPCNT EQU 053H ; スピード(Wait時間再計算カウンタ) SPDAT EQU 054H ; スピード(Wait時間) ; MOVCNT EQU 055H ; 移動カウンタ ; ;--------------------------------------------------------------------- ; マクロ定義 ;--------------------------------------------------------------------- BANK0 MACRO BCF STATUS,RP0 ;BANK0に切り替える BCF STATUS,RP1 ; ENDM BANK1 MACRO BSF STATUS,RP0 ;BANK1に切り替える BCF STATUS,RP1 ; ENDM BANK2 MACRO BCF STATUS,RP0 ;BANK2に切り替える BSF STATUS,RP1 ; ENDM ; ;--------------------------------------------------------------------- ; リセットベクタ ;--------------------------------------------------------------------- ORG 00H ; リセット時の飛び込み先 GOTO MAIN ; ; ORG 04H ; 割り込み時の飛び込み先 GOTO INTRUPT ; ;--------------------------------------------------------------------- ; メイン処理 ;--------------------------------------------------------------------- MAIN CALL INIT ; 初期化 MAINLOOP INCF MOVCNT,F CALL SETSPEED ; スピード設定 CALL WAIT CALL CLICK CALL NXTPOS ; 次の方向と座標決定 CALL MOVWORM ; ワーム移動 BTFSC FLAG,2 ; SWが押されたか確認 GOTO MAIN GOTO MAINLOOP ; ;--------------------------------------------------------------------- ; 初期化 ;--------------------------------------------------------------------- INIT BCF INTCON,GIE ;全割込み禁止 BANK2 CLRF ANSEL CLRF ANSELH BANK1 MOVLW B'11001000' MOVWF TRISA ; ポートAはBIT0,1,2,4,5を出力、3を入力端子 CLRF TRISB ; ポートBは全て出力端子 CLRF TRISC ; ポートCは全て出力端子 ; 割り込みタイマーセット MOVLW H'82' ;プリスケーラを1:8にする MOVWF OPTION_REG ;約488ヘルツで割り込みが入るはず BANK0 ;clock4MHz -> 1Mcycle ;1Mcycle/256/8 = 488Hz ; CLRF PORTA ; PORTクリア CLRF PORTB ; CLRF ROWCNT ; LED ROWカウンタクリア CALL CLRDPBUF ; LEDバッファクリア CALL RANDINT ; 乱数初期化 CLRF FLAG ; 各種フラグクリア CLRF MOVCNT ; 移動カウンタ ; BSF INTCON,T0IE ; タイマ0割り込みイネーブル BSF INTCON,GIE ; 割り込み許可 ; CALL MESSAGE ; 起動メッセージ CALL BEEP ; CALL SETSPINT ; スピード設定の初期化 CALL CLRWORM ; ワーム初期化 CALL FPOSDIR ; 最初の位置と方向を決める 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 ;割り込みフラグリセット ; ; タクトスイッチの状態確認 ; BTFSS FLAG,1 ; FLAG:1がONならSWが変化 GOTO CHKSW ; SWの状態確認へ DECFSZ CHATCNT,F ; チャタリングカウンタをデクリメント GOTO DSPLED ; まだ判断には早い ; SW状態確認 BCF FLAG,1 ; 変化フラグクリア BCF FLAG,2 ; FLAGクリア BTFSS PORTA,3 ; Highなら押されていないので次スキップ BSF FLAG,2 ; SWは押された GOTO DSPLED CHKSW BTFSS PORTA,3 GOTO CHKLOW ; Low:押されている ; High 押されていない BTFSS FLAG,2 ; 変化を確認 GOTO DSPLED ; 変化していない GOTO TOGGLE ; 変化した CHKLOW BTFSC FLAG,2 ; 変化を確認 GOTO DSPLED ; 変化していない TOGGLE BSF FLAG,1 ; 変化フラグをON MOVLW D'20' MOVWF CHATCNT ; チャタリング回避カウンタセット DSPLED ; ; 表示バッファの内容を1行分(1行)出力 ; 次の行データを出力する前に受け側portをHIGH(消灯) ; MOVLW B'11111111' ; MOVWF PORTB ; PORTB出力 BTFSS BKPORTA,5 ; PORTA(5) 確認(ビープ状態確認) MOVLW B'11011111' ; PORTA(5) LOW MOVWF PORTA ; PORTA出力 MOVWF BKPORTA ; PORTA状態記憶 ; MOVF ROWCNT,W ADDLW DSPBUF ; DSPバッファアドレス加算 MOVWF FSR MOVF INDF,W MOVWF PORTC ; PORTCに1行分のデータ出力 ; BTFSC ROWCNT,2 ; 4以上ならPORTBを設定 GOTO SETPRTB ; MOVF ROWCNT,W CALL DECPORTA BTFSS BKPORTA,5 ; PORTA(5) 確認 ANDLW B'11011111' ; PORTA(5) LOW MOVWF PORTA ; PORTA出力 MOVWF BKPORTA ; PORTA状態記憶 MOVLW B'11111111' MOVWF PORTB ; PORTB出力 GOTO NXTROW ; 次の行にROWCNT設定 SETPRTB MOVLW D'4' SUBWF ROWCNT,W CALL DECPORTB MOVWF PORTB ; PORTB出力 MOVLW B'11111111' BTFSS BKPORTA,5 ; PORTA(5) 確認 ANDLW B'11011111' ; PORTA(5) LOW MOVWF PORTA ; PORTA出力 MOVWF BKPORTA ; PORTA状態記憶 ; NXTROW INCF ROWCNT,W ANDLW H'07' ; ROWCNTは0〜7 MOVWF ROWCNT ; RSTREG ;レジスタ復元 MOVF BKUPPCL,W ;復元(PLCATHレジ) MOVWF PCLATH MOVF BKUPFR,W ;復元(FSRレジ) MOVWF FSR SWAPF BKUPS,W ;復元(STATUSレジ) MOVWF STATUS SWAPF BKUPW,F ;復元(Wレジ) SWAPF BKUPW,W ; RETFIE ;割り込みから復帰 ; DECPORTA CLRF PCLATH ; ADDWF PCL,F RETLW B'11111110' ; 0 RETLW B'11111101' ; 1 RETLW B'11111011' ; 2 RETLW B'11101111' ; 4 ; DECPORTB CLRF PCLATH ; ADDWF PCL,F RETLW B'11101111' ; 4 RETLW B'11011111' ; 5 RETLW B'10111111' ; 6 RETLW B'01111111' ; 7 ; ;--------------------------------------------------------------------- ; スピード(遅延時間)設定 ;--------------------------------------------------------------------- SETSPINT MOVLW D'1' MOVWF SPCNT SETSPEED DECFSZ SPCNT,F RETURN ; CALL RANDOM ; 1〜255の乱数 ANDLW H'07' ; 1〜7の範囲を取り出す MOVWF SPCNT ; 速度変更までのカウンタ BCF STATUS,C RLF SPCNT,F RLF SPCNT,F RLF SPCNT,F ; 8,16,24,32,40,48,56の7段階 MOVF SPCNT,W SUBLW D'80' ; 80 - SPCNT MOVWF SPDAT ; 24〜72 RETURN ; ;--------------------------------------------------------------------- ; Wレジ値をビット位置にデコード ;--------------------------------------------------------------------- DECBIT CLRF PCLATH ADDWF PCL,F DECBIT1 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 ; ;--------------------------------------------------------------------- ; M系列乱数(1〜255) ;--------------------------------------------------------------------- RANDINT MOVLW B'00101010' ; MOVLW B'00000001' MOVWF RNDVAL RANDOM MOVF RNDVAL,W MOVWF WK1 RRF WK1,F RRF WK1,F XORWF WK1,W RRF WK1,F RRF WK1,F XORWF WK1,W RRF WK1,F RRF WK1,F RRF WK1,F XORWF WK1,F BCF STATUS,C BTFSC WK1,0 BSF STATUS,C RLF RNDVAL,F MOVF RNDVAL,W ; XORWF TMR0,W XORWF MOVCNT,W RETURN ; ;--------------------------------------------------------------------- ; 指示座標が胴体(尻尾から2番目)に重なるかチェック ; 指示座標:w ;--------------------------------------------------------------------- CHKBODY MOVWF WK1 MOVLW D'2' SUBWF WMHPTR,W ; WMHPTR-2 が尻尾から2番目 BTFSS STATUS,C ADDLW D'5' ADDLW WMBODY MOVWF FSR MOVF INDF,W SUBWF WK1,W RETURN ; 重なる場合、Z=1でリターン ; ;--------------------------------------------------------------------- ; 次に向かう方向(位置)を決める ; 方向を定め、次の位置を決める(乱数で求めダメな位置の場合はリトライ) ;--------------------------------------------------------------------- NXTPOS MOVLW D'5' MOVWF WDCNT NXTPOS1 CALL RANDOM ; 乱数を得る MOVWF WK2 BTFSS WK2,2 GOTO NXTPOS2 MOVF NOWDIR,W MOVWF NXTDIR GOTO CLCPOS ; NXTPOS2 ANDLW H'03' ; 下位2ビット採用 MOVWF NXTDIR ; ; 現在の方向と比べ、逆方向なら現在の方向 ; ANDLW H'02' ; 1ビット目のみ取り出す XORLW H'02' ; 1ビット目XOR MOVWF WK2 MOVF NXTDIR,W ANDLW H'01' IORWF WK2,F ; これが次の方向と逆方向。 MOVF NOWDIR,W BTFSS STATUS,Z ; もし現在が0なら飛ぶ GOTO COMPNXT ; MOVF WK2,F ; 次も0か調べる BTFSC STATUS,Z GOTO NXTPOS ; 次の方向も0なので不採用 GOTO CLCPOS ; 方向が確定したので座標を求める ; COMPNXT SUBWF WK2,W ; 次の方向の逆方向 − 現在の方向 BTFSS STATUS,Z ; 一致した場合は現在の方向採用 GOTO CLCPOS MOVF NOWDIR,W MOVWF NXTDIR ; CLCPOS ; まず現在の位置を取り出す MOVLW WMBODY ; ワームボディアドレス ADDWF WMHPTR,W ; ワームの頭のポインタを加算 MOVWF FSR SWAPF INDF,W ; ニブルスワップでX座標取り出し ANDLW H'0F' ; 上位4ビットマスク MOVWF NXTPOSX ; X座標(ビット位置) ; MOVF INDF,W ANDLW H'0F' ; 上位4ビットマスク MOVWF NXTPOSY ; Y座標(バイト位置) ; NXTDIR0 MOVF NXTDIR,W BTFSS STATUS,Z GOTO NXTDIR1 ; POSX-- が負なら(POSXが0なら)不採用 MOVF NXTPOSX,F ; 0か? BTFSC STATUS,Z GOTO NXTPOS1 ; 不採用 DECF NXTPOSX,F ; POSX-- GOTO CHKNXT ; NXTDIR1 MOVF NXTDIR,W SUBLW D'1' BTFSS STATUS,Z GOTO NXTDIR2 ; POSY-- が負なら(POSYが0なら)不採用 MOVF NXTPOSY,F BTFSC STATUS,Z GOTO NXTPOS1 ; 不採用 DECF NXTPOSY,F ; POSY-- GOTO CHKNXT ; NXTDIR2 MOVF NXTDIR,W SUBLW D'2' BTFSS STATUS,Z GOTO NXTDIR3 ; POSX++ が8以上なら不採用 INCF NXTPOSX,F BTFSC NXTPOSX,3 ; 3ビット目が1なら8以上 GOTO NXTPOS1 ; 不採用 GOTO CHKNXT ; NXTDIR3 ; POSY++ が8以上なら不採用 INCF NXTPOSY,F BTFSC NXTPOSY,3 ; 3ビット目が1なら8以上 GOTO NXTPOS1 ; 不採用 ; CHKNXT SWAPF NXTPOSX,W ; 次の座標、上位4ビットへ移動 IORWF NXTPOSY,W ; 次の頭の座標 ; CALL CHKBODY ; 自分自身と重なるか? BTFSS STATUS,Z RETURN ; 重ならない DECFSZ WDCNT,F ; 重なるのでワッチドックデクリメント GOTO NXTPOS1 RETURN ; 5回だめなら袋小路なので抜ける ;--------------------------------------------------------------------- ; ワームを移動 ; 尻尾の位置に次の頭の位置格納し、ポインタインクリメント ; 同時に以前の尻尾を消灯、新しい頭を点灯 ;--------------------------------------------------------------------- MOVWORM ; 現在の頭の座標を記憶 MOVLW WMBODY ; ワーム本体アドレス ADDWF WMHPTR,W ; ポインタ加算 MOVWF FSR MOVF INDF,W ; 現在の頭の座標 MOVWF WK1 ; DECF WMHPTR,F ; ワーム頭ポインタをデクリメント(尻尾位置) MOVLW H'FF' SUBWF WMHPTR,W BTFSS STATUS,Z ; 負なら4に戻す GOTO MOVWORM2 MOVLW D'4' MOVWF WMHPTR MOVWORM2 MOVLW WMBODY ; ワーム本体アドレス ADDWF WMHPTR,W ; ポインタ加算 MOVWF FSR BTFSC INDF,7 ; 尻尾座標はまだ表示されていない?(H'FF) GOTO MOVWORM3 MOVF INDF,W ; 尻尾座標 ; 頭と尻尾が重なっていたら消灯しない SUBWF WK1,F BTFSS STATUS,Z CALL TURNOFF ; 尻尾消灯 ; MOVWORM3 MOVLW WMBODY ; ワーム本体アドレス ADDWF WMHPTR,W ; ポインタ加算 MOVWF FSR SWAPF NXTPOSX,F ; 次の座標、上位4ビットへ移動 MOVF NXTPOSY,W IORWF NXTPOSX,W ; 次の頭の座標 ; MOVWF INDF ; 頭の座標格納 CALL TURNON ; 頭点灯 ; MOVF NXTDIR,W ; 方向更新 MOVWF NOWDIR ; RETURN ; ;--------------------------------------------------------------------- ; ワームの初期化(FFで初期化) ;--------------------------------------------------------------------- CLRWORM MOVLW H'FF' MOVWF WMBODY MOVWF WMBODY+1 MOVWF WMBODY+2 MOVWF WMBODY+3 MOVWF WMBODY+4 CLRF WMHPTR RETURN ; ;--------------------------------------------------------------------- ; 最初の出現位置と方向を決める(X:7, Y:0, DIR:2) ;--------------------------------------------------------------------- FPOSDIR MOVLW H'70' MOVWF WMBODY CALL TURNON ; 頭点灯 ; MOVLW D'2' MOVWF NOWDIR ; RETURN ; ;--------------------------------------------------------------------- ; LEDの指定座標を点灯(Wレジ上位4ビット:X座標、下位4ビット:Y座標) ; ; Y:0 1 2 3 4 5 6 7 ;X:0 ○○○○○○○○ ; 1 ○○○○○○○○ 3 ; 2 ○○○○○○○○ ↑ ; 3 ○○○○○○○○ 方向 0 ←○→2 ; 4 ○○○○○○○○ ↓ ; 5 ○○○○○○○○ 1 ; 6 ○○○○○○○○ ; 7 ○○○○○○○○ ; ;--------------------------------------------------------------------- TURNON BSF FLAG,0 ; 点灯 GOTO $+2 TURNOFF BCF FLAG,0 ; 消灯 ; MOVWF POSY ; SWAPF POSY,W ; ANDLW H'0F' ; 上位4ビットマスク MOVWF POSX ; X座標(ビット位置) MOVLW H'0F' ANDWF POSY,F ; Y座標(バイト位置) ; MOVLW DSPBUF ; 表示バッファの先頭アドレス ADDWF POSY,W ; Y座標加算 MOVWF FSR ; インデックスレジスタへ格納 ; MOVF POSX,W CALL DECBIT ; ビット位置に変換 ; BTFSS FLAG,0 ; 点灯1 or 消灯0 GOTO TURNOFF2 IORWF INDF,F ; 指定位置を表示ON RETURN TURNOFF2 XORLW H'FF' ; ビット位置を反転しマスク ANDWF INDF,F ; 指定位置を表示OFF RETURN ; ;--------------------------------------------------------------------- ; MESSAGE出力 ;--------------------------------------------------------------------- MESSAGE CLRF MSGPTR CALL MSGTXT ; メッセージ列数(バイト数)取り出し MOVWF MSGCNT ; INCF MSGCNT,F MSG1 CALL MSGTXT ; メッセージ1列分(1バイト)取り出し MOVWF DSPBUF+8 ; バッファの次列に書き込む CALL DSPBUFST ; 表示バッファを1列分シフト CALL WAIT01S DECFSZ MSGCNT,F GOTO MSG1 CALL DSFTCLR ; 画面をシフトクリア RETURN MSGTXT MOVLW H'01' MOVWF PCLATH MOVF MSGPTR,W INCF MSGPTR,F ; 1列進める ADDWF PCL,F ; RETLW D'21' ; メッセージ行数(バイト数) RETLW B'01111100' RETLW B'10000000' RETLW B'01110000' RETLW B'10000000' RETLW B'01111100' RETLW B'00000000' RETLW B'01110000' RETLW B'10001000' RETLW B'10001000' RETLW B'01110000' RETLW B'00000000' RETLW B'11111000' RETLW B'00010000' RETLW B'00001000' RETLW B'00001000' RETLW B'00000000' RETLW B'11111000' RETLW B'00001000' RETLW B'11110000' RETLW B'00001000' RETLW B'11110000' ; ;--------------------------------------------------------------------- ; 表示バッファシフト ;--------------------------------------------------------------------- DSPBUFST MOVLW DSPBUF MOVWF FSR ; FSRに表示バッファの先頭アドレスセット MOVLW D'8' MOVWF BUFCNT1 DSPBUFS1 INCF FSR,F MOVF INDF,W ; Wレジに読み込み DECF FSR,F ; FSRをデクリメント MOVWF INDF ; 一行シフトして上書き INCF FSR,F DECFSZ BUFCNT1,F GOTO DSPBUFS1 CLRF INDF ; 最後の行をクリアして戻る RETURN ; ;--------------------------------------------------------------------- ; 表示バッファシフトクリア ;--------------------------------------------------------------------- DSFTCLR MOVLW D'8' MOVWF BUFCNT2 DSFTCLR1 CALL DSPBUFST ; 表示バッファを1行分シフト CALL WAIT01S DECFSZ BUFCNT2,F GOTO DSFTCLR1 RETURN ; ;--------------------------------------------------------------------- ; 表示用バッファクリア ;--------------------------------------------------------------------- CLRDPBUF MOVLW D'8' MOVWF CNT ; 8バイト分のクリア MOVLW DSPBUF ; W ← DSPBUFの先頭アドレス MOVWF FSR ; FSR にアドレスをセット CLRDPBUF2 CLRF INDF ;(FSR)クリア INCF FSR,F ; DECFSZ CNT,F ; GOTO CLRDPBUF2 RETURN ; ;--------------------------------------------------------------------- ; BEEP音 ピッ(3.8KHzの音を0.05秒) ;--------------------------------------------------------------------- BEEP MOVLW D'180' MOVWF BCNT1 BEEP1 BCF INTCON,T0IE ; タイマ0割り込み禁止 MOVF BKPORTA,W ;現状のポート状態取り込み ANDLW B'11011111' MOVWF PORTA MOVWF BKPORTA BSF INTCON,T0IE ; タイマ0割り込みイネーブル ; CALL BWAIT BCF INTCON,T0IE ; タイマ0割り込み禁止 MOVF BKPORTA,W ;現状のポート状態取り込み IORLW B'00100000' MOVWF PORTA MOVWF BKPORTA BSF INTCON,T0IE ; タイマ0割り込みイネーブル ; CALL BWAIT ; DECFSZ BCNT1,F GOTO BEEP1 RETURN ; BWAIT ; 約130μ秒(1/3.8KHz * 2) MOVLW D'43' MOVWF BWCNT1 BWAIT1 DECFSZ BWCNT1,F GOTO BWAIT1 RETURN ; ;--------------------------------------------------------------------- ; CLICK音 カチ(3.8KHzで1回 ON/OFF) ;--------------------------------------------------------------------- CLICK BCF INTCON,T0IE ; タイマ0割り込み禁止 MOVF BKPORTA,W ;現状のポート状態取り込み ANDLW B'11011111' MOVWF PORTA MOVWF BKPORTA BSF INTCON,T0IE ; タイマ0割り込みイネーブル ; CALL BWAIT ; BCF INTCON,T0IE ; タイマ0割り込み禁止 MOVF BKPORTA,W ;現状のポート状態取り込み IORLW B'00100000' MOVWF PORTA MOVWF BKPORTA BSF INTCON,T0IE ; タイマ0割り込みイネーブル RETURN ; ;--------------------------------------------------------------------- ; Waitルーチン(注)割り込みがあるので時間通りにならない ;--------------------------------------------------------------------- WAIT1MS ;約1msec MOVLW D'250' MOVWF WCNT1 W1MSLP NOP DECFSZ WCNT1,F GOTO W1MSLP RETURN ; WAIT01S ;0.1秒 MOVLW D'97' MOVWF WCNT2 W01SLP CALL WAIT1MS DECFSZ WCNT2,F GOTO W01SLP RETURN ; WAIT ; ワームの移動スピードを決める待ち時間 MOVF SPDAT,W MOVWF WCNT2 WAITLP CALL WAIT1MS DECFSZ WCNT2,F GOTO WAITLP NOP RETURN ; ;--------------------------------------------------------------------- END ;--------------------------------------------------------------------- ; 終わり ;---------------------------------------------------------------------