;--------------------------------------------------------------------- ; びっとまん ; ; 2008.07.26 T.Nakamura ; ; (1). RC0〜7 [out] : 行(データポート) LEDアノード側 ; (2). RA0〜3,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 ; ビープ用 BWCNT2 EQU 039H ; ビープ用 BWCNT3 EQU 03AH ; ビープ用 CHATCNT EQU 03BH ; チャタリング除去用カウンタ ; MSGCNT EQU 03CH ; メッセージカウンタ MSGPTR EQU 03DH ; メッセージポインタ ; ;--------------------------------------------------------------------- ; 変数レジスタの定義(アプリ用) ;--------------------------------------------------------------------- MRSWTCT EQU 040H ; モールス用 MRSCNT EQU 041H ; モールス用 WK1 EQU 042H ; 作業用 WK2 EQU 043H ; 作業用 PATNO EQU 044H ; PATCNT EQU 045H ; WCNT3 EQU 046H ; LOOPCNT EQU 047H ; PROWCNT EQU 048H ; PROWPTR EQU 049H ; ; ;--------------------------------------------------------------------- ; マクロ定義 ;--------------------------------------------------------------------- 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 CALL STANDPTN ; 立つ CALL WAIT1S ; CALL DANPTN ; 踊る CALL WAIT1S CALL DANPTN ; 踊る CALL WAIT1S ; CALL RUN ; 走る CALL WAIT1S ; CALL DRAGPTN ; Helloを引きずる CALL HELLO ; Hello PIC World CALL WAIT1S ; 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バッファクリア ; 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は押された 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 ; ;--------------------------------------------------------------------- ; 走る ;--------------------------------------------------------------------- RUN MOVLW D'1' MOVWF PATNO CALL RUNPTN CALL CLICK CALL WAIT01S CALL WAIT01S ; INCF PATNO,F MOVF PATNO,W CALL RUNPTN CALL CLICK CALL WAIT01S CALL WAIT01S ; MOVLW D'8' MOVWF LOOPCNT RUNLOOP MOVLW D'3' MOVWF PATNO CALL RUNPTN CALL CLICK CALL WAIT01S ; MOVLW D'4' MOVWF PATNO CALL RUNPTN CALL CLICK CALL WAIT01S ; MOVLW D'5' MOVWF PATNO CALL RUNPTN CALL CLICK CALL WAIT01S ; MOVLW D'6' MOVWF PATNO CALL RUNPTN CALL CLICK CALL WAIT01S ; DECFSZ LOOPCNT,F GOTO RUNLOOP ; MOVLW D'7' MOVWF PATNO CALL RUNPTN CALL WAIT01S ; CALL STANDPTN CALL WAIT01S ; RETURN ;--------------------------------------------------------------------- ; 立つ ;--------------------------------------------------------------------- STANDPTN MOVLW B'00000000' MOVWF DSPBUF MOVLW B'10011000' MOVWF DSPBUF+1 MOVLW B'11100100' MOVWF DSPBUF+2 MOVLW B'00011111' MOVWF DSPBUF+3 MOVLW B'00011111' MOVWF DSPBUF+4 MOVLW B'11100100' MOVWF DSPBUF+5 MOVLW B'10011000' MOVWF DSPBUF+6 MOVLW B'00000000' MOVWF DSPBUF+7 RETURN ;--------------------------------------------------------------------- ; 走るパターンを表示(Wレジで指定されたパターン) ;--------------------------------------------------------------------- ORG H'0100' RUNPTN MOVWF WK2 ; 待避 CLRF PROWPTR ; 列ポインタ CLRF PROWCNT ; 列カウンタ MOVLW DSPBUF ; 表示バッファ先頭 MOVWF FSR RUNPTN1 CALL RUNDAT ; パターン1列分を取り出す MOVWF INDF ; 表示バッファに書き出す INCF FSR,F ; INCF PROWCNT,F MOVLW D'8' SUBWF PROWCNT,W BTFSS STATUS,Z GOTO RUNPTN1 RETURN ; RUNDAT ;パターンの1列分のデータを取り出し MOVF PROWPTR,F ; MSGPTRが0か判断 BTFSS STATUS,Z ; 最初の列のときにPTRを計算(8倍) GOTO RUNDATA BCF STATUS,C ;キャリークリア RLF WK2,F ; 2倍 RLF WK2,F ; 4倍 RLF WK2,W ; 8倍 MOVWF PROWPTR RUNDATA MOVLW H'01' MOVWF PCLATH MOVF PROWPTR,W INCF PROWPTR,F ; 1列進める ADDWF PCL,F ; パターン0 RETLW B'00000000' RETLW B'10011000' RETLW B'11100100' RETLW B'00011111' RETLW B'00011111' RETLW B'11100100' RETLW B'10011000' RETLW B'00000000' ; パターン1 RETLW B'00001000' RETLW B'10000100' RETLW B'11100100' RETLW B'00111110' RETLW B'00111110' RETLW B'11100100' RETLW B'10000100' RETLW B'00001000' ; パターン2 RETLW B'00000000' RETLW B'10011000' RETLW B'11100100' RETLW B'00011100' RETLW B'00011111' RETLW B'01101011' RETLW B'01000000' RETLW B'00000000' ; パターン3 RETLW B'10000000' RETLW B'01011000' RETLW B'01100100' RETLW B'01111100' RETLW B'00011111' RETLW B'01111011' RETLW B'01000000' RETLW B'00000000' ; パターン4 RETLW B'00010000' RETLW B'00110100' RETLW B'00100010' RETLW B'00011100' RETLW B'00011110' RETLW B'11101110' RETLW B'10001000' RETLW B'00000100' ; パターン5 RETLW B'00000000' RETLW B'00000000' RETLW B'00101000' RETLW B'11111100' RETLW B'10011110' RETLW B'00010110' RETLW B'00010000' RETLW B'00000000' ; パターン6 RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'11000000' RETLW B'01111100' RETLW B'00111111' RETLW B'00110011' RETLW B'00000000' ; パターン7 RETLW B'00000100' RETLW B'01000100' RETLW B'01110100' RETLW B'00011110' RETLW B'00011110' RETLW B'11100100' RETLW B'10000100' RETLW B'00000100' ; ;--------------------------------------------------------------------- ; ドラッグパターンを表示 ;--------------------------------------------------------------------- DRAGPTN CLRF PATNO MOVLW D'9' MOVWF PATCNT DRAGPTN1 MOVF PATNO,W MOVWF WK2 ; 待避 CLRF PROWPTR ; 列ポインタ CLRF PROWCNT ; 列カウンタ MOVLW DSPBUF ; 表示バッファ先頭 MOVWF FSR DRAGPTN2 CALL DRAGDAT ; パターン1列分を取り出す INCF PROWPTR,F ; 1列進める MOVWF INDF ; 表示バッファに書き出す INCF FSR,F ; INCF PROWCNT,F MOVLW D'8' SUBWF PROWCNT,W BTFSS STATUS,Z GOTO DRAGPTN2 ; CALL CLICK CALL WAIT01S ; INCF PATNO,F DECFSZ PATCNT,F GOTO DRAGPTN1 RETURN ; DRAGDAT ;パターンの1列分のデータを取り出し MOVF PROWPTR,F ; MSGPTRが0か判断 BTFSS STATUS,Z ; 最初の列のときにPTRを計算(8倍) GOTO DRAGDATA BCF STATUS,C ;キャリークリア RLF WK2,F ; 2倍 RLF WK2,F ; 4倍 RLF WK2,W ; 8倍 MOVWF PROWPTR DRAGDATA MOVLW H'01' MOVWF PCLATH MOVF PROWPTR,W ADDWF PCL,F ; RETLW B'00000000' RETLW B'00000000' RETLW B'11001000' RETLW B'01110100' RETLW B'00011100' RETLW B'00011110' RETLW B'11100110' RETLW B'10011000' ; RETLW B'00000000' RETLW B'00000000' RETLW B'11000000' RETLW B'01110000' RETLW B'00011100' RETLW B'00011110' RETLW B'11100110' RETLW B'10000100' ; RETLW B'00000000' RETLW B'00000000' RETLW B'11000000' RETLW B'01000000' RETLW B'01111111' RETLW B'00011111' RETLW B'11110100' RETLW B'10000100' ; RETLW B'00000000' RETLW B'00000000' RETLW B'11000000' RETLW B'01000011' RETLW B'01111111' RETLW B'00011100' RETLW B'01110100' RETLW B'01000100' ; RETLW B'00000000' RETLW B'00000000' RETLW B'11100011' RETLW B'10100111' RETLW B'00111100' RETLW B'00111100' RETLW B'00010100' RETLW B'00100100' ; RETLW B'00000000' RETLW B'00000011' RETLW B'11100111' RETLW B'10111100' RETLW B'00111100' RETLW B'00010100' RETLW B'00100100' RETLW B'11111111' ; RETLW B'00000000' RETLW B'00000011' RETLW B'11111111' RETLW B'10111100' RETLW B'00010100' RETLW B'00000100' RETLW B'00000100' RETLW B'11111111' ; RETLW B'00000011' RETLW B'11101111' RETLW B'00011100' RETLW B'11110100' RETLW B'10000100' RETLW B'00000100' RETLW B'11111111' RETLW B'11111111' ; RETLW B'11111111' RETLW B'00011100' RETLW B'11100100' RETLW B'10000100' RETLW B'00000100' RETLW B'11111111' RETLW B'11111111' RETLW B'00010000' ; ;--------------------------------------------------------------------- ; 踊るパターンを表示 ;--------------------------------------------------------------------- ORG H'0200' DANPTN CLRF PATNO MOVLW D'9' MOVWF PATCNT DANPTN1 MOVF PATNO,W MOVWF WK2 ; 待避 CLRF PROWPTR ; 列ポインタ CLRF PROWCNT ; 列カウンタ MOVLW DSPBUF ; 表示バッファ先頭 MOVWF FSR DANPTN2 CALL DANDAT ; パターン1列分を取り出す MOVWF INDF ; 表示バッファに書き出す INCF FSR,F ; INCF PROWCNT,F MOVLW D'8' SUBWF PROWCNT,W BTFSS STATUS,Z GOTO DANPTN2 ; CALL CLICK CALL WAIT01S ; INCF PATNO,F DECFSZ PATCNT,F GOTO DANPTN1 RETURN ; DANDAT ;パターンの1列分のデータを取り出し MOVF PROWPTR,F ; MSGPTRが0か判断 BTFSS STATUS,Z ; 最初の列のときにPTRを計算(8倍) GOTO DANDATA BCF STATUS,C ;キャリークリア RLF WK2,F ; 2倍 RLF WK2,F ; 4倍 RLF WK2,W ; 8倍 MOVWF PROWPTR DANDATA MOVLW H'02' MOVWF PCLATH MOVF PROWPTR,W INCF PROWPTR,F ; 1列進める ADDWF PCL,F ; RETLW B'00000000' RETLW B'10011000' RETLW B'11100100' RETLW B'00011111' RETLW B'00011111' RETLW B'11100100' RETLW B'10011000' RETLW B'00000000' ; RETLW B'00000000' RETLW B'00011000' RETLW B'10000100' RETLW B'11111110' RETLW B'11111110' RETLW B'10000100' RETLW B'00011000' RETLW B'00000000' ; RETLW B'00000000' RETLW B'00011000' RETLW B'10000110' RETLW B'11111110' RETLW B'11111100' RETLW B'10010100' RETLW B'00001000' RETLW B'00000000' ; RETLW B'00001000' RETLW B'01001000' RETLW B'01110110' RETLW B'00011110' RETLW B'11111100' RETLW B'10010100' RETLW B'00001000' RETLW B'00000000' ; RETLW B'00000000' RETLW B'10011000' RETLW B'11100110' RETLW B'00011110' RETLW B'11111100' RETLW B'10000100' RETLW B'00011000' RETLW B'00000000' ; RETLW B'00000000' RETLW B'00011000' RETLW B'10000100' RETLW B'11111110' RETLW B'11111110' RETLW B'10000100' RETLW B'00011000' RETLW B'00000000' ; RETLW B'00000000' RETLW B'00001000' RETLW B'10010100' RETLW B'11111100' RETLW B'00011111' RETLW B'01110111' RETLW B'01001000' RETLW B'00001000' ; RETLW B'00000000' RETLW B'00011000' RETLW B'10000100' RETLW B'11111100' RETLW B'00011110' RETLW B'11100110' RETLW B'10011000' RETLW B'00000000' ; RETLW B'00000000' RETLW B'10011000' RETLW B'11100100' RETLW B'00011111' RETLW B'00011111' RETLW B'11100100' RETLW B'10011000' RETLW B'00000000' ; ;--------------------------------------------------------------------- ; HELLO出力 ;--------------------------------------------------------------------- ORG H'0300' HELLO CALL MRSINI ; モールス初期化 CLRF MSGPTR CALL HELLOTXT ; メッセージ行数(バイト数)取り出し MOVWF MSGCNT INCF MSGCNT,F HELLO1 CALL DSPBUFST ; 表示バッファを1行分シフト CALL HELLOTXT ; メッセージ1行分(1バイト)取り出し MOVWF DSPBUF+7 ; バッファの最後の行に書き込む CALL MRSWAIT CALL MRSWAIT DECFSZ MSGCNT,F GOTO HELLO1 ; MOVLW D'8' ; 最後に1画面分シフトしてクリア MOVWF WK1 HELLO2 CALL DSPBUFST ; 表示バッファを1行分シフト CALL MRSWAIT CALL MRSWAIT DECFSZ WK1,F GOTO HELLO2 RETURN HELLOTXT MOVLW H'03' MOVWF PCLATH MOVF MSGPTR,W INCF MSGPTR,F ; 1行進める ADDWF PCL,F ; RETLW D'76' ; メッセージ行数(バイト数) ; RETLW B'11111111' ; H ; RETLW B'11111111' ; RETLW B'00010000' RETLW B'00010000' RETLW B'00010000' RETLW B'11111111' RETLW B'00000000' RETLW B'01111000' ; e RETLW B'11111100' RETLW B'10010100' RETLW B'10010100' RETLW B'10011000' RETLW B'00000000' RETLW B'11111111' ; l RETLW B'11111111' RETLW B'00000000' RETLW B'11111111' ; l RETLW B'11111111' RETLW B'00000000' RETLW B'01111000' ; o RETLW B'11111100' RETLW B'10000100' RETLW B'10000100' RETLW B'01111000' RETLW B'00000000' ; _ RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'11111111' ; P RETLW B'11111111' RETLW B'00010001' RETLW B'00010001' RETLW B'00010001' RETLW B'00001110' RETLW B'00000000' RETLW B'10000001' ; I RETLW B'11111111' RETLW B'11111111' RETLW B'10000001' RETLW B'00000000' RETLW B'01111110' ; C RETLW B'11111111' RETLW B'10000001' RETLW B'10000001' RETLW B'10000001' RETLW B'01000010' RETLW B'00000000' ; _ RETLW B'00000000' RETLW B'00000000' RETLW B'00000000' RETLW B'00111111' ; W RETLW B'01111111' RETLW B'10000000' RETLW B'01000000' RETLW B'00110000' RETLW B'01000000' RETLW B'10000000' RETLW B'01111111' RETLW B'00000000' RETLW B'01111000' ; o RETLW B'11111100' RETLW B'10000100' RETLW B'10000100' RETLW B'01111000' RETLW B'00000000' RETLW B'11111100' ; r RETLW B'11111100' RETLW B'00001000' RETLW B'00000100' RETLW B'00000100' RETLW B'00000000' RETLW B'11111111' ; l RETLW B'11111111' RETLW B'00000000' RETLW B'01110000' ; d RETLW B'10001000' RETLW B'10001000' RETLW B'11111111' RETLW B'11111111' ; ;--------------------------------------------------------------------- ; 表示バッファシフト ;--------------------------------------------------------------------- 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 ; ;--------------------------------------------------------------------- ; 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 ; ;--------------------------------------------------------------------- ; 表示用バッファクリア ;--------------------------------------------------------------------- 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 ; ;--------------------------------------------------------------------- ; 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 ; ;--------------------------------------------------------------------- ; モールス音 長音(0.3秒)短音(0.1秒)を出しながらウェイト ; 1列スクロールで2回呼び出す ;--------------------------------------------------------------------- ORG H'0400' MRSINI ;初期化 CLRF MRSCNT RETURN MRSWAIT CALL MRSCODE ; メッセージ行数(バイト数)取り出し IORLW H'00' BTFSS STATUS,Z GOTO MRSWT1 ; CALL MRSWTNO ; 音なしのウェイト RETURN MRSWT1 CALL MRSWTSD ; 音ありのウェイト RETURN MRSCODE MOVLW H'04' MOVWF PCLATH MOVF MRSCNT,W INCF MRSCNT,F ADDWF PCL,F ; 長音は3回続けて1、短音は1回、文字間隙は3回続けて0 RETLW D'1' ; H .... RETLW D'0' ; RETLW D'1' ; RETLW D'0' ; RETLW D'1' ; RETLW D'0' ; RETLW D'1' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'1' ; E . RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'1' ; L .-.. RETLW D'0' ; RETLW D'1' ; RETLW D'1' ; RETLW D'1' ; RETLW D'0' ; RETLW D'1' ; RETLW D'0' ; RETLW D'1' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'1' ; L .-.. RETLW D'0' ; RETLW D'1' ; RETLW D'1' ; RETLW D'1' ; RETLW D'0' ; RETLW D'1' ; RETLW D'0' ; RETLW D'1' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'1' ; O --- RETLW D'1' ; RETLW D'1' ; RETLW D'0' ; RETLW D'1' ; RETLW D'1' ; RETLW D'1' ; RETLW D'0' ; RETLW D'1' ; RETLW D'1' ; RETLW D'1' ; RETLW D'0' ; _ RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'1' ; P .--. RETLW D'0' ; RETLW D'1' ; RETLW D'1' ; RETLW D'0' ; RETLW D'1' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'1' ; I .. RETLW D'0' ; RETLW D'1' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'1' ; C -.-. RETLW D'1' ; RETLW D'1' ; RETLW D'0' ; RETLW D'1' ; RETLW D'0' ; RETLW D'1' ; RETLW D'1' ; RETLW D'1' ; RETLW D'0' ; RETLW D'1' ; RETLW D'0' ; _ RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'1' ; W .-- RETLW D'0' ; RETLW D'1' ; RETLW D'1' ; RETLW D'1' ; RETLW D'0' ; RETLW D'1' ; RETLW D'1' ; RETLW D'1' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'1' ; O --- RETLW D'1' ; RETLW D'1' ; RETLW D'0' ; RETLW D'1' ; RETLW D'1' ; RETLW D'1' ; RETLW D'0' ; RETLW D'1' ; RETLW D'1' ; RETLW D'1' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'1' ; R .-.. RETLW D'0' ; RETLW D'1' ; RETLW D'1' ; RETLW D'1' ; RETLW D'0' ; RETLW D'1' ; RETLW D'0' ; RETLW D'1' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'1' ; L .-.. RETLW D'0' ; RETLW D'1' ; RETLW D'1' ; RETLW D'1' ; RETLW D'0' ; RETLW D'1' ; RETLW D'0' ; RETLW D'1' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'1' ; D -.. RETLW D'1' ; RETLW D'1' ; RETLW D'0' ; RETLW D'1' ; RETLW D'0' ; RETLW D'1' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; RETLW D'0' ; ; ;--------------------------------------------------------------------- ; 音ありのウェイト(38KHzの音を0.0500秒) ;--------------------------------------------------------------------- MRSWTSD MOVLW D'183' MOVWF MRSWTCT MRSWTSD1 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 MRSWTCT,F GOTO MRSWTSD1 RETURN ;--------------------------------------------------------------------- ; 音なしのウェイト 0.0503秒(音あり、なし共に時間は同じ) ;--------------------------------------------------------------------- MRSWTNO MOVLW D'45' MOVWF MRSWTCT MRSWTNO1 CALL WAIT1MS DECFSZ MRSWTCT,F GOTO MRSWTNO1 RETURN ;--------------------------------------------------------------------- END ;--------------------------------------------------------------------- ; 終わり ;---------------------------------------------------------------------