;--------------------------------------------------------------------- ; ライフゲーム ; ; 2008.08.23 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 ;アセンブル時のバンク警告メッセージ抑制 ;--------------------------------------------------------------------- ; 変数レジスタの定義(BANK0) ;--------------------------------------------------------------------- ;--------------------------------------------------------------------- ; 変数レジスタの定義(マトリックス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(押されている間ON) ; 3ビット:SW-ON:1(PGで解除するまでON) 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 ; ウェイトカウンタ WCNT3 EQU 037H ; ウェイトカウンタ BCNT1 EQU 038H ; ビープ用 BWCNT1 EQU 039H ; ビープ用 BWCNT2 EQU 03AH ; ビープ用 BWCNT3 EQU 03BH ; ビープ用 CHATCNT EQU 03CH ; チャタリング除去用カウンタ ; MSGCNT EQU 03DH ; メッセージカウンタ MSGPTR EQU 03EH ; メッセージポインタ CHRCNT EQU 03FH ; メッセージカウンタ CHRPTR EQU 040H ; メッセージポインタ ;--------------------------------------------------------------------- ; 変数レジスタの定義(アプリ用) ;--------------------------------------------------------------------- TARGET EQU 041H LIFECNT EQU 042H GENENO EQU 043H ; 世代カウンタ LIFENO EQU 044H ; 生きているセル数 BORN EQU 045H ; 次世代で生まれるセル数 DEATH EQU 046H ; 次世代で死滅するセル数 FIXCNT EQU 047H ; 固定状態検出カウンタ PRVLIFE EQU 048H ; 前回のライフ数 RNDVAL EQU 049H ; 乱数 LIFEFLG EQU 04AH ; [0] 前世代のセル状態:1:存在、0:無し ; [1] 現世代のセル状態:1:存在、0:無し WK1 EQU 04BH WK2 EQU 04CH ; NOWGENE EQU 050H ; 現世代 8バイト(50H〜57H) NXTGENE EQU 058H ; 次世代 8バイト(58H〜5FH) ; ;--------------------------------------------------------------------- ; マクロ定義 ;--------------------------------------------------------------------- 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 CLR8B MACRO TARGET CLRF TARGET CLRF TARGET+1 CLRF TARGET+2 CLRF TARGET+3 CLRF TARGET+4 CLRF TARGET+5 CLRF TARGET+6 CLRF TARGET+7 ENDM CPY8B MACRO FROM,TO MOVF FROM,W MOVWF TO MOVF FROM+1,W MOVWF TO+1 MOVF FROM+2,W MOVWF TO+2 MOVF FROM+3,W MOVWF TO+3 MOVF FROM+4,W MOVWF TO+4 MOVF FROM+5,W MOVWF TO+5 MOVF FROM+6,W MOVWF TO+6 MOVF FROM+7,W MOVWF TO+7 ENDM ;--------------------------------------------------------------------- ; リセットベクタ ;--------------------------------------------------------------------- ORG 00H ; リセット時の飛び込み先 RESET GOTO MAIN ; メイン処理へ ; ORG 04H ; 割り込み時の飛び込み先 GOTO INTRUPT ;--------------------------------------------------------------------- ; メイン処理 ;--------------------------------------------------------------------- MAIN CALL INIT ; ; BSF INTCON,T0IE ; タイマ0割り込みイネーブル BSF INTCON,GIE ; 割り込み許可 ; CLR8B DSPBUF ; 表示バッファクリア CALL LIFEPTRN ; 初期パターン ; CALL BEEP MAINLOOP BCF LIFEFLG,2 ; 次の世代で終了フラグ CLRF GENENO ; 世代カウンタクリア CLRF FIXCNT ; 繰り返しを検出するカウンタ CLRF PRVLIFE ; 前世代のライフ数 ; GENELOOP CPY8B NOWGENE,DSPBUF ; 現世代を表示バッファにコピー BTFSC LIFEFLG,2 ; 次の世代で終了フラグ GOTO SLEEPWLD ; CALL WAIT ; 1世代の表示時間 BTFSC FLAG,3 ; もしSWが押されたら新世界 GOTO NEWWORLD ; MOVF LIFENO,W MOVWF PRVLIFE ; 前回のLIFE数を保存 CALL CHKGENE ; 新世代のデータ作成 CPY8B NXTGENE,NOWGENE ; 世代テーブルをコピー CLR8B NXTGENE ; 次世代クリア INCF GENENO,F ; 1世代進んだ ; MOVF LIFENO,F BTFSC STATUS,Z ; 生きているセルが0になった GOTO FINNEXT ; 新世界創世 ; MOVF BORN,F BTFSS STATUS,Z ; 生まれたセルが0 GOTO CHKLIMGEN MOVF DEATH,F BTFSS STATUS,Z ; 死んだセルが0 GOTO CHKLIMGEN ; FINNEXT BSF LIFEFLG,2 ; 次の世代で終了 CLR8B NOWGENE ; 現世代を0にしてフェイドアウト GOTO GENELOOP ; CHKLIMGEN MOVF PRVLIFE,W ; SUBWF LIFENO,W ; 前世代のライフ数と比較 BTFSS STATUS,Z GOTO CHKLIMIT ; 変化があるのでLIMITチェック ; INCF FIXCNT,F ; 変化がなく同じLIFE数で振動状態の可能性あり。 MOVLW D'10' SUBWF FIXCNT,W BTFSS STATUS,Z GOTO GENELOOP GOTO FINNEXT ; 次の世代で終了 ; CHKLIMIT CLRF FIXCNT ; LIFE数の異なる振動で終了しないケースもあるので最大256世代まで ; MOVF GENENO,F ; 0なら256世代目 ; BTFSS STATUS,Z GOTO GENELOOP ; まだLIMITになっていない。 ; GOTO FINNEXT ; 次の世代で終了 ; SLEEPWLD CALL WAIT CALL WAIT CALL WAIT CALL WAIT CALL WAIT ; NEWWORLD ; CALL BEEP ; ; 新世界の初期世代設定 CLR8B DSPBUF ; 表示バッファクリア BTFSC FLAG,2 ; SWが離されるまでループ GOTO $-1 BCF FLAG,3 ; CALL SETSEED ; 新世界の初期世代作成 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カウンタクリア CLR8B DSPBUF ; 表示バッファクリア CALL RANDINT ; 乱数初期化 CLRF FLAG CLRF LIFEFLG ; BSF INTCON,T0IE ; タイマ0割り込みイネーブル BSF INTCON,GIE ; 割り込み許可 ; 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は押された(押されている間ON) BSF FLAG,3 ; SW-on(解除するまでON) 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'10' MOVWF CHATCNT ; チャタリング回避カウンタセット DSPLED ; ; 表示バッファの内容を1行分(1行)出力 ; ; 次の行データを出力する前に受け側portをHIGH(消灯になる) MOVLW B'11111111' ; MOVWF PORTB ; PORTB出力 BTFSS PORTA,5 ; PORTA(5) 確認 MOVLW B'11011111' ; PORTA(5) LOW MOVWF PORTA ; 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 PORTA,5 ; PORTA(5) 確認 ANDLW B'11011111' ; PORTA(5) LOW MOVWF PORTA ; 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 PORTA,5 ; PORTA(5) 確認 ANDLW B'11011111' ; PORTA(5) LOW MOVWF PORTA ; PORTA出力 ; NXTROW INCF ROWCNT,W ANDLW H'07' ; ROWCNTは0〜7 MOVWF ROWCNT ; 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 ;割り込みから復帰 ; DECPORTA CLRF PCLATH ; ADDWF PCL,F RETLW B'11111110' ; 0 RETLW B'11111101' ; 1 RETLW B'11111011' ; 2 RETLW B'11101111' ; 3 ; DECPORTB CLRF PCLATH ; ADDWF PCL,F RETLW B'11101111' ; 4 RETLW B'11011111' ; 5 RETLW B'10111111' ; 6 RETLW B'01111111' ; 7 ; ;--------------------------------------------------------------------- ; 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' MOVWF RNDVAL RETURN 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 RETURN ; ;--------------------------------------------------------------------- ; 起動時の世代(LiFE文字) ;--------------------------------------------------------------------- LIFEPTRN MOVLW B'11110000' MOVWF NOWGENE MOVLW B'10000111' MOVWF NOWGENE+1 MOVLW B'00000000' MOVWF NOWGENE+2 MOVLW B'01111100' MOVWF NOWGENE+3 MOVLW B'00010100' MOVWF NOWGENE+4 MOVLW B'00000000' MOVWF NOWGENE+5 MOVLW B'11111000' MOVWF NOWGENE+6 MOVLW B'10101000' MOVWF NOWGENE+7 RETURN ; ;--------------------------------------------------------------------- ; 初期世代をランダムに設定 ;--------------------------------------------------------------------- SETSEED MOVLW D'8' MOVWF WK2 MOVLW NOWGENE MOVWF FSR ; CALL RANDOM SETSEED1 CALL RANDOM ; XORWF TMR0,W MOVWF INDF INCF FSR,F DECFSZ WK2,F GOTO SETSEED1 RETURN ; ;--------------------------------------------------------------------- ; 次の世代チェック ;--------------------------------------------------------------------- CHKGENE CLR8B NXTGENE ; 次世代テーブルクリア CLRF TARGET ; 0番目のセルから調べる CLRF LIFENO ; 次世代に生きているセル数カウンタ CLRF BORN ; 次世代に生まれる数 CLRF DEATH ; 次世代に死ぬ数 CHKGENE1 CALL CNTLIFE MOVF TARGET,W CALL CHKCELL ; セルが死んでいればZ=1 BTFSS STATUS,Z GOTO ACTCELL ; セルは生きている DEADCELL ; 死んでいるセル MOVF LIFECNT,W SUBLW D'3' BTFSS STATUS,Z ; 周りに3つの生きているセルがあるか? GOTO CHKGENE2 ; 周りに3つの生きているセルがある MOVF TARGET,W CALL SETCELL ; 次の世代で生まれる INCF LIFENO,F INCF BORN,F GOTO CHKGENE2 ; ACTCELL ; 生きているセル BTFSS LIFECNT,1 ; 周りに2つか3つの生きているセルがあるか? GOTO NXTDEATH ; 周りに3つの生きているセルがある MOVF TARGET,W CALL SETCELL ; 次の世代でも生き残る INCF LIFENO,F GOTO CHKGENE2 ; NXTDEATH INCF DEATH,F CHKGENE2 INCF TARGET,F MOVLW D'64' SUBWF TARGET,W BTFSS STATUS,Z GOTO CHKGENE1 RETURN ; ;--------------------------------------------------------------------- ; NOWGENEセルの指定座標の周りを調べる ; 現世代の座標(TARGETで指示された)の周りのフラグを数える ; 結果(0〜8のいずれか)はWに入れて返る ; @AB ; C■D ; EFG ; 7 6 5 4 3 2 1 0 ; +-----------------------+ ; 0 | 7 6 5 4 3 2 1 0| ; 1 |15 14 13 12 11 10 9 8| ; 2 |23 22 21 20 19 18 17 16| ; 3 |31 30 29 28 27 26 25 24| ; 4 |39 38 37 36 35 34 33 32| ; 5 |47 46 45 44 43 42 41 40| ; 6 |55 54 53 52 51 50 49 48| ; 7 |63 62 61 60 59 58 57 56| ; +-----------------------+ ;--------------------------------------------------------------------- CNTLIFE: CLRF LIFECNT ; LIFEカウンタクリア MOVF TARGET,W ; ;@の確認 SUBLW D'7' BTFSC STATUS,C ;7以下なら@ABスキップ GOTO CNTLIFE4 ; MOVLW H'07' ; i%8==7 のときもスキップ ANDWF TARGET,W ; 下位ビットが7ならi%8==7 SUBLW D'7' BTFSC STATUS,Z GOTO CNTLIFE2 ; MOVLW D'7' ; W=TARGET-7 SUBWF TARGET,W ; CALL CHKCELL ; LIFEがないとZは1 BTFSS STATUS,Z INCF LIFECNT,F ; CNTLIFE2 ;Aの確認 MOVLW D'8' ; W=TARGET-8 SUBWF TARGET,W ; CALL CHKCELL ; LIFEがないとZは1 BTFSS STATUS,Z INCF LIFECNT,F ; CNTLIFE3 ;Bの確認 MOVLW H'07' ANDWF TARGET,W ; 上位ビットをマスクして0ならi%8==0 BTFSC STATUS,Z GOTO CNTLIFE4 ; MOVLW D'9' ; W=TARGET-9 SUBWF TARGET,W ; CALL CHKCELL ; LIFEがないとZは1 BTFSS STATUS,Z INCF LIFECNT,F ; CNTLIFE4 ;Cの確認 MOVLW H'07' ; i%8==7 のときはスキップ ANDWF TARGET,W ; 下位ビットが7ならi%8==7 SUBLW D'7' BTFSC STATUS,Z GOTO CNTLIFE5 ; INCF TARGET,W ; W=TARGET+1 CALL CHKCELL ; LIFEがないとZは1 BTFSS STATUS,Z INCF LIFECNT,F ; CNTLIFE5 ;Dの確認 MOVLW H'07' ANDWF TARGET,W ; 上位ビットをマスクして0ならi%8==0 BTFSC STATUS,Z GOTO CNTLIFE6 ; DECF TARGET,W ; W=TARGET-1 CALL CHKCELL ; LIFEがないとZは1 BTFSS STATUS,Z INCF LIFECNT,F ; CNTLIFE6 ;Eの確認 MOVF TARGET,W SUBLW D'55' BTFSS STATUS,C ;55以上ならEFGスキップ RETURN ; MOVLW H'07' ; i%8==7 のときはスキップ ANDWF TARGET,W ; 下位ビットが7ならi%8==7 SUBLW D'7' BTFSC STATUS,Z GOTO CNTLIFE7 ; MOVLW D'9' ADDWF TARGET,W ; W=TARGET+9 CALL CHKCELL ; LIFEがないとZは1 BTFSS STATUS,Z INCF LIFECNT,F ; CNTLIFE7 ;Fの確認 MOVLW D'8' ADDWF TARGET,W ; W=TARGET+8 CALL CHKCELL ; LIFEがないとZは1 BTFSS STATUS,Z INCF LIFECNT,F ; CNTLIFE8 ;Gの確認 MOVLW H'07' ANDWF TARGET,W ; 上位ビットをマスクして0ならi%8==0 BTFSC STATUS,Z RETURN ; MOVLW D'7' ADDWF TARGET,W ; W=TARGET+7 CALL CHKCELL ; LIFEがないとZは1 BTFSS STATUS,Z INCF LIFECNT,F ; RETURN ; ;--------------------------------------------------------------------- ; NOWGENEセルの状態を調べる ; 現世代の座標(Wで指示された)のビットを確認する。 ; 結果はWとZフラグで返る ;--------------------------------------------------------------------- CHKCELL: ; 座標が何バイト目か確認 ; 8で割った商がバイト位置になる。 MOVWF WK1 ; ANDLW H'07' ; Wの下位3bitを取り出し、ビット位置確定 MOVWF WK2 ; ビット位置 BCF STATUS,C ; Carry bitをクリア RLF WK1,F ; 左にbit shift(2倍) SWAPF WK1,W ; ニブルスワップで1/16して、元の1/8 ANDLW H'0F' ; Wの下位4bitを取り出し、バイト位置確定 ADDLW NOWGENE ; 次世代の先頭アドレスを加算 MOVWF FSR ; FSR にアドレスをセット ; MOVF WK2,W CALL DECBIT ; デコードしたビットの位置がWで返される ANDWF INDF,W ; 座標が0ならZフラグが1で返る RETURN ; ;--------------------------------------------------------------------- ; NXTGENEセルへの設定 ; Wで指示された座標のビットを次世代テーブルにセットする。 ; ; NXTGENE ; 7 6 5 4 3 2 1 0 ; +-----------------------+ ; 0 | 7 6 5 4 3 2 1 0| ; 1 |15 14 13 12 11 10 9 8| ; 2 |23 22 21 20 19 18 17 16| ; 3 |31 30 29 28 27 26 25 24| ; 4 |39 38 37 36 35 34 33 32| ; 5 |47 46 45 44 43 42 41 40| ; 6 |55 54 53 52 51 50 49 48| ; 7 |63 62 61 60 59 58 57 56| ; +-----------------------+ ; ;--------------------------------------------------------------------- SETCELL: ; 座標が何バイト目か確認 ; 8で割った商がバイト位置になる。 MOVWF WK1 ; ANDLW H'07' ; Wの下位3bitを取り出し、ビット位置確定 MOVWF WK2 ; ビット位置 BCF STATUS,C ; Carry bitをクリア RLF WK1,F ; 左にbit shift(2倍) SWAPF WK1,W ; ニブルスワップで1/16して、元の1/8 ANDLW H'0F' ; Wの下位4bitを取り出し、バイト位置確定 ADDLW NXTGENE ; 次世代の先頭アドレスを加算 MOVWF FSR ; FSR にアドレスをセット ; MOVF WK2,W CALL DECBIT ; デコードしたビットの位置がWで返される IORWF INDF,F ; (FSR) 番地とBUFF1のORでセット RETURN ; ;--------------------------------------------------------------------- ; BEEP音 ピッ(38KHzの音を0.1秒) ;--------------------------------------------------------------------- BEEP MOVLW H'80' MOVWF BCNT1 BEEP1 MOVF PORTA,W ;現状のポート状態取り込み ANDLW B'11011111' MOVWF PORTA CALL BWAIT MOVF PORTA,W IORLW B'00100000' MOVWF PORTA CALL BWAIT ; DECFSZ BCNT1,F GOTO BEEP1 RETURN ; BWAIT MOVLW D'38' MOVWF BWCNT1 BWAIT1 DECFSZ BWCNT1,F GOTO BWAIT1 RETURN ; B2WAIT MOVLW H'80' MOVWF BWCNT2 B2WAIT0 MOVLW H'FF' MOVWF BWCNT3 B2WAIT1 DECFSZ BWCNT3,F GOTO B2WAIT1 DECFSZ BWCNT2,F GOTO B2WAIT0 RETURN ; CLICK MOVF PORTA,W ANDLW B'11011111' MOVWF PORTA CALL BWAIT MOVF PORTA,W IORLW B'00100000' MOVWF PORTA 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 ; WAIT05S ;0.5秒 MOVLW D'5' MOVWF WCNT3 W05SLP CALL WAIT01S DECFSZ WCNT3,F GOTO W05SLP RETURN ; WAIT1S ;1秒 MOVLW D'10' MOVWF WCNT3 W1SLP CALL WAIT01S DECFSZ WCNT3,F GOTO W1SLP RETURN ; WAIT CALL WAIT01S BTFSC FLAG,3 ; SWが押されたら即リターン RETURN CALL WAIT01S BTFSC FLAG,3 ; SWが押されたら即リターン RETURN CALL WAIT01S BTFSC FLAG,3 ; SWが押されたら即リターン RETURN CALL WAIT01S BTFSC FLAG,3 ; SWが押されたら即リターン RETURN CALL WAIT01S RETURN ;--------------------------------------------------------------------- END ;--------------------------------------------------------------------- ; 終わり ;---------------------------------------------------------------------