;--------------------------------------------------------------------- ; 青色LEDバッチ ; ; 2014.10.28 naka ; 1. I/Oポート ; ; (1). 出力ポート ; GP0-2,5: LEDに繋ぐ ; (2). 入力ポート ; GP4/AN3: タクトスイッチ ; ; 2. 光り方 ; ; 登録したパターンに応じて光る。 ; ; ○ LED0 ; LED11 ○ ○ LED1 ; LED10 ○ ○ LED2 ; LED9 ○ ○ LED3 ; LED8 ○ ○ LED4 ; LED7 ○ ○ LED5 ; ○ LED6 ; ; PWMパターン(光りが流れるパターンでの事例) ; ; LED 0 1 2 3 4 5 6 7 8 91011 ; ・▲●○○○○○○○○○ ; →流れる方向 ; ; 先頭のLEDは明るく、2番目はその半分、3番目はさらに半分の明るさ ; として残光を表現。明るさはソフトでのPWMで制御している。 ; ;--------------------------------------------------------------------- LIST P=PIC12F675 INCLUDE "P12F675.INC" __CONFIG _CPD_OFF & _CP_OFF & _BODEN_ON & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT ERRORLEVEL -302 ;アセンブル時のバンク警告メッセージ抑制 ;--------------------------------------------------------------------- ; マクロ定義 ;--------------------------------------------------------------------- BANK0 MACRO BCF STATUS,RP0 ;BANK0に切り替える ENDM BANK1 MACRO BSF STATUS,RP0 ;BANK1に切り替える ENDM ;--------------------------------------------------------------------- ; 変数レジスタの定義 ;--------------------------------------------------------------------- CNT EQU 20H ; カウンタ CNT1 EQU 21H ; WAIT用カウンタ CNT2 EQU 22H ; WAIT用カウンタ LED_NO EQU 23H ; 点灯するLED番号(0〜9) LEDBUF EQU 24H ; LED表示バッファ(24-26H) LEDCNT EQU 27H ; 割り込みで表示するLED番号カウンタ PATADDR EQU 28H ; 表示パターンのアドレスカウンタ PATCNT EQU 29H ; 表示パターンの表示繰り返しカウンタ TMP EQU 2AH ; 一時作業用(割り込み内) FLWAIT EQU 2BH ; FLASHウエイト時間 PWMCNT EQU 2CH ; 疑似PWMのためのカウンタ(0〜3で変化) ; EE_ADDR EQU 2DH ; EEPROMアドレス EE_DATA EQU 2EH ; EEPROMデータ PATNO EQU 2FH ; 点灯パターン番号 SWFLG EQU 30H ; スイッチフラグ bit:0 LOOPCNT EQU 31H ; 各パターンの繰り返し数 TMP2 EQU 32H ; 一時作業(割り込み外) BINCNTLO EQU 33H ; バイナリカウンタ BINCNTHI EQU 34H ; バイナリカウンタ RNDVAL EQU 35H ; 乱数生成用 WK1 EQU 36H ; 乱数生成用 ; BKUPW EQU 40H ; 割り込み待避用 BKUPS EQU 41H ; 割り込み待避用 BKUPFR EQU 42H ; 割り込み待避用 BKUPPCL EQU 43H ; 割り込み待避用 ; ;--------------------------------------------------------------------- ; EEPROMデータ ; PIC12F675 EEPROM不具合のためPICKITで書き込めなかった。 ; http://ww1.microchip.com/downloads/en/DeviceDoc/80125H.pdf ; EEPROMの初期値(FF)など0〜9以外の場合に強制的にパターン番号を0に ; することで初期値0x00を書き込まなくてすむようにした。 ;--------------------------------------------------------------------- ; ORG H'2100' ; DE H'00' ; 点灯パターン初期値は0 (9通りのパターンを順次点灯) ;--------------------------------------------------------------------- ; リセット・割り込み ;--------------------------------------------------------------------- ORG 00H ; リセット時の飛び込み先 RESET GOTO START ; 初期設定へ ; ;--------------------------------------------------------------------- ; 割り込み処理でダイナミック表示を行う。 ; (4回の割り込みで1LED分 ; 4段階PWM) ;--------------------------------------------------------------------- ORG 04H ; 割り込み時の飛び込み先 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 ;割り込みフラグリセット ; ; 点灯するLEDの明るさを確認 ; MOVF LEDCNT,W ; LED番号 CALL LEDBRT ; 0,1,2,4が返る SUBWF PWMCNT,W ; PWMCNT - 明るさ > 0 なら点灯 BTFSS STATUS,C GOTO DISP GOTO UNDISP ; DISP 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 PWMCNT,W ANDLW H'03' MOVWF PWMCNT BTFSS STATUS,Z GOTO CHKSW ; INCF LEDCNT,F ; 次の割り込みに備え、カウントアップ MOVF LEDCNT,W SUBLW D'12' BTFSC STATUS,Z CLRF LEDCNT ; CHKSW BCF SWFLG,0 BTFSS GPIO,4 ; タクトスイッチ BSF SWFLG,0 ; RSTREG ;レジスタ復元 MOVF BKUPPCL,W ;復元(PCLATHレジ) MOVWF PCLATH 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 ; 全割込み禁止 ; CLRF GPIO MOVLW B'00000111' ; GP0-2をデジタルI/Oに設定 MOVWF CMCON ; デフォルトはコンパレータ BANK1 CALL 3FFH ; 内部OSCのキャリブレーションデータ MOVWF OSCCAL ; OSCCALレジスタにセット CLRF ANSEL MOVLW H'FF' MOVWF TRISIO ; ポートをひとまず全て入力設定 ;割り込みタイマーセット MOVLW H'88' ; プリスケーラを使わない MOVWF OPTION_REG ; clock4MHz -> 1Mcycle ; 1Mcycle/256/2=3,906Hz(=256usec毎) ; 割り込み4回でひとつのLEDを点灯 ; 明るい :割り込み4回とも点灯 ; 少し暗い:割り込み4回のうち2回のみ点灯 ; 暗い :割り込み4回のうち1回のみ点灯 ; LED 12個x4回なので3,906/48=81Hzとなりチラチラしない BANK0 ; CLRF LEDCNT ; LEDカウンタクリア CLRF LEDBUF ; LEDバッファクリア CLRF LEDBUF+1 ; LEDバッファクリア CLRF LEDBUF+2 ; LEDバッファクリア ; CLRF PWMCNT CLRF SWFLG ; EEPROMに格納されたパターン番号取り出し MOVLW H'00' MOVWF EE_ADDR CALL REDEEP ; 読み出し MOVWF PATNO SUBLW D'9' ; もし9以上の番号だったら0クリア BTFSS STATUS,C CLRF PATNO ; ;--------------------------------------------------------------------- ; メイン ;--------------------------------------------------------------------- MAIN BSF INTCON,T0IE ; タイマー0割り込みイネーブル BSF INTCON,GIE ; 割り込み許可 ; MAINLP MOVF PATNO,W ; パターン番号に応じて表示 MOVWF TMP2 BCF STATUS,C RLF TMP2,W ; 2倍 CLRF PCLATH ADDWF PCL,F ; (0) CALL PAT0 GOTO CHKSWFLG ; (1) CALL PAT1 GOTO CHKSWFLG ; (2) CALL PAT2 GOTO CHKSWFLG ; (3) CALL PAT3 GOTO CHKSWFLG ; (4) CALL PAT4 GOTO CHKSWFLG ; (5) CALL PAT5 GOTO CHKSWFLG ; (6) CALL PAT6 GOTO CHKSWFLG ; (7) CALL PAT7 GOTO CHKSWFLG ; (8) CALL PAT8 GOTO CHKSWFLG ; (9) CALL PAT9 GOTO CHKSWFLG ; CHKSWFLG BTFSS SWFLG,0 ; SWが押された GOTO MAINLP ; CHGPAT ; パターン番号変更 INCF PATNO,F MOVF PATNO,W SUBLW D'10' BTFSC STATUS,Z CLRF PATNO CALL DSPPATNO ; パターン番号のLEDのみ点灯 ; MOVF PATNO,W MOVWF EE_DATA CALL WRTEEP ; パターン番号を記録 ; BTFSC SWFLG,0 ; スイッチが離されるまで待つ GOTO $-1 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'00100000' ; LED 5 RETLW B'00000001' ; LED 6 RETLW B'00000100' ; LED 7 RETLW B'00000001' ; LED 8 RETLW B'00100000' ; LED 9 RETLW B'00000010' ; LED 10 RETLW B'00100000' ; LED 11 ; 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'00011011' ; LED 4 RETLW B'00011011' ; LED 5 RETLW B'00111010' ; LED 6 RETLW B'00111010' ; LED 7 RETLW B'00011110' ; LED 8 RETLW B'00011110' ; LED 9 RETLW B'00011101' ; LED 10 RETLW B'00011101' ; LED 11 ; ;--------------------------------------------------------------------- ; 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 ; ;--------------------------------------------------------------------- ; LED番号からLEDBUFの値(明るさ)を取り出す(0,1,2,4) ;--------------------------------------------------------------------- LEDBRT BCF STATUS,C RLF LEDCNT,W ; LED番号を2倍しジャンプ先アドレスに変換 CLRF PCLATH ADDWF PCL,F ; CALL LEDNO_0 GOTO LEDBRT_1 CALL LEDNO_1 GOTO LEDBRT_1 CALL LEDNO_2 GOTO LEDBRT_1 CALL LEDNO_3 GOTO LEDBRT_1 CALL LEDNO_4 GOTO LEDBRT_1 CALL LEDNO_5 GOTO LEDBRT_1 CALL LEDNO_6 GOTO LEDBRT_1 CALL LEDNO_7 GOTO LEDBRT_1 CALL LEDNO_8 GOTO LEDBRT_1 CALL LEDNO_9 GOTO LEDBRT_1 CALL LEDNO_10 GOTO LEDBRT_1 CALL LEDNO_11 LEDBRT_1 MOVWF TMP SUBLW D'3' BTFSC STATUS,Z INCF TMP,F MOVF TMP,W RETURN ; LEDNO_0 MOVF LEDBUF,W ANDLW B'00000011' ; LEDNO = 0 RETURN ; LEDNO_1 MOVF LEDBUF,W ANDLW B'00001100' ; LEDNO = 1 MOVWF TMP BCF STATUS,C RRF TMP,F RRF TMP,W RETURN ; LEDNO_2 SWAPF LEDBUF,W ANDLW B'00000011' ; LEDNO = 2 RETURN ; LEDNO_3 SWAPF LEDBUF,W ANDLW B'00001100' ; LEDNO = 3 MOVWF TMP BCF STATUS,C RRF TMP,F RRF TMP,W RETURN ; LEDNO_4 MOVF LEDBUF+1,W ANDLW B'00000011' ; LEDNO = 4 RETURN ; LEDNO_5 MOVF LEDBUF+1,W ANDLW B'00001100' ; LEDNO = 5 MOVWF TMP BCF STATUS,C RRF TMP,F RRF TMP,W RETURN ; LEDNO_6 SWAPF LEDBUF+1,W ANDLW B'00000011' ; LEDNO = 6 RETURN ; LEDNO_7 SWAPF LEDBUF+1,W ANDLW B'00001100' ; LEDNO = 7 MOVWF TMP BCF STATUS,C RRF TMP,F RRF TMP,W RETURN ; LEDNO_8 MOVF LEDBUF+2,W ANDLW B'00000011' ; LEDNO = 8 RETURN ; LEDNO_9 MOVF LEDBUF+2,W ANDLW B'00001100' ; LEDNO = 9 MOVWF TMP BCF STATUS,C RRF TMP,F RRF TMP,W RETURN ; LEDNO_10 SWAPF LEDBUF+2,W ANDLW B'00000011' ; LEDNO = 10 RETURN ; LEDNO_11 SWAPF LEDBUF+2,W ANDLW B'00001100' ; LEDNO = 11 MOVWF TMP BCF STATUS,C RRF TMP,F RRF TMP,W RETURN ; ;--------------------------------------------------------------------- ; Waitルーチン(注)割り込みが入るので下記時間にはならない ;--------------------------------------------------------------------- W100US ; 約100usec MOVLW D'32' MOVWF CNT1 W100USLP DECFSZ CNT1,F GOTO W100USLP RETURN ; 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 ; WFLASH MOVF FLWAIT,W ;1cycle MOVWF CNT2 ;1cycle WFLASHLP CALL WAIT1MS DECFSZ CNT2,F GOTO WFLASHLP RETURN ;--------------------------------------------------------------------- ; 表示パターン0(パターン1〜9繰り返し) ;--------------------------------------------------------------------- PAT0 MOVLW D'6' MOVWF LOOPCNT CALL PAT1 BTFSC SWFLG,0 ; タクトSWが押されたら抜ける RETURN DECFSZ LOOPCNT,F GOTO $-4 ; MOVLW D'10' MOVWF LOOPCNT CALL PAT2 BTFSC SWFLG,0 ; タクトSWが押されたら抜ける RETURN DECFSZ LOOPCNT,F GOTO $-4 ; MOVLW D'6' MOVWF LOOPCNT CALL PAT3 BTFSC SWFLG,0 ; タクトSWが押されたら抜ける RETURN DECFSZ LOOPCNT,F GOTO $-4 ; MOVLW D'6' MOVWF LOOPCNT CALL PAT4 BTFSC SWFLG,0 ; タクトSWが押されたら抜ける RETURN DECFSZ LOOPCNT,F GOTO $-4 ; MOVLW D'10' MOVWF LOOPCNT CALL PAT5 BTFSC SWFLG,0 ; タクトSWが押されたら抜ける RETURN DECFSZ LOOPCNT,F GOTO $-4 ; MOVLW D'10' MOVWF LOOPCNT CALL PAT6 BTFSC SWFLG,0 ; タクトSWが押されたら抜ける RETURN DECFSZ LOOPCNT,F GOTO $-4 ; MOVLW D'6' MOVWF LOOPCNT CALL PAT7 BTFSC SWFLG,0 ; タクトSWが押されたら抜ける RETURN DECFSZ LOOPCNT,F GOTO $-4 ; MOVLW D'1' MOVWF LOOPCNT CALL PAT8 BTFSC SWFLG,0 ; タクトSWが押されたら抜ける RETURN DECFSZ LOOPCNT,F GOTO $-4 ; MOVLW D'1' MOVWF LOOPCNT CALL PAT9 BTFSC SWFLG,0 ; タクトSWが押されたら抜ける RETURN DECFSZ LOOPCNT,F GOTO $-4 ; RETURN ;--------------------------------------------------------------------- ; 表示パターン1(単純回転) ;--------------------------------------------------------------------- PAT1 MOVLW D'80' MOVWF FLWAIT ; MOVLW D'12' ; LEDの表示パターン数 MOVWF CNT ; ループカウント設定 CLRF PATADDR ; パターンアドレス PAT1LP CALL PAT1DT MOVWF LEDBUF INCF PATADDR,F CALL PAT1DT MOVWF LEDBUF+1 INCF PATADDR,F CALL PAT1DT MOVWF LEDBUF+2 INCF PATADDR,F ; CLRF PCLATH ; CALL WFLASH BTFSC SWFLG,0 ; タクトSWが押されたら抜ける RETURN ; DECFSZ CNT,F GOTO PAT1LP RETURN ; PAT1DT MOVLW H'01' MOVWF PCLATH MOVF PATADDR,W ADDWF PCL,F ; 疑似PWMで1灯あたり4回の割り込みで点灯 ; 明るい:4回共オン 定義値3 = '11' ; 中間:2回だけオン 2 = '10' ; 暗い:1回だけオン 1 = '01' ; ; bit意味 xx xx xx xx ; LED 3 2 1 0 ; bit意味 xx xx xx xx ; LED 7 6 5 4 ; bit意味 xx xx xx xx ; LED11 10 9 8 ; 1 RETLW B'00000011' ; RETLW B'00000000' ; RETLW B'10010000' ; ; 2 RETLW B'00001110' ; RETLW B'00000000' ; RETLW B'01000000' ; ; 3 RETLW B'00111001' ; RETLW B'00000000' ; RETLW B'00000000' ; ; 4 RETLW B'11100100' ; RETLW B'00000000' ; RETLW B'00000000' ; ; 5 RETLW B'10010000' ; RETLW B'00000011' ; RETLW B'00000000' ; ; 6 RETLW B'01000000' ; RETLW B'00001110' ; RETLW B'00000000' ; ; 7 RETLW B'00000000' ; RETLW B'00111001' ; RETLW B'00000000' ; ; 8 RETLW B'00000000' ; RETLW B'11100100' ; RETLW B'00000000' ; ; 9 RETLW B'00000000' ; RETLW B'10010000' ; RETLW B'00000011' ; ; 10 RETLW B'00000000' ; RETLW B'01000000' ; RETLW B'00001110' ; ; 11 RETLW B'00000000' ; RETLW B'00000000' ; RETLW B'00111001' ; ; 12 RETLW B'00000000' ; RETLW B'00000000' ; RETLW B'11100100' ; ; ;--------------------------------------------------------------------- ; 表示パターン2(振り子) ;--------------------------------------------------------------------- PAT2 MOVLW D'80' MOVWF FLWAIT ; MOVLW D'16' ; LEDの表示パターン数 MOVWF CNT ; ループカウント設定 CLRF PATADDR ; パターンアドレス PAT2LP CALL PAT2DT MOVWF LEDBUF INCF PATADDR,F CALL PAT2DT MOVWF LEDBUF+1 INCF PATADDR,F CALL PAT2DT MOVWF LEDBUF+2 INCF PATADDR,F ; CLRF PCLATH ; CALL WFLASH BTFSC SWFLG,0 ; タクトSWが押されたら抜ける RETURN ; DECFSZ CNT,F GOTO PAT2LP RETURN ; PAT2DT MOVLW H'01' MOVWF PCLATH MOVF PATADDR,W ADDWF PCL,F ; 疑似PWMで1灯あたり4回の割り込みで点灯 ; 明るい:4回共オン 定義値3 = '11' ; 中間:2回だけオン 2 = '10' ; 暗い:1回だけオン 1 = '01' ; ; bit意味 xx xx xx xx ; LED 3 2 1 0 ; bit意味 xx xx xx xx ; LED 7 6 5 4 ; bit意味 xx xx xx xx ; LED11 10 9 8 ; 1 RETLW B'11000000' ; RETLW B'00000000' ; RETLW B'00000000' ; ; 2 RETLW B'10000000' ; RETLW B'00000011' ; RETLW B'00000000' ; ; 3 RETLW B'01000000' ; RETLW B'00001110' ; RETLW B'00000000' ; ; 4 RETLW B'00000000' ; RETLW B'00111001' ; RETLW B'00000000' ; ; 5 RETLW B'00000000' ; RETLW B'11100100' ; RETLW B'00000000' ; ; 6 RETLW B'00000000' ; RETLW B'10010000' ; RETLW B'00000011' ; ; 7 RETLW B'00000000' ; RETLW B'01000000' ; RETLW B'00001110' ; ; 8 RETLW B'00000000' ; RETLW B'00000000' ; RETLW B'00001101' ; ; 9 RETLW B'00000000' ; RETLW B'00000000' ; RETLW B'00001100' ; ; 10 RETLW B'00000000' ; RETLW B'00000000' ; RETLW B'00001011' ; ; 11 RETLW B'00000000' ; RETLW B'11000000' ; RETLW B'00000110' ; ; 12 RETLW B'00000000' ; RETLW B'10110000' ; RETLW B'00000001' ; ; 13 RETLW B'00000000' ; RETLW B'01101100' ; RETLW B'00000000' ; ; 14 RETLW B'00000000' ; RETLW B'00011011' ; RETLW B'00000000' ; ; 15 RETLW B'11000000' ; RETLW B'00000110' ; RETLW B'00000000' ; ; 16 RETLW B'11000000' ; RETLW B'00000001' ; RETLW B'00000000' ; ; ;--------------------------------------------------------------------- ; 表示パターン3(全体スムース点滅) ;--------------------------------------------------------------------- ORG 200H PAT3 MOVLW D'150' MOVWF FLWAIT ; 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 PAT3DT MOVWF LEDBUF+2 INCF PATADDR,F ; CLRF PCLATH ; CALL WFLASH BTFSC SWFLG,0 ; タクトSWが押されたら抜ける RETURN ; DECFSZ CNT,F GOTO PAT3LP RETURN ; PAT3DT MOVLW H'02' MOVWF PCLATH MOVF PATADDR,W ADDWF PCL,F ; 疑似PWMで1灯あたり4回の割り込みで点灯 ; 明るい:4回共オン 定義値3 = '11' ; 中間:2回だけオン 2 = '10' ; 暗い:1回だけオン 1 = '01' ; ; bit意味 xx xx xx xx ; LED 3 2 1 0 ; bit意味 xx xx xx xx ; LED 7 6 5 4 ; bit意味 xx xx xx xx ; LED11 10 9 8 ; 1 RETLW B'00000000' ; RETLW B'00000000' ; RETLW B'00000000' ; ; 2 RETLW B'00000000' ; RETLW B'00000000' ; RETLW B'00000000' ; ; 3 RETLW B'00000000' ; RETLW B'00000000' ; RETLW B'00000000' ; ; 4 RETLW B'00000000' ; RETLW B'00000000' ; RETLW B'00000000' ; ; 5 RETLW B'01010101' ; RETLW B'01010101' ; RETLW B'01010101' ; ; 6 RETLW B'10101010' ; RETLW B'10101010' ; RETLW B'10101010' ; ; 7 RETLW B'11111111' ; RETLW B'11111111' ; RETLW B'11111111' ; ; 8 RETLW B'11111111' ; RETLW B'11111111' ; RETLW B'11111111' ; ; 9 RETLW B'10101010' ; RETLW B'10101010' ; RETLW B'10101010' ; ; 10 RETLW B'01010101' ; RETLW B'01010101' ; RETLW B'01010101' ; ; ;--------------------------------------------------------------------- ; 表示パターン4(タイムショック表示) ;--------------------------------------------------------------------- PAT4 MOVLW D'80' MOVWF FLWAIT ; MOVLW D'13' ; LEDの表示パターン数 MOVWF CNT ; ループカウント設定 CLRF PATADDR ; パターンアドレス PAT4LP CALL PAT4DT MOVWF LEDBUF INCF PATADDR,F CALL PAT4DT MOVWF LEDBUF+1 INCF PATADDR,F CALL PAT4DT MOVWF LEDBUF+2 INCF PATADDR,F ; CLRF PCLATH ; CALL WFLASH BTFSC SWFLG,0 ; タクトSWが押されたら抜ける RETURN ; DECFSZ CNT,F GOTO PAT4LP RETURN ; PAT4DT MOVLW H'02' MOVWF PCLATH MOVF PATADDR,W ADDWF PCL,F ; 疑似PWMで1灯あたり4回の割り込みで点灯 ; 明るい:4回共オン 定義値3 = '11' ; 中間:2回だけオン 2 = '10' ; 暗い:1回だけオン 1 = '01' ; ; bit意味 xx xx xx xx ; LED 3 2 1 0 ; bit意味 xx xx xx xx ; LED 7 6 5 4 ; bit意味 xx xx xx xx ; LED11 10 9 8 ; 1 RETLW B'00000000' ; RETLW B'00000000' ; RETLW B'00000000' ; ; 2 RETLW B'00000010' ; RETLW B'00000000' ; RETLW B'00000000' ; ; 3 RETLW B'00001010' ; RETLW B'00000000' ; RETLW B'00000000' ; ; 4 RETLW B'00101010' ; RETLW B'00000000' ; RETLW B'00000000' ; ; 5 RETLW B'10101010' ; RETLW B'00000000' ; RETLW B'00000000' ; ; 6 RETLW B'10101010' ; RETLW B'00000010' ; RETLW B'00000000' ; ; 7 RETLW B'10101010' ; RETLW B'00001010' ; RETLW B'00000000' ; ; 8 RETLW B'10101010' ; RETLW B'00101010' ; RETLW B'00000000' ; ; 9 RETLW B'10101010' ; RETLW B'10101010' ; RETLW B'00000000' ; ; 10 RETLW B'10101010' ; RETLW B'10101010' ; RETLW B'00000010' ; ; 11 RETLW B'10101010' ; RETLW B'10101010' ; RETLW B'00001010' ; ; 12 RETLW B'10101010' ; RETLW B'10101010' ; RETLW B'00101010' ; ; 13 RETLW B'10101010' ; RETLW B'10101010' ; RETLW B'10101010' ; ; ;--------------------------------------------------------------------- ; 表示パターン5(左右に分かれて流れる) ;--------------------------------------------------------------------- PAT5 MOVLW D'80' MOVWF FLWAIT ; MOVLW D'12' ; LEDの表示パターン数 MOVWF CNT ; ループカウント設定 CLRF PATADDR ; パターンアドレス PAT5LP CALL PAT5DT MOVWF LEDBUF INCF PATADDR,F CALL PAT5DT MOVWF LEDBUF+1 INCF PATADDR,F CALL PAT5DT MOVWF LEDBUF+2 INCF PATADDR,F ; CLRF PCLATH ; CALL WFLASH BTFSC SWFLG,0 ; タクトSWが押されたら抜ける RETURN ; DECFSZ CNT,F GOTO PAT5LP RETURN ; PAT5DT MOVLW H'02' MOVWF PCLATH MOVF PATADDR,W ADDWF PCL,F ; 疑似PWMで1灯あたり4回の割り込みで点灯 ; 明るい:4回共オン 定義値3 = '11' ; 中間:2回だけオン 2 = '10' ; 暗い:1回だけオン 1 = '01' ; ; bit意味 xx xx xx xx ; LED 3 2 1 0 ; bit意味 xx xx xx xx ; LED 7 6 5 4 ; bit意味 xx xx xx xx ; LED11 10 9 8 ; 1 RETLW B'00001110' ; RETLW B'00000000' ; RETLW B'11000000' ; ; 2 RETLW B'00111001' ; RETLW B'00000000' ; RETLW B'10110000' ; ; 3 RETLW B'11100100' ; RETLW B'00000000' ; RETLW B'01101100' ; ; 4 RETLW B'10010000' ; RETLW B'00000011' ; RETLW B'00011011' ; ; 5 RETLW B'01000000' ; RETLW B'11001110' ; RETLW B'00000110' ; ; 6 RETLW B'00000000' ; RETLW B'10111001' ; RETLW B'00000001' ; ; 7 RETLW B'00000000' ; RETLW B'11101100' ; RETLW B'00000000' ; ; 8 RETLW B'00000000' ; RETLW B'10011011' ; RETLW B'00000011' ; ; 9 RETLW B'11000000' ; RETLW B'01000110' ; RETLW B'00001110' ; ; 10 RETLW B'10110000' ; RETLW B'00000001' ; RETLW B'00111001' ; ; 11 RETLW B'01101100' ; RETLW B'00000000' ; RETLW B'11100100' ; ; 12 RETLW B'00011011' ; RETLW B'00000000' ; RETLW B'10010000' ; ; ;--------------------------------------------------------------------- ; 表示パターン6(チェイス) ;--------------------------------------------------------------------- PAT6 MOVLW D'80' MOVWF FLWAIT ; MOVLW D'6' ; LEDの表示パターン数 MOVWF CNT ; ループカウント設定 CLRF PATADDR ; パターンアドレス PAT6LP CALL PAT6DT MOVWF LEDBUF INCF PATADDR,F CALL PAT6DT MOVWF LEDBUF+1 INCF PATADDR,F CALL PAT6DT MOVWF LEDBUF+2 INCF PATADDR,F ; CLRF PCLATH ; CALL WFLASH BTFSC SWFLG,0 ; タクトSWが押されたら抜ける RETURN ; DECFSZ CNT,F GOTO PAT6LP RETURN ; PAT6DT MOVLW H'02' MOVWF PCLATH MOVF PATADDR,W ADDWF PCL,F ; 疑似PWMで1灯あたり4回の割り込みで点灯 ; 明るい:4回共オン 定義値3 = '11' ; 中間:2回だけオン 2 = '10' ; 暗い:1回だけオン 1 = '01' ; ; bit意味 xx xx xx xx ; LED 3 2 1 0 ; bit意味 xx xx xx xx ; LED 7 6 5 4 ; bit意味 xx xx xx xx ; LED11 10 9 8 ; 1 RETLW B'00000011' ; RETLW B'00111001' ; RETLW B'10010000' ; ; 2 RETLW B'00001110' ; RETLW B'11101000' ; RETLW B'01000000' ; ; 3 RETLW B'00111001' ; RETLW B'10010000' ; RETLW B'00000011' ; ; 4 RETLW B'11100100' ; RETLW B'01000000' ; RETLW B'00001110' ; ; 5 RETLW B'10010000' ; RETLW B'00000011' ; RETLW B'00111001' ; ; 6 RETLW B'01000000' ; RETLW B'00001110' ; RETLW B'11101000' ; ; ;--------------------------------------------------------------------- ; 表示パターン7(0,1,2,3,6,12) ;--------------------------------------------------------------------- ORG 300H PAT7 MOVLW D'255' MOVWF FLWAIT ; MOVLW D'10' ; LEDの表示パターン数 MOVWF CNT ; ループカウント設定 CLRF PATADDR ; パターンアドレス PAT7LP CALL PAT7DT MOVWF LEDBUF INCF PATADDR,F CALL PAT7DT MOVWF LEDBUF+1 INCF PATADDR,F CALL PAT7DT MOVWF LEDBUF+2 INCF PATADDR,F ; CLRF PCLATH ; CALL WFLASH BTFSC SWFLG,0 ; タクトSWが押されたら抜ける RETURN ; DECFSZ CNT,F GOTO PAT7LP RETURN ; PAT7DT MOVLW H'03' MOVWF PCLATH MOVF PATADDR,W ADDWF PCL,F ; 疑似PWMで1灯あたり4回の割り込みで点灯 ; 明るい:4回共オン 定義値3 = '11' ; 中間:2回だけオン 2 = '10' ; 暗い:1回だけオン 1 = '01' ; ; bit意味 xx xx xx xx ; LED 3 2 1 0 ; bit意味 xx xx xx xx ; LED 7 6 5 4 ; bit意味 xx xx xx xx ; LED11 10 9 8 ; 1 RETLW B'00000000' ; RETLW B'00000000' ; RETLW B'00000000' ; ; 2 RETLW B'00000011' ; RETLW B'00000000' ; RETLW B'00000000' ; ; 3 RETLW B'00000000' ; RETLW B'00000000' ; RETLW B'00000000' ; ; 4 RETLW B'00000011' ; RETLW B'00110000' ; RETLW B'00000000' ; ; 5 RETLW B'00000000' ; RETLW B'00000000' ; RETLW B'00000000' ; ; 6 RETLW B'00000011' ; RETLW B'00000011' ; RETLW B'00000011' ; ; 7 RETLW B'00000000' ; RETLW B'00000000' ; RETLW B'00000000' ; ; 8 RETLW B'00110011' ; RETLW B'00110011' ; RETLW B'00110011' ; ; 9 RETLW B'00000000' ; RETLW B'00000000' ; RETLW B'00000000' ; ; 10 RETLW B'11111111' ; RETLW B'11111111' ; RETLW B'11111111' ; ; ;--------------------------------------------------------------------- ; 表示パターン8(バイナリカウンタ) ;--------------------------------------------------------------------- PAT8 MOVLW D'3' MOVWF FLWAIT ; CLRF BINCNTLO CLRF BINCNTHI PAT8LP MOVF BINCNTLO,W ANDLW H'0F' MOVWF PATADDR CALL BINEXP ; 4ビットを8ビットに拡張 MOVWF LEDBUF ; SWAPF BINCNTLO,W ANDLW H'0F' MOVWF PATADDR CALL BINEXP ; 4ビットを8ビットに拡張 MOVWF LEDBUF+1 ; MOVF BINCNTHI,W ANDLW H'0F' MOVWF PATADDR CALL BINEXP ; 4ビットを8ビットに拡張 MOVWF LEDBUF+2 ; MOVLW D'1' ADDWF BINCNTLO,F BTFSC STATUS,C INCF BINCNTHI,F ; BTFSC BINCNTHI,4 RETURN ; 1024でリターン ; CALL WFLASH BTFSC SWFLG,0 ; タクトSWが押されたら抜ける RETURN ; GOTO PAT8LP ; BINEXP MOVLW H'03' MOVWF PCLATH MOVF PATADDR,W ADDWF PCL,F RETLW B'00000000' ;0 RETLW B'00000011' ;1 RETLW B'00001100' ;2 RETLW B'00001111' ;3 RETLW B'00110000' ;4 RETLW B'00110011' ;5 RETLW B'00111100' ;6 RETLW B'00111111' ;7 RETLW B'11000000' ;8 RETLW B'11000011' ;9 RETLW B'11001100' ;10 RETLW B'11001111' ;11 RETLW B'11110000' ;12 RETLW B'11110011' ;13 RETLW B'11111100' ;14 RETLW B'11111111' ;15 ; ;--------------------------------------------------------------------- ; 表示パターン9(ランダム) ;--------------------------------------------------------------------- PAT9 MOVLW D'150' MOVWF FLWAIT ; MOVLW D'50' MOVWF CNT CALL RANDINT PAT9LP CALL RANDOM MOVWF TMP2 ANDLW H'0F' MOVWF PATADDR CALL BINEXP ; 4ビットを8ビットに拡張 MOVWF LEDBUF ; SWAPF TMP2,W ANDLW H'0F' MOVWF PATADDR CALL BINEXP ; 4ビットを8ビットに拡張 MOVWF LEDBUF+1 ; CALL RANDOM ANDLW H'0F' MOVWF PATADDR CALL BINEXP ; 4ビットを8ビットに拡張 MOVWF LEDBUF+2 ; CLRF PCLATH ; CALL WFLASH BTFSC SWFLG,0 ; タクトSWが押されたら抜ける RETURN ; DECFSZ CNT,F GOTO PAT9LP RETURN ; ;--------------------------------------------------------------------- ; M系列乱数(1〜255) ;--------------------------------------------------------------------- RANDINT MOVLW B'00101010' XORWF TMR0,W 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 RETURN ; ;--------------------------------------------------------------------- ; パターン番号の表示(番号のLEDのみ点灯) ;--------------------------------------------------------------------- DSPPATNO CLRF LEDBUF ; 全てのLED消灯 CLRF LEDBUF+1 CLRF LEDBUF+2 MOVLW H'03' MOVWF PCLATH MOVF PATNO,W ADDWF PCL,F GOTO DSPPAT0 GOTO DSPPAT1 GOTO DSPPAT2 GOTO DSPPAT3 GOTO DSPPAT4 GOTO DSPPAT5 GOTO DSPPAT6 GOTO DSPPAT7 GOTO DSPPAT8 GOTO DSPPAT9 DSPPAT0 MOVLW B'00000010' ; 明るさ1/2 MOVWF LEDBUF GOTO DSPRET DSPPAT1 MOVLW B'00001000' MOVWF LEDBUF GOTO DSPRET DSPPAT2 MOVLW B'00100000' MOVWF LEDBUF GOTO DSPRET DSPPAT3 MOVLW B'10000000' MOVWF LEDBUF GOTO DSPRET DSPPAT4 MOVLW B'00000010' MOVWF LEDBUF+1 GOTO DSPRET DSPPAT5 MOVLW B'00001000' MOVWF LEDBUF+1 GOTO DSPRET DSPPAT6 MOVLW B'00100000' MOVWF LEDBUF+1 GOTO DSPRET DSPPAT7 MOVLW B'10000000' MOVWF LEDBUF+1 GOTO DSPRET DSPPAT8 MOVLW B'00000010' MOVWF LEDBUF+2 GOTO DSPRET DSPPAT9 MOVLW B'00001000' MOVWF LEDBUF+2 GOTO DSPRET DSPRET CLRF PCLATH RETURN ;--------------------------------------------------------------------- ; EEPROMへ書き込む(アドレス:EE_ADDR, データEE_DATA) ;--------------------------------------------------------------------- WRTEEP MOVF EE_ADDR,W ; BANK1 MOVWF EEADR ; Data Memory Address to write BANK0 MOVF EE_DATA,W ; BANK1 MOVWF EEDAT ; Data Memory Value to write BSF EECON1,WREN ; Enable writes BCF INTCON,GIE ; Disable INTs. 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. BANK0 RETURN ;--------------------------------------------------------------------- ; EEPROMから読み出す(アドレス:EE_ADDR, 結果:W) ;--------------------------------------------------------------------- REDEEP MOVF EE_ADDR,W ; BANK1 MOVWF EEADR ; Data Memory ; Address to read BSF EECON1,RD ; EE Read MOVF EEDAT,W ; W = EEDAT BANK0 RETURN ;--------------------------------------------------------------------- END ;--------------------------------------------------------------------- ; 終わり ;---------------------------------------------------------------------