;--------------------------------------------------------------------- ; LEDフラッシャ(4ピンで10個のLEDを点灯) ; ; 2008.5.4 T.Nakamura ; (1). 出力ポート ; GP0-2,4: LEDに繋ぐ ; ;--------------------------------------------------------------------- LIST P=PIC12F675 INCLUDE "P12F675.INC" __CONFIG _CPD_OFF & _CP_OFF & _BODEN_ON & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT ERRORLEVEL -302 ;アセンブル時のバンク警告メッセージ抑制 ;--------------------------------------------------------------------- ; 変数レジスタの定義 ;--------------------------------------------------------------------- CNT EQU 20H ; カウンタ CNT1 EQU 21H ; WAIT用カウンタ CNT2 EQU 22H ; WAIT用カウンタ LED_NO EQU 23H ; 点灯するLED番号(0〜9) LEDBUF EQU 24H ; LED表示バッファ(24-25H, 25Hは下位2ビットのみ使用) LEDCNT EQU 26H ; 割り込みで表示するLED番号カウンタ PATADDR EQU 27H ; 表示パターンのアドレスカウンタ PATCNT EQU 28H ; 表示パターンの表示繰り返しカウンタ CNTL EQU 29H ; バイナリカウンタ(下位) CNTH EQU 2AH ; バイナリカウンタ(上位) ; BKUPW EQU 30H ; 割り込み待避用 BKUPS EQU 31H ; 割り込み待避用 BKUPFR EQU 32H ; 割り込み待避用 ; ;--------------------------------------------------------------------- ; リセット・割り込み ;--------------------------------------------------------------------- ORG 00H ; リセット時の飛び込み先 RESET GOTO START ; 初期設定へ ; ;--------------------------------------------------------------------- ; 割り込み処理でダイナミック表示を行う。 ; LEDBUFの0ビット目から順次表示(1回の割り込みで1ビット分) ;--------------------------------------------------------------------- ORG 04H ; 割り込み時の飛び込み先 INTRUPT ;レジスタ待避 MOVWF BKUPW ;バックアップ(Wレジ) SWAPF STATUS,W ;バックアップ(STATUSレジ) MOVWF BKUPS MOVF FSR,W ;バックアップ(FSRレジ) MOVWF BKUPFR ; BCF INTCON,T0IF ;割り込みフラグリセット ; ; LEDBUFのLEDCNTビット目を調べ、点灯するか判断 ; MOVLW LEDBUF ; LEDBUFアドレス MOVWF FSR BTFSC LEDCNT,3 ; LEDCNT>8以上ならFSR+1 INCF FSR,F ; FSR+1 ; MOVF LEDCNT,W ANDLW H'07' ; 下位ビット取り出し CALL DECBIT ; ビット位置に変換 ANDWF INDF,W BTFSC STATUS,Z ; 0以外なら表示 GOTO UNDISP ; MOVF LEDCNT,W MOVWF LED_NO ; 表示番号をLED_NOへ ; ; LED表示 ; CLRF GPIO MOVF LED_NO,W CALL TABLE_TRIS BSF STATUS,RP0 ; bank1 切り替え MOVWF TRISIO BCF STATUS,RP0 ; bank0に戻す MOVF LED_NO,W CALL TABLE_IO MOVWF GPIO ; GOTO NEXTBIT ; UNDISP CLRF GPIO ; LED非表示 ; NEXTBIT INCF LEDCNT,F ; 次の割り込みに備え、カウントアップ MOVF LEDCNT,W SUBLW D'10' BTFSC STATUS,Z CLRF LEDCNT ; RSTREG ;レジスタ復元 MOVF BKUPFR,W ;復元(FSRレジ) MOVWF FSR SWAPF BKUPS,W ;復元(STATUSレジ) MOVWF STATUS SWAPF BKUPW,F ;復元(Wレジ)LED_NO SWAPF BKUPW,W ; RETFIE ;割り込みから復帰 ; ;--------------------------------------------------------------------- ; 初期設定 ;--------------------------------------------------------------------- START BCF INTCON,GIE ; 全割込み禁止 BSF STATUS,RP0 ; bank1 切り替え CALL 3FFH ; 内部OSCのキャリブレーションデータ MOVWF OSCCAL ; OSCCALレジスタにセット CLRF ANSEL ; デジタルI/Oにする MOVLW H'6F' MOVWF TRISIO ; ポートを入力設定 ;割り込みタイマーセット MOVLW H'81' ; プリスケーラを1:4にする MOVWF OPTION_REG ; 約1Kヘルツで割り込みが入るはず ; clock4MHz -> 1Mcycle ; 1Mcycle/256/4=976Hz(=1.024msec毎) ; LED 10個なので97Hzで全てを表示する。 ; おそらくチラチラしない。 BCF STATUS,RP0 ; bank0に戻す ; MOVLW B'00000111' ; GP0-2をデジタルI/Oに設定 MOVWF CMCON ; デフォルトはコンパレータ ; ;--------------------------------------------------------------------- ; メイン ;--------------------------------------------------------------------- MAIN CLRF LEDCNT ; LEDカウンタクリア CLRF LEDBUF ; LEDバッファクリア CLRF LEDBUF+1 ; LEDバッファクリア BSF INTCON,T0IE ; タイマ0割り込みイネーブル BSF INTCON,GIE ; 割り込み許可 MAINLP MOVLW D'5' MOVWF PATCNT ; パターンPAT1を5回表示 CALL PAT1 DECFSZ PATCNT,F GOTO $-2 ; MOVLW D'5' MOVWF PATCNT ; パターンPAT2を5回表示 CALL PAT2 DECFSZ PATCNT,F GOTO $-2 ; MOVLW D'5' MOVWF PATCNT ; パターンPAT3を5回表示 CALL PAT3 DECFSZ PATCNT,F GOTO $-2 ; MOVLW D'5' MOVWF PATCNT ; パターンPAT4を5回表示 CALL PAT4 DECFSZ PATCNT,F GOTO $-2 ; CALL BINCNT ; バイナリカウンタ表示 ; GOTO MAINLP ; ;--------------------------------------------------------------------- ; I/Oパターン ;--------------------------------------------------------------------- TABLE_IO CLRF PCLATH ADDWF PCL,F RETLW B'00000001' ; LED 0 RETLW B'00000010' ; LED 1 RETLW B'00000010' ; LED 2 RETLW B'00000100' ; LED 3 RETLW B'00000100' ; LED 4 RETLW B'00010000' ; LED 5 RETLW B'00000001' ; LED 6 RETLW B'00000100' ; LED 7 RETLW B'00000001' ; LED 8 RETLW B'00010000' ; LED 9 ; TABLE_TRIS CLRF PCLATH ADDWF PCL,F RETLW B'00111100' ; LED 0 RETLW B'00111100' ; LED 1 RETLW B'00111001' ; LED 2 RETLW B'00111001' ; LED 3 RETLW B'00101011' ; LED 4 RETLW B'00101011' ; LED 5 RETLW B'00111010' ; LED 6 RETLW B'00111010' ; LED 7 RETLW B'00101110' ; LED 8 RETLW B'00101110' ; LED 9 ; ;--------------------------------------------------------------------- ; 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 ; ;--------------------------------------------------------------------- ; Waitルーチン(注)割り込みが入るので下記時間にはならない ;--------------------------------------------------------------------- WAIT1MS ;1ミリ秒(998usec) CALLと合わせて1.000ms MOVLW D'248' ;1cycle MOVWF CNT1 ;1cycle W1MSLP NOP ;1cycle*248 DECFSZ CNT1,F ;1cycle*247+2cycle GOTO W1MSLP ;2cycle*247 GOTO $+1 ;2cycle NOP ;1cycle RETURN ;2cycle ; WAIT ;約0.06秒 MOVLW D'30' ;1cycle MOVWF CNT2 ;1cycle WAITLP CALL WAIT1MS ;(2cycle+998cycle)*249 CALL WAIT1MS ;(2cycle+998cycle)*249 GOTO $+1 ;2cycle*249 GOTO $+1 ;2cycle*249 NOP ;1cycle*249 DECFSZ CNT2,F ;1cycle*248+2cycle GOTO WAITLP ;2cycle*248 NOP ;1cycle GOTO $+1 ;2cycle RETURN ;2cycle ; ;--------------------------------------------------------------------- ; 表示パターン1 ;--------------------------------------------------------------------- ORG H'0100' PAT1 MOVLW D'11' ; LEDの表示パターン数 MOVWF CNT ; ループカウント設定 CLRF PATADDR ; パターンアドレス PAT1LP CALL PAT1DT MOVWF LEDBUF INCF PATADDR,F CALL PAT1DT MOVWF LEDBUF+1 INCF PATADDR,F CALL WAIT ; 表示パターン切り替え待ち時間 DECFSZ CNT,F GOTO PAT1LP RETURN ; PAT1DT MOVLW H'01' MOVWF PCLATH MOVF PATADDR,W ADDWF PCL,F RETLW B'00000000' ; 8ビット RETLW B'00000000' ; 下位2ビットのみ使用 RETLW B'00000001' ; RETLW B'00000000' ; RETLW B'00000011' ; RETLW B'00000000' ; RETLW B'00000111' ; RETLW B'00000000' ; RETLW B'00001111' ; RETLW B'00000000' ; RETLW B'00011111' ; RETLW B'00000000' ; RETLW B'00111111' ; RETLW B'00000000' ; RETLW B'01111111' ; RETLW B'00000000' ; RETLW B'11111111' ; RETLW B'00000000' ; RETLW B'11111111' ; RETLW B'00000001' ; RETLW B'11111111' ; RETLW B'00000011' ; ; ;--------------------------------------------------------------------- ; 表示パターン2 ;--------------------------------------------------------------------- PAT2 MOVLW D'11' ; LEDの表示パターン数 MOVWF CNT ; ループカウント設定 CLRF PATADDR ; パターンアドレス PAT2LP CALL PAT2DT MOVWF LEDBUF INCF PATADDR,F CALL PAT2DT MOVWF LEDBUF+1 INCF PATADDR,F CALL WAIT DECFSZ CNT,F GOTO PAT2LP RETURN ; PAT2DT MOVLW H'01' MOVWF PCLATH MOVF PATADDR,W ADDWF PCL,F RETLW B'00000000' ; RETLW B'00000000' ; RETLW B'00000000' ; RETLW B'00000010' ; RETLW B'00000000' ; RETLW B'00000011' ; RETLW B'10000000' ; RETLW B'00000011' ; RETLW B'11000000' ; RETLW B'00000011' ; RETLW B'11100000' ; RETLW B'00000011' ; RETLW B'11110000' ; RETLW B'00000011' ; RETLW B'11111000' ; RETLW B'00000011' ; RETLW B'11111100' ; RETLW B'00000011' ; RETLW B'11111110' ; RETLW B'00000011' ; RETLW B'11111111' ; RETLW B'00000011' ; ; ;--------------------------------------------------------------------- ; 表示パターン3 ;--------------------------------------------------------------------- PAT3 MOVLW D'10' ; LEDの表示パターン数 MOVWF CNT ; ループカウント設定 CLRF PATADDR ; パターンアドレス PAT3LP CALL PAT3DT MOVWF LEDBUF INCF PATADDR,F CALL PAT3DT MOVWF LEDBUF+1 INCF PATADDR,F CALL WAIT ; 表示パターン切り替え待ち時間 DECFSZ CNT,F GOTO PAT3LP RETURN ; PAT3DT MOVLW H'01' MOVWF PCLATH MOVF PATADDR,W ADDWF PCL,F RETLW B'00000000' ; RETLW B'00000000' ; RETLW B'00000001' ; RETLW B'00000010' ; RETLW B'00000011' ; RETLW B'00000011' ; RETLW B'10000111' ; RETLW B'00000011' ; RETLW B'11001111' ; RETLW B'00000011' ; RETLW B'11111111' ; RETLW B'00000011' ; RETLW B'11111110' ; RETLW B'00000001' ; RETLW B'11111100' ; RETLW B'00000000' ; RETLW B'01111000' ; RETLW B'00000000' ; RETLW B'00110000' ; RETLW B'00000000' ; ; ;--------------------------------------------------------------------- ; 表示パターン4 ;--------------------------------------------------------------------- PAT4 MOVLW D'10' ; LEDの表示パターン数 MOVWF CNT ; ループカウント設定 CLRF PATADDR ; パターンアドレス PAT4LP CALL PAT4DT MOVWF LEDBUF INCF PATADDR,F CALL PAT4DT MOVWF LEDBUF+1 INCF PATADDR,F CALL WAIT DECFSZ CNT,F GOTO PAT4LP RETURN ; PAT4DT MOVLW H'01' MOVWF PCLATH MOVF PATADDR,W ADDWF PCL,F RETLW B'00000000' ; RETLW B'00000000' ; RETLW B'00110000' ; RETLW B'00000000' ; RETLW B'01111000' ; RETLW B'00000000' ; RETLW B'11111100' ; RETLW B'00000000' ; RETLW B'11111110' ; RETLW B'00000001' ; RETLW B'11111111' ; RETLW B'00000011' ; RETLW B'11001111' ; RETLW B'00000011' ; RETLW B'10000111' ; RETLW B'00000011' ; RETLW B'00000011' ; RETLW B'00000011' ; RETLW B'00000001' ; RETLW B'00000010' ; ; ;--------------------------------------------------------------------- ; バイナリカウンタ ;--------------------------------------------------------------------- BINCNT CLRF CNTL ; 下位カウンタクリア CLRF CNTH ; 上位カウンタクリア BINCNTLP MOVF CNTL,W MOVWF LEDBUF MOVF CNTH,W MOVWF LEDBUF+1 CALL WAIT1MS CALL WAIT1MS CALL WAIT1MS CALL WAIT1MS ; ; カウントアップ ; INCF CNTL,F BTFSC STATUS,Z INCF CNTH,F BTFSS CNTH,2 GOTO BINCNTLP RETURN ; ;--------------------------------------------------------------------- END ;--------------------------------------------------------------------- ; 終わり ;---------------------------------------------------------------------