;--------------------------------------------------------------------- ; ラーメンタイマ(1〜10分) ; 2008.08.25 T.Nakamura ; ; 電源投入時のタクトSW状態により2モード ; モード1(SW-OFF):秒表示は分の横にバー表示 ; モード2(SW-ON) :秒表示と秒表示を0.5秒毎に切り替え ; ; ; (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 ; チャタリング除去用カウンタ ; ALMCNT EQU 03DH ; メッセージカウンタ ALMPTR EQU 03EH ; メッセージポインタ CHRCNT EQU 03FH ; メッセージカウンタ CHRPTR EQU 040H ; メッセージポインタ ;--------------------------------------------------------------------- ; 変数レジスタの定義(アプリ用) ;--------------------------------------------------------------------- DIGIT1 EQU 041H ; 1桁目(一の位) DIGIT2 EQU 042H ; 2桁目(十の位) DIGFLG EQU 043H ; 0ビット目 1:10の位、0:1の位の表示 WK1 EQU 044H WK2 EQU 045H CNT1 EQU 046H CNT2 EQU 047H ; TIMEL EQU 048H ; 1秒カウンタLOW TIMEH EQU 049H ; 1秒カウンタHIGH TIMFLG EQU 04AH ; [0]: 1秒毎に1 ; [1]: 秒バー点滅用フラグ ; [2]: 表示モード(0:mode1, 1:mode2) ; [3]: 0:表示開始(分のみ), 1:分と秒 SEC EQU 04BH ; 秒 MIN EQU 04CH ; 分 SEC10 EQU 04DH EE_ADDR EQU 04EH ; EEPROMアドレス EE_DATA EQU 04FH ; EEPROMデータ ;--------------------------------------------------------------------- ; EEPROMデータ(デフォルト時間:3分) ;--------------------------------------------------------------------- ORG H'2100' DE H'03' ; ;--------------------------------------------------------------------- ; マクロ定義 ;--------------------------------------------------------------------- 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 ; リセット時の飛び込み先 RESET GOTO MAIN ; メイン処理へ ; ORG 04H ; 割り込み時の飛び込み先 GOTO INTRUPT ;--------------------------------------------------------------------- ; メイン処理 ;--------------------------------------------------------------------- MAIN CALL INIT ; ; START MOVLW H'00' MOVWF EE_ADDR CALL REDEEP ; 前回設定時間を読み出す MOVWF MIN CLRF SEC ; 秒カウンタクリア CLRF TIMEH CLRF TIMEL BCF TIMFLG,3 LOOP CALL DSPTIME BSF TIMFLG,3 ; BTFSC TIMFLG,0 ; 秒トリガ確認 GOTO DECSEC BTFSS FLAG,3 ; SW状態確認 GOTO $-3 CALL SETTIM ; 押されていたら設定 MOVF MIN,F ; 分が0なら何もしない BTFSC STATUS,Z GOTO SLEEPIN ; DECSEC BCF TIMFLG,0 ; 秒トリガ解除 ; MOVF SEC,F ; 秒デクリメント BTFSC STATUS,Z GOTO DECMIN DECF SEC,F GOTO LOOP DECMIN MOVF MIN,F ; 分デクリメント BTFSC STATUS,Z GOTO TIMEOUT DECF MIN,F MOVLW D'59' MOVWF SEC GOTO LOOP TIMEOUT CALL ALARM CALL CLRDPBUF ; LEDクリア BTFSC FLAG,2 ; SW状態確認(離される迄ループ) GOTO $-1 SLEEPIN BCF FLAG,3 CALL CLRDPBUF ; LEDクリア BTFSS FLAG,3 ; SW状態確認(押される迄ループ) GOTO $-1 BCF FLAG,3 GOTO START ; ;--------------------------------------------------------------------- ; 初期化 ;--------------------------------------------------------------------- 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.28125Hzで割り込みが入るはず ; clock4MHz -> 1Mcycle ; 1Mcycle/256/8 = 488.28125Hz MOVLW B'00000000' ; 内蔵発振のキャリブレーション MOVWF OSCTUNE ; 0000 0111 Max freq. BANK0 ; 0001 0000 Min freq. ; CLRF PORTA ; PORTクリア CLRF PORTB ; CLRF ROWCNT ; LED ROWカウンタクリア CALL CLRDPBUF ; LEDバッファクリア CLRF FLAG CLRF DIGFLG ; CLRF TIMEL CLRF TIMEH CLRF TIMFLG CLRF MIN CLRF SEC BTFSS PORTA,3 ; SWが押されていたらモード2 BSF TIMFLG,2 ; BSF INTCON,T0IE ; タイマ0割り込みイネーブル BSF INTCON,GIE ; 割り込み許可 ; BTFSS PORTA,3 ; SWが離されるまで待つ GOTO $-1 CLRF FLAG ; ; 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 TIMEL,F ; 1秒カウンタUP BTFSC STATUS,Z INCF TIMEH,F ; 桁上げがあったらHIGHカウンタUP ; MOVLW H'01' ; 488になったら1秒とする SUBWF TIMEH,W ; 正確には488.28125で1秒なので、 BTFSS STATUS,Z ; 0.0576%の誤差→10分で約0.346秒 GOTO CHK_SW ; しかし内蔵発振の誤差が±1%なので無視できる MOVLW H'E8' ; 256+232=488 SUBWF TIMEL,W BTFSS STATUS,Z GOTO CHK_SW CLRF TIMEL CLRF TIMEH BSF TIMFLG,0 ; 1秒経ったのでFLAG=1 ; ; タクトスイッチの状態確認 ; CHK_SW 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 ; ;--------------------------------------------------------------------- ; アラーム時間の設定 ;--------------------------------------------------------------------- SETTIM INCF MIN,F MOVLW D'11' SUBWF MIN,W BTFSC STATUS,Z CLRF MIN ; MOVF MIN,W CALL DSPMIN BTFSC FLAG,2 ; 離されるまで待つ GOTO $-1 BCF FLAG,3 CLRF SEC ; 秒カウンタクリア CLRF TIMEH CLRF TIMEL ; SETTIM1 BTFSC TIMFLG,0 ; 秒トリガ確認 GOTO SETTIM2 BTFSC FLAG,3 ; SW状態確認 GOTO SETTIM GOTO SETTIM1 ; SETTIM2 MOVF MIN,F BTFSC STATUS,Z ; 0分ならEEPROMに記録しない RETURN ; EEPROMへ設定時間を記録 MOVLW H'00' MOVWF EE_ADDR; MOVF MIN,W MOVWF EE_DATA CALL WRTEEP ; 書き込み RETURN ;--------------------------------------------------------------------- ; EEPROMへ書き込む(アドレス:EE_ADDR, データEE_DATA) ;--------------------------------------------------------------------- WRTEEP MOVF EE_ADDR,W ; BANKSEL EEADR ; MOVWF EEADR ; Data Memory Address to write BANK0 MOVF EE_DATA,W ; BANKSEL EEADR ; MOVWF EEDAT ; Data Memory Value to write BANKSEL EECON1 ; BCF EECON1,EEPGD ; Point to DATA memory BSF EECON1,WREN ; Enable writes BCF INTCON,GIE ; Disable INTs. BTFSC INTCON,GIE ; SEE AN576 GOTO $-2 MOVLW H'55' ; MOVWF EECON2 ; Write 55h MOVLW H'AA' ; MOVWF EECON2 ; Write AAh BSF EECON1,WR ; Set WR bit to begin write BSF INTCON,GIE ; Enable INTs. BCF EECON1,WREN ; Disable writes BANKSEL 0x00 ;Bank 0 RETURN ;--------------------------------------------------------------------- ; EEPROMから読み出す(アドレス:EE_ADDR, 結果:W) ;--------------------------------------------------------------------- REDEEP MOVF EE_ADDR,W ; BANKSEL EEADR ; MOVWF EEADR ; Data Memory ; Address to read BANKSEL EECON1 ; BCF EECON1,EEPGD ; Point to DATA memory BSF EECON1,RD ; EE Read BANKSEL EEDAT ; MOVF EEDAT,W ; W = EEDAT BCF STATUS,RP1 ; Bank 0 MOVWF MIN RETURN ;--------------------------------------------------------------------- ; 残り時間の表示 ;--------------------------------------------------------------------- DSPTIME MOVF MIN,W CALL DSPMIN ; 分表示 ; BTFSS TIMFLG,3 ; 0なら開始の分のみ表示 RETURN ; BTFSC TIMFLG,2 ; モード確認 GOTO DSPMOD2 DSPMOD1 MOVF SEC,W CALL DIV10 MOVWF SEC10 BSF TIMFLG,1 CALL DSPBAR CALL WAIT ; BCF TIMFLG,1 MOVF SEC10,W CALL DSPBAR RETURN ; DSPMOD2 CALL WAIT CALL DSPSEC RETURN ; ;--------------------------------------------------------------------- ; 分の表示 ;--------------------------------------------------------------------- ; ORG H'0100' DSPMIN MOVF MIN,W MOVWF WK2 ; 待避 CLRF CHRPTR ; 列カウンタクリア MOVLW D'8' MOVWF CHRCNT MOVLW DSPBUF MOVWF FSR DSPMIN1 CALL DIGMIN ; 数値の先頭1列分を取り出す MOVWF INDF INCF FSR,F DECFSZ CHRCNT,F GOTO DSPMIN1 RETURN ; DIGMIN ;数字の1列分のデータを取り出し MOVF CHRPTR,F ; ALMPTRが0か判断 BTFSS STATUS,Z ; 数字の最初の列のときにPTRを計算(8倍) GOTO DIGMIND BCF STATUS,C ;キャリークリア RLF WK2,F ; 2倍 RLF WK2,F ; 4倍 RLF WK2,W ; 8倍 MOVWF CHRPTR DIGMIND MOVLW H'01' MOVWF PCLATH MOVF CHRPTR,W INCF CHRPTR,F ; 1列進める ADDWF PCL,F ; digit 0 RETLW B'01111110' RETLW B'11111111' RETLW B'10000001' RETLW B'10000001' RETLW B'11111111' RETLW B'01111110' RETLW B'00000000' RETLW B'00000000' ; digit 1 RETLW B'10000100' RETLW B'10000010' RETLW B'11111111' RETLW B'11111111' RETLW B'10000000' RETLW B'10000000' RETLW B'00000000' RETLW B'00000000' ; digit 2 RETLW B'11100010' RETLW B'11110001' RETLW B'10010001' RETLW B'10010001' RETLW B'10011111' RETLW B'10001110' RETLW B'00000000' RETLW B'00000000' ; digit 3 RETLW B'01000010' RETLW B'10000001' RETLW B'10001001' RETLW B'10001001' RETLW B'11111111' RETLW B'01110110' RETLW B'00000000' RETLW B'00000000' ; digit 4 RETLW B'00111000' RETLW B'00100100' RETLW B'00100010' RETLW B'11111111' RETLW B'11111111' RETLW B'00100000' RETLW B'00000000' RETLW B'00000000' ; digit 5 RETLW B'01001111' RETLW B'10001111' RETLW B'10001001' RETLW B'10001001' RETLW B'11111001' RETLW B'01110001' RETLW B'00000000' RETLW B'00000000' ; digit 6 RETLW B'01111110' RETLW B'11111111' RETLW B'10001001' RETLW B'10001001' RETLW B'11111001' RETLW B'01110010' RETLW B'00000000' RETLW B'00000000' ; digit 7 RETLW B'00000011' RETLW B'00000011' RETLW B'11110001' RETLW B'11111001' RETLW B'00001111' RETLW B'00000111' RETLW B'00000000' RETLW B'00000000' ; digit 8 RETLW B'01110110' RETLW B'11111111' RETLW B'10001001' RETLW B'10001001' RETLW B'11111111' RETLW B'01110110' RETLW B'00000000' RETLW B'00000000' ; digit 9 RETLW B'01001110' RETLW B'10011111' RETLW B'10010001' RETLW B'10010001' RETLW B'11111111' RETLW B'01111110' RETLW B'00000000' RETLW B'00000000' ; digit 10 RETLW B'10000010' RETLW B'11111111' RETLW B'11111111' RETLW B'10000000' RETLW B'01111110' RETLW B'10000001' RETLW B'11111111' RETLW B'01111110' ; ;--------------------------------------------------------------------- ; 10で割った商を求める ;--------------------------------------------------------------------- DIV10 MOVWF WK1 MOVLW D'10' CLRF WK2 DIV10_1 INCF WK2,F SUBWF WK1,F ; -10 BTFSC STATUS,C GOTO DIV10_1 DECF WK2,W RETURN ; ;--------------------------------------------------------------------- ; Wの値(0〜5)の値に応じた秒バーを表示する ; TIMFLG[1]:0/1 に応じて表示を変える(秒点滅) ;--------------------------------------------------------------------- DSPBAR MOVWF WK2 ; 待避 CALL BARDAT ; バーのパターンを取り出す MOVWF DSPBUF+7 RETURN ; BARDAT ; MOVLW H'01' MOVWF PCLATH BCF STATUS,C ;キャリークリア RLF WK2,W ; 2倍 BTFSC TIMFLG,1 ADDLW D'1' ; 1なら消灯パターン ADDWF PCL,F RETLW B'10000000' RETLW B'00000000' RETLW B'11000000' RETLW B'10000000' RETLW B'11100000' RETLW B'11000000' RETLW B'11110000' RETLW B'11100000' RETLW B'11111000' RETLW B'11110000' RETLW B'11111100' RETLW B'11111000' ; ;--------------------------------------------------------------------- ; 秒を2桁で表示 ;--------------------------------------------------------------------- DSPSEC MOVF SEC,W CALL B2BCD ; BCD変換 ; CALL CLRDPBUF ; 表示バッファクリア ; MOVF DIGIT1,W BCF DIGFLG,0 ; 1の位表示 CALL DSPDIGT ; MOVF DIGIT2,W BSF DIGFLG,0 ; 10の位表示 CALL DSPDIGT RETURN ;--------------------------------------------------------------------- ; BCD変換(単純に10を減算)Wレジのバイナリ値をDIGIT2,1にBCDで入れる ;--------------------------------------------------------------------- B2BCD CLRF DIGIT1 CLRF DIGIT2 MOVWF WK1 SUBLW D'99' ; 100以上なら"00"を返す BTFSS STATUS,C RETURN MOVLW D'10' B2BCD1 SUBWF WK1,F ; -10 BTFSS STATUS,C GOTO B2BCD2 INCF DIGIT2,F GOTO B2BCD1 B2BCD2 ADDWF WK1,W MOVWF DIGIT1 RETURN ; ;--------------------------------------------------------------------- ; Wの値(00〜09:10種)の数字をDIGFLGに応じた位置に表示する ;--------------------------------------------------------------------- DSPDIGT MOVWF WK2 ; 待避 CLRF CHRPTR ; 列カウンタクリア MOVLW D'3' MOVWF CHRCNT MOVLW DSPBUF BTFSS DIGFLG,0 ADDLW D'4' ; 1の位なら4pix移動 MOVWF FSR INCF FSR,F ; DSPDIG1 CALL DIGCHR ; 数値の先頭1列分を取り出す MOVWF INDF INCF FSR,F DECFSZ CHRCNT,F GOTO DSPDIG1 RETURN ; DIGCHR ;数字の1列分のデータを取り出し MOVF CHRPTR,F ; ALMPTRが0か判断 BTFSS STATUS,Z ; 数字の最初の列のときにPTRを計算(3倍) GOTO DIGCHRD BCF STATUS,C ;キャリークリア RLF WK2,W ; 2倍 ADDWF WK2,W ; +元の数値で3倍 MOVWF CHRPTR DIGCHRD MOVLW H'01' MOVWF PCLATH MOVF CHRPTR,W INCF CHRPTR,F ; 1列進める ADDWF PCL,F ; digit 0 RETLW B'11111000' RETLW B'10001000' RETLW B'11111000' ; digit 1 RETLW B'10010000' RETLW B'11111000' RETLW B'10000000' ; digit 2 RETLW B'11101000' RETLW B'10101000' RETLW B'10111000' ; digit 3 RETLW B'10101000' RETLW B'10101000' RETLW B'11111000' ; digit 4 RETLW B'00111000' RETLW B'00100000' RETLW B'11111000' ; digit 5 RETLW B'10111000' RETLW B'10101000' RETLW B'11101000' ; digit 6 RETLW B'11111000' RETLW B'10101000' RETLW B'11101000' ; digit 7 RETLW B'00001000' RETLW B'11101000' RETLW B'00011000' ; digit 8 RETLW B'11111000' RETLW B'10101000' RETLW B'11111000' ; digit 9 RETLW B'10111000' RETLW B'10101000' RETLW B'11111000' ; ;--------------------------------------------------------------------- ; アラーム出力 ;--------------------------------------------------------------------- ORG H'0200' ALARM MOVLW D'20' MOVWF ALMCNT ALM0 CLRF ALMPTR MOVLW D'4' MOVWF CNT1 ALM1 MOVLW DSPBUF MOVWF FSR ; MOVLW D'8' MOVWF CNT2 ALM2 CALL ALMPTN ; メッセージ1行分(1バイト)取り出し MOVWF INDF INCF FSR,F DECFSZ CNT2,F GOTO ALM2 ; CALL BEEP CALL WAIT01S BTFSC FLAG,3 ; SWが押されたら即リターン RETURN DECFSZ CNT1,F GOTO ALM1 DECFSZ ALMCNT,F GOTO ALM0 RETURN ALMPTN MOVLW H'02' MOVWF PCLATH MOVF ALMPTR,W INCF ALMPTR,F ; 1行進める ADDWF PCL,F ; RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00011000' RETLW B'00011000' RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' ; RETLW B'00000000' RETLW B'00000000' RETLW B'00111100' RETLW B'00100100' RETLW B'00100100' RETLW B'00111100' RETLW B'00000000' RETLW B'00000000' ; RETLW B'00000000' RETLW B'01111110' RETLW B'01000010' RETLW B'01000010' RETLW B'01000010' RETLW B'01000010' RETLW B'01111110' RETLW B'00000000' ; RETLW B'11111111' RETLW B'10000001' RETLW B'10000001' RETLW B'10000001' RETLW B'10000001' RETLW B'10000001' RETLW B'10000001' RETLW B'11111111' ; ;--------------------------------------------------------------------- ; 表示用バッファクリア ;--------------------------------------------------------------------- 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音 ピッ(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 ;--------------------------------------------------------------------- ; 終わり ;---------------------------------------------------------------------