;フルカラー矢印(G) ;各モードの動き ;mode00:何もしない ;mode01:カラフルパラレル流し(4マス間隔) ;mode02:カラフルグラデーション流し ;mode03:カラフルパラレル点滅 ;mode04:カラフルグラデーション点滅 ;mode05:カラフルパラレル溜まり ;mode06:カラフルパラレル溜まり崩れ ;mode07:カラフルパラレル流し(1マス間隔・加速性) ;modesolo01:ソロパラレル流し(4-2間隔) ;modesolo02:ソロパラレル点滅 ;modesolo03:ソロパラレル溜まり ;modesolo04:ソロパラレル溜まり崩れ ;modesolo05:ソロパラレルゲージ溜まり ;modesolo06:ソログラデーション点滅 ;modesolo07:ソログラデーション流し LIST p=16F648A RADIX dec #INCLUDE "P16F648A.INC" __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _LVP_OFF & _BODEN_OFF & _CP_OFF & _DATA_CP_OFF r0 equ 20h ;自由に使えるレジスタ r1 equ r0+1 ;自由に使えるレジスタ r2 equ r0+2 ;自由に使えるレジスタ r3 equ r0+3 ;自由に使えるレジスタ r4 equ r0+4 ;自由に使えるレジスタ r5 equ r0+5 ;自由に使えるレジスタ r6 equ r0+6 ;自由に使えるレジスタ r7 equ r0+7 ;自由に使えるレジスタ r8 equ r0+8 ;自由に使えるレジスタ r9 equ r0+9 ;自由に使えるレジスタ rA equ r0+10 ;自由に使えるレジスタ rB equ r0+11 ;自由に使えるレジスタ rC equ r0+12 ;自由に使えるレジスタ rD equ r0+13 ;自由に使えるレジスタ rE equ r0+14 ;自由に使えるレジスタ rF equ r0+15 ;自由に使えるレジスタ lA equ 30h ;パラレル状態時のLEDのデータ(PORTA) lB equ 31h ;パラレル状態時のLEDのデータ(PORTB) wa equ 32h ;wait用カウンタ wa2 equ 33h ;wait用カウンタ speed equ 34h ;wait用変速カウンタ modenum equ 35h ;現在のモード mcountL equ 36h ;モード繰り返し回数下位ビット mcountH equ 37h ;モード繰り返し回数上位ビット org 00h ;@中心部(各色共通) setport bsf STATUS,RP0 ;ポート設定 movlw 00100000b ;RA5のみ入力 movwf TRISA clrf TRISB bcf STATUS,RP0 clrf PORTA clrf PORTB movlw 00000111b movwf CMCON start clrf modenum ;初期リセット loopmset clrf speed ;モード開始前リセット clrf mcountL clrf mcountH clrf PORTA clrf PORTB call msettable ;モード開始時設定 loopmode movlw 1 subwf mcountL,1 ;モード回数カウント btfsc STATUS,C goto loopenter subwf mcountH,1 btfss STATUS,C goto loopend loopenter call modetable ;モード実行 goto loopmode loopend clrf PORTA ;終了時リセット clrf PORTB clrf lA clrf lB bsf PORTA,4 ;終了信号送信 loopsync btfss PORTA,5 ;他のPICを待機 goto loopsync call sswait bcf PORTA,4 call sswait incf modenum,1 ;モード移行 goto loopmset ;Aモード出現順序決定 msettable movf modenum,0 andlw 01111111b addwf PCL,1 ;色別変更(ここから) ;(G) ;(R) ;(B) goto mset01 ;goto mset01 ;goto mset01 goto mset03 ;goto mset03 ;goto mset03 goto mset02 ;goto mset02 ;goto mset02 goto mset05 ;goto mset05 ;goto mset05 goto mset06 ;goto mset06 ;goto mset06 goto mset04 ;goto mset04 ;goto mset04 goto mset07 ;goto mset07 ;goto mset07 goto mset00 ;goto msetsolo02 ;goto mset00 goto mset00 ;goto msetsolo01 ;goto mset00 goto msetsolo02 ;goto mset00 ;goto mset00 goto msetsolo01 ;goto mset00 ;goto mset00 goto mset00 ;goto mset00 ;goto msetsolo02 goto mset00 ;goto mset00 ;goto msetsolo01 goto msetsolo02 ;goto msetsolo02 ;goto mset00 goto msetsolo01 ;goto msetsolo01 ;goto mset00 goto msetsolo02 ;goto mset00 ;goto msetsolo02 goto msetsolo01 ;goto mset00 ;goto msetsolo01 goto mset00 ;goto msetsolo02 ;goto msetsolo02 goto mset00 ;goto msetsolo01 ;goto msetsolo01 goto msetsolo02 ;goto msetsolo02 ;goto msetsolo02 goto msetsolo01 ;goto msetsolo01 ;goto msetsolo01 goto mset01 ;goto mset01 ;goto mset01 goto mset03 ;goto mset03 ;goto mset03 goto mset02 ;goto mset02 ;goto mset02 goto mset05 ;goto mset05 ;goto mset05 goto mset06 ;goto mset06 ;goto mset06 goto mset04 ;goto mset04 ;goto mset04 goto mset07 ;goto mset07 ;goto mset07 goto mset00 ;goto msetsolo03 ;goto mset00 goto mset00 ;goto msetsolo04 ;goto mset00 goto msetsolo03 ;goto mset00 ;goto mset00 goto msetsolo04 ;goto mset00 ;goto mset00 goto mset00 ;goto mset00 ;goto msetsolo03 goto mset00 ;goto mset00 ;goto msetsolo04 goto msetsolo03 ;goto msetsolo03 ;goto mset00 goto msetsolo04 ;goto msetsolo04 ;goto mset00 goto msetsolo03 ;goto mset00 ;goto msetsolo03 goto msetsolo04 ;goto mset00 ;goto msetsolo04 goto mset00 ;goto msetsolo03 ;goto msetsolo03 goto mset00 ;goto msetsolo04 ;goto msetsolo04 goto msetsolo03 ;goto msetsolo03 ;goto msetsolo03 goto msetsolo04 ;goto msetsolo04 ;goto msetsolo04 goto mset01 ;goto mset01 ;goto mset01 goto mset03 ;goto mset03 ;goto mset03 goto mset02 ;goto mset02 ;goto mset02 goto mset05 ;goto mset05 ;goto mset05 goto mset06 ;goto mset06 ;goto mset06 goto mset04 ;goto mset04 ;goto mset04 goto mset07 ;goto mset07 ;goto mset07 goto mset00 ;goto msetsolo02 ;goto mset00 goto mset00 ;goto msetsolo07 ;goto mset00 goto msetsolo02 ;goto mset00 ;goto mset00 goto msetsolo07 ;goto mset00 ;goto mset00 goto mset00 ;goto mset00 ;goto msetsolo02 goto mset00 ;goto mset00 ;goto msetsolo07 goto msetsolo02 ;goto msetsolo02 ;goto mset00 goto msetsolo07 ;goto msetsolo07 ;goto mset00 goto msetsolo02 ;goto mset00 ;goto msetsolo02 goto msetsolo07 ;goto mset00 ;goto msetsolo07 goto mset00 ;goto msetsolo02 ;goto msetsolo02 goto mset00 ;goto msetsolo07 ;goto msetsolo07 goto msetsolo02 ;goto msetsolo02 ;goto msetsolo02 goto msetsolo07 ;goto msetsolo07 ;goto msetsolo07 goto mset01 ;goto mset01 ;goto mset01 goto mset03 ;goto mset03 ;goto mset03 goto mset02 ;goto mset02 ;goto mset02 goto mset05 ;goto mset05 ;goto mset05 goto mset06 ;goto mset06 ;goto mset06 goto mset04 ;goto mset04 ;goto mset04 goto mset07 ;goto mset07 ;goto mset07 goto mset00 ;goto msetsolo05 ;goto mset00 goto mset00 ;goto msetsolo06 ;goto mset00 goto msetsolo05 ;goto mset00 ;goto mset00 goto msetsolo06 ;goto mset00 ;goto mset00 goto mset00 ;goto mset00 ;goto msetsolo05 goto mset00 ;goto mset00 ;goto msetsolo06 goto msetsolo05 ;goto msetsolo05 ;goto mset00 goto msetsolo06 ;goto msetsolo06 ;goto mset00 goto msetsolo05 ;goto mset00 ;goto msetsolo05 goto msetsolo06 ;goto mset00 ;goto msetsolo06 goto mset00 ;goto msetsolo05 ;goto msetsolo05 goto mset00 ;goto msetsolo06 ;goto msetsolo06 goto msetsolo05 ;goto msetsolo05 ;goto msetsolo05 goto msetsolo06 ;goto msetsolo06 ;goto msetsolo06 ;色別変更(ここまで) clrf modenum ;ここまで飛んできたら0に戻ってやり直し goto msettable modetable movf modenum,0 andlw 01111111b addwf PCL,1 ;色別変更(ここから) ;(G) ;(R) ;(B) goto mode01 ;goto mode01 ;goto mode01 goto mode03 ;goto mode03 ;goto mode03 goto mode02 ;goto mode02 ;goto mode02 goto mode05 ;goto mode05 ;goto mode05 goto mode06 ;goto mode06 ;goto mode06 goto mode04 ;goto mode04 ;goto mode04 goto mode07 ;goto mode07 ;goto mode07 goto mode00 ;goto modesolo02 ;goto mode00 goto mode00 ;goto modesolo01 ;goto mode00 goto modesolo02 ;goto mode00 ;goto mode00 goto modesolo01 ;goto mode00 ;goto mode00 goto mode00 ;goto mode00 ;goto modesolo02 goto mode00 ;goto mode00 ;goto modesolo01 goto modesolo02 ;goto modesolo02 ;goto mode00 goto modesolo01 ;goto modesolo01 ;goto mode00 goto modesolo02 ;goto mode00 ;goto modesolo02 goto modesolo01 ;goto mode00 ;goto modesolo01 goto mode00 ;goto modesolo02 ;goto modesolo02 goto mode00 ;goto modesolo01 ;goto modesolo01 goto modesolo02 ;goto modesolo02 ;goto modesolo02 goto modesolo01 ;goto modesolo01 ;goto modesolo01 goto mode01 ;goto mode01 ;goto mode01 goto mode03 ;goto mode03 ;goto mode03 goto mode02 ;goto mode02 ;goto mode02 goto mode05 ;goto mode05 ;goto mode05 goto mode06 ;goto mode06 ;goto mode06 goto mode04 ;goto mode04 ;goto mode04 goto mode07 ;goto mode07 ;goto mode07 goto mode00 ;goto modesolo03 ;goto mode00 goto mode00 ;goto modesolo04 ;goto mode00 goto modesolo03 ;goto mode00 ;goto mode00 goto modesolo04 ;goto mode00 ;goto mode00 goto mode00 ;goto mode00 ;goto modesolo03 goto mode00 ;goto mode00 ;goto modesolo04 goto modesolo03 ;goto modesolo03 ;goto mode00 goto modesolo04 ;goto modesolo04 ;goto mode00 goto modesolo03 ;goto mode00 ;goto modesolo03 goto modesolo04 ;goto mode00 ;goto modesolo04 goto mode00 ;goto modesolo03 ;goto modesolo03 goto mode00 ;goto modesolo04 ;goto modesolo04 goto modesolo03 ;goto modesolo03 ;goto modesolo03 goto modesolo04 ;goto modesolo04 ;goto modesolo04 goto mode01 ;goto mode01 ;goto mode01 goto mode03 ;goto mode03 ;goto mode03 goto mode02 ;goto mode02 ;goto mode02 goto mode05 ;goto mode05 ;goto mode05 goto mode06 ;goto mode06 ;goto mode06 goto mode04 ;goto mode04 ;goto mode04 goto mode07 ;goto mode07 ;goto mode07 goto mode00 ;goto modesolo02 ;goto mode00 goto mode00 ;goto modesolo07 ;goto mode00 goto modesolo02 ;goto mode00 ;goto mode00 goto modesolo07 ;goto mode00 ;goto mode00 goto mode00 ;goto mode00 ;goto modesolo02 goto mode00 ;goto mode00 ;goto modesolo07 goto modesolo02 ;goto modesolo02 ;goto mode00 goto modesolo07 ;goto modesolo07 ;goto mode00 goto modesolo02 ;goto mode00 ;goto modesolo02 goto modesolo07 ;goto mode00 ;goto modesolo07 goto mode00 ;goto modesolo02 ;goto modesolo02 goto mode00 ;goto modesolo07 ;goto modesolo07 goto modesolo02 ;goto modesolo02 ;goto modesolo02 goto modesolo07 ;goto modesolo07 ;goto modesolo07 goto mode01 ;goto mode01 ;goto mode01 goto mode03 ;goto mode03 ;goto mode03 goto mode02 ;goto mode02 ;goto mode02 goto mode05 ;goto mode05 ;goto mode05 goto mode06 ;goto mode06 ;goto mode06 goto mode04 ;goto mode04 ;goto mode04 goto mode07 ;goto mode07 ;goto mode07 goto mode00 ;goto modesolo05 ;goto mode00 goto mode00 ;goto modesolo06 ;goto mode00 goto modesolo05 ;goto mode00 ;goto mode00 goto modesolo06 ;goto mode00 ;goto mode00 goto mode00 ;goto mode00 ;goto modesolo05 goto mode00 ;goto mode00 ;goto modesolo06 goto modesolo05 ;goto modesolo05 ;goto mode00 goto modesolo06 ;goto modesolo06 ;goto mode00 goto modesolo05 ;goto mode00 ;goto modesolo05 goto modesolo06 ;goto mode00 ;goto modesolo06 goto mode00 ;goto modesolo05 ;goto modesolo05 goto mode00 ;goto modesolo06 ;goto modesolo06 goto modesolo05 ;goto modesolo05 ;goto modesolo05 goto modesolo06 ;goto modesolo06 ;goto modesolo06 ;色別変更(ここまで) ;B各モードで共通して使う関数(各色共通) showpara ;lAとlBをPORTAとPORTBに出力 movf lA,0 andlw 00001111b movwf PORTA movf lB,0 movwf PORTB return ;Cフルカラーモード本体(msetXXでモードの初期設定、modeXXでモード実行) mset00 ;mode0は何もしないモードとして残す return mode00 return mset01 ;パラレル流し(4マス間隔) ;各色のPICは12マス光って12マス光らないものを繰り返し流します。 ;それを8マス間隔でずらして実行しています。 movlw 96 movwf mcountL movlw 00000000b ;(色別変更点)初期状態(R:11111111b,G:00000000b,B:00001111b) movwf lB movlw 11111111b ;(色別変更点)初期状態(R:00001111b,G:11111111b,B:00000000b) movwf lA movlw 4 ;(色別変更点)開始地点(R:12,G:4,B:20) movwf r0 ;r0:ローテイトカウンタ return mode01 decf r0,1 ;r0をデクリメント movlw 12 subwf r0,0 ;r0>=12ならば次の弾を準備((Cフラグ)=1) rlf lB,1 ;ローテイト rlf lA,1 call showpara ;表示 call wait ;待機 movlw 1 subwf r0,0 ;r0=0ならば movlw 24 btfss STATUS,C movwf r0 ;r0に24を代入 return mset02 ;グラデーション流し ;各PICはそれぞれ自分の色が含まれる色の時だけグラデーション流しをします。 movlw 84 movwf mcountL movlw 00001000b movwf r0 ;r01は点灯1マスと消灯7マスの繰り返し movwf lA movlw 00001000b movwf r1 movwf lB movlw 00001101b ;(色別変更点)点灯箇所(R:00110100b,G:00001101b,B:00011010b) movwf r3 ;r3:(下位6bit使用)この色の点灯箇所(1bitが1箇所に対応) movlw 00000000b ;(色別変更点)初期状態A(R:00001111b,G:00000000b,B:00000000b) movwf r4 ;r4:グラデーション点灯しているLED(PORTA) movlw 00001111b ;(色別変更点)初期状態B(R:11110000b,G:00001111b,B:00000000b) movwf r5 ;r5:グラデーション点灯しているLED(PORTB) movlw 36 ;8(波長)*6(色数)-12(最初に光っている数)=36 movwf r6 ;r6:現在光らせている位置カウンタ(位置は8*6=48マス存在) clrf speed return mode02 movlw 12 movwf r2 mode02a clrf speed movlw 8 movwf wa2 ;普通wa2は8 decfsz r2,0 goto mode02b decf wa2,1 ;最後の繰り返しの時はwa2は7 mode02b bcf STATUS,C ;r01を右にローテイト btfsc r1,4 ;一定間隔で弾が出てくるようにローテイトする bsf r0,4 rrf r0,1 rrf r1,1 movf r0,0 ;[{(r01)OR(lAB)}AND(r45)]→lAB iorwf lA,0 andwf r4,0 movwf lA movf r1,0 iorwf lB,0 andwf r5,0 movwf lB call showpara ;表示 call sscwait ;待機(だんだん速くなる) movlw 32 subwf speed,1 decfsz wa2,1 ;wa2の値の回数繰り返したら goto mode02b mode02c clrf lA ;PORTAB消灯 clrf lB call showpara decfsz r2,1 ;mode02aからここまでを12回繰り返す goto mode02a btfsc r3,0 ;(r3,0)をCフラグに写す(※rrfを使った方が簡単) bsf STATUS,C btfss r3,0 bcf STATUS,C rlf r5,1 rlf r4,1 movlw 00000111b ;r6を8で割った余りが1なら andwf r6,0 sublw 1 btfsc STATUS,Z call mode02d ;r3をローテイト decfsz r6,1 ;r6をデクリメントして return movlw 48 ;r6が0になったら8(波長)*6(色数)=48を代入 movwf r6 return mode02d btfsc r3,0 ;(r3,0)を(r3,6)に写す bsf r3,6 btfss r3,0 bcf r3,6 rrf r3,1 ;r3をローテイト return mset03 ;パラレル点滅(瞬時虹変化) ;各PICにそれぞれタイミングのずれたパラレル点滅信号を出力させます。 movlw 16 movwf mcountL ;色別変更(ここから) ;(G) ;(R) ;(B) comf lA,1 ;call wait ; comf lB,1 ;call wait ; call showpara ; ; call wait ; ; comf lA,1 ; ; comf lB,1 ; ; call showpara ; ; call wait ; ; call wait ; ; call wait ; ; ;色別変更(ここまで) return mode03 comf lA,1 ;msetによってタイミングをずらしたのでここでは点滅させるだけ comf lB,1 call showpara call wait call wait call wait return mset04 ;グラデーション点滅(漸次虹変化) ;各PICにそれぞれタイミングのずれたグラデーション点滅信号を出力させます。 movlw 2 movwf mcountH movlw 11111111b movwf lA movwf lB clrf r0 ;r0:明るさ clrf r1 ;r1:光らせるカウンタ movlw 85 ;(色別変更点)開始地点(R:0,G:85,B:0) movwf r2 ;r2:消灯時カウンタ movlw 0 ;(色別変更点)開始地点(R:0,G:0,B:170) movwf r3 ;r3:点灯時カウンタ ;色別変更(ここから) ;(G) ;(R) ;(B) clrf r4 ;clrf r4 ;movlw 00000001b ; ;movwf r4 ;色別変更(ここまで) return ;r4:(bit0のみ使用)点灯フラグ mode04 ;r0の明るさで全部のLEDを光らせる movf r0,0 subwf r1,0 ;r1=128だったらW=254-r3*2 movwf r0 btfss r4,0 ;(r4,0)=0のとき decfsz r2,1 ;r2をデクリメント goto mode04a ;r2が0になったら(r4,0)を1にする bsf r4,0 return mode04a btfsc r4,0 ;(r4,0)=1のとき decfsz r3,1 ;r3をデクリメント goto mode04b ;r3が0になったら(r4,0)を0にする bcf r4,0 mode04b return mset05 ;パラレル溜まり ;※自由に使えるレジスタの使い方が普通と逆 movlw 78 ;1から12までの整数の和 movwf mcountL clrf r0 ;r01:流れるデータ clrf r1 clrf r2 ;r23:溜まるデータ movlw 11110000b movwf r3 movlw 10011010b ;(色別変更点)表示箇所B(R:01101001b,G:10011010b,B:00110100b) movwf r4 ;r45:表示データ(溜まり判定用) movwf r6 ;r67:表示データ(流れ判定用) movlw 00000110b ;(色別変更点)表示箇所A(R:00001010b,G:00000110b,B:00001101b) movwf r5 movwf r7 movlw 12 movwf r8 ;r8:カウンタ movwf r9 ;r9:カウンタの最大値 call mode05a return mode05 ;流し bcf STATUS,C btfsc r7,4 bsf STATUS,C rlf r0,1 rlf r1,1 bcf r7,4 ;表示 movf r2,0 andwf r4,0 iorwf r0,0 movwf lB movf r3,0 andwf r5,0 iorwf r1,0 movwf lA call showpara call swait ;終了判定 decfsz r8,1 return ;溜め bsf STATUS,C rrf r3,1 rrf r2,1 clrf r0 clrf r1 decf r9,1 movf r9,0 movwf r8 mode05a bcf STATUS,C rlf r6,1 rlf r7,1 return mset06 ;パラレル溜まり崩れ ;※自由に使えるレジスタの使い方が普通と逆 movlw 78 ;1から12までの整数の和 movwf mcountL clrf r0 ;r01:流れるデータ clrf r1 movlw 11111111b movwf r2 ;r23:溜まっているデータ movlw 00000111b movwf r3 movlw 10011010b ;(色別変更点)表示箇所B(R:01101001b,G:10011010b,B:00110100b) movwf r4 ;r45:表示データ(溜まり判定用) movwf r6 ;r67:表示データ(流れ判定用) movlw 00000110b ;(色別変更点)表示箇所A(R:00001010b,G:00000110b,B:00001101b) movwf r5 movwf r7 movlw 1 movwf r8 ;r8:カウンタ movwf r9 ;r9:カウンタの最大値 clrf rA ;rAB:流れる開始地点のデータ movlw 00001000b movwf rB call mode06a return mode06 ;表示 movf r2,0 andwf r4,0 iorwf r0,0 movwf lB movf r3,0 andwf r5,0 iorwf r1,0 movwf lA call showpara call swait ;流し bcf STATUS,C rlf r0,1 rlf r1,1 ;終了判定 decfsz r8,1 return ;溜まり減らし bcf STATUS,C rrf r3,1 rrf r2,1 bcf STATUS,C rrf rB,1 rrf rA,1 clrf r0 clrf r1 incf r9,1 movf r9,0 movwf r8 mode06a bcf STATUS,C rlf r6,1 rlf r7,1 movf rA,0 btfsc r7,4 movwf r0 movf rB,0 btfsc r7,4 movwf r1 return mset07 ;加速パラレル流し ;※自由に使えるレジスタの使い方が普通と逆 movlw 1 movwf mcountH movlw 128 movwf mcountL movlw 20 ;(変更点)初期速度 movwf speed clrf r0 ;r0〜B:(上4)位置(下4)流れるカウント clrf r1 clrf r2 clrf r3 clrf r4 clrf r5 clrf r6 clrf r7 clrf r8 clrf r9 clrf rA clrf rB clrf rC ;rCD:表示用ローテイタ clrf rD movlw 00011010b ;(色別変更点)点灯箇所(R:00101001b,G:00011010b,B:00110100b) movwf rE ;rE:(下位6bit使用)この色の点灯箇所(1bitが1箇所に対応) movlw 12 movwf rF ;rF:(上4)FSR回転カウンタ(下4)弾作成周期カウンタ movlw r0 movwf FSR call mode07make return mode07 movlw 00011111b andwf mcountL,0 btfsc STATUS,Z decf speed,1 clrf lA clrf lB movlw 12*16 addwf rF,1 mode07loop ;表示 movlw 00100000b movwf rD swapf INDF,0 andlw 00001111b mode07show bcf STATUS,C rrf rD,1 rrf rC,1 addlw 255 btfsc STATUS,C goto mode07show movf rC,0 btfsc rE,0 iorwf lB,1 movf rD,0 btfsc rE,0 iorwf lA,1 ;カウント movf INDF,1 btfsc STATUS,Z goto mode07count decf INDF,1 movlw 00001111b andwf INDF,0 btfss STATUS,Z goto mode07count movlw 16 subwf INDF,1 swapf INDF,0 iorwf INDF,1 mode07count ;ループ call mode07rot movlw 16 subwf rF,1 movlw 11110000b andwf rF,0 btfss STATUS,Z goto mode07loop call showpara call cwait ;作成 decfsz rF,1 return movlw 12 movwf rF mode07make movlw 12*16+12 movwf INDF call mode07rot return mode07rot ;FSR回転 bcf STATUS,C rlf rE,1 btfsc rE,6 bsf rE,0 incf FSR,1 movlw r0+12 subwf FSR,0 movlw r0 btfsc STATUS,C movwf FSR return ;Dソロモード本体(各色共通) msetsolo01 ;ソロパラレル流し movlw 32 movwf mcountL movlw 00111100b movwf lB movlw 00001111b movwf lA return modesolo01 bcf STATUS,C btfsc lA,3 bsf STATUS,C rlf lB,1 rlf lA,1 bcf STATUS,C ;lABをローテイト call showpara call wait return msetsolo02 ;ソロパラレル点滅 movlw 16 movwf mcountL clrf lB clrf lA return modesolo02 comf lA,1 comf lB,1 ;lABを反転 call showpara call wait return msetsolo03 ;ソロパラレル溜まり movlw 78 ;12+11+・・・+1=78 movwf mcountL clrf lA clrf lB movlw 1 ;r0はカウンター movwf r0 movlw 13 ;r1はカウンターのスタート数 movwf r1 movlw 11100000b movwf r2 ;r23は溜まっているもの clrf r3 return modesolo03 decfsz r0,1 ;r1で設定された数だけ動いたら goto modesolo03a decf r1,1 ;r1を減らして movf r1,0 movwf r0 ;r0をr1に設定 call modesolo03b ;1マス溜まる bsf STATUS,C modesolo03a rlf lB,1 ;1マス移動させて rlf lA,1 bcf STATUS,C movf r3,0 iorwf lB,1 movf r2,0 iorwf lA,1 ;溜まっている部分とorをとる call showpara call swait return modesolo03b bsf STATUS,C rrf r2,1 rrf r3,1 return msetsolo04 ;ソロパラレル溜まり崩れ movlw 78 ;1+2+・・・+12=78 movwf mcountL clrf lA clrf lB movlw 00001000b movwf r0 ;r01は流れるスタート地点 clrf r1 movlw 00000111b movwf r2 ;r23は溜まっているもの movlw 11111111b movwf r3 movlw 00001000b movwf r4 ;r45は流れるもの clrf r5 return modesolo04 bcf STATUS,C rlf r5,1 rlf r4,1 btfss r4,4 ;最後まで動いたら goto modesolo04a bcf STATUS,C rrf r0,1 ;スタート地点を移動 rrf r1,1 movf r0,0 ;r45をスタート地点に設定 movwf r4 movf r1,0 movwf r5 bcf STATUS,C rrf r2,1 ;r34を一つ減らす rrf r3,1 modesolo04a movf r2,0 ;r23とr45を結合してlABに出力 iorwf r4,0 movwf lA movf r3,0 iorwf r5,0 movwf lB call showpara call swait return msetsolo05 ;ソロパラレルゲージ溜まり movlw 96 movwf mcountL clrf lA clrf lB return modesolo05 bsf STATUS,C rlf lB,1 rlf lA,1 call showpara call swait btfsc lA,3 ;最後まで溜まったら call modesolo05a return modesolo05a clrf lA ;クリア clrf lB return msetsolo06 ;ソログラデーション点滅 movlw 4 movwf mcountH clrf r0 movlw 11111111b movwf lB movlw 00001111b movwf lA return modesolo06 clrf lA ;消灯 clrf lB comf r0,0 movwf speed call showpara call sscwait ;消灯時のwaitルーチン comf lA,1 comf lB,1 movf r0,0 movwf speed call showpara call sscwait ;点灯時のwaitルーチン decf r0,1 return msetsolo07 ;ソログラデーション流し movlw 32 movwf mcountL movlw 00001000b movwf r0 ;r01は点灯1マスと消灯7マスの繰り返し movwf lA movlw 00001000b movwf r1 movwf lB return modesolo07 movlw 8 movwf r2 modesolo07a movlw 8 movwf wa2 ;普通wa2は8 decfsz r2,0 goto modesolo07b decf wa2,1 ;8回目の繰り返しの時はwa2は7 modesolo07b bcf STATUS,C ;r01を右にローテイト btfsc r1,4 bsf r0,4 rrf r0,1 rrf r1,1 movf r0,0 ;PORTABに結合 iorwf lA,1 movf r1,0 iorwf lB,1 call showpara call sswait decfsz wa2,1 ;wa2の値の回数繰り返したら goto modesolo07b modesolo07c clrf lA ;PORTAB消灯 clrf lB call showpara decfsz r2,1 ;modesolo07aからここまでを8回繰り返す goto modesolo07a return ;E各種waitルーチン(各色共通) wait movlw 64 movwf wa clrf wa2 wait2 nop nop decfsz wa2,1 goto wait2 decfsz wa,1 goto wait2 return swait movlw 16 movwf wa clrf wa2 swait2 nop nop decfsz wa2,1 goto swait2 decfsz wa,1 goto swait2 return sswait clrf wa sswait2 nop nop decfsz wa,1 goto sswait2 return ssswait movlw 4 movwf wa ssswait2 nop nop decfsz wa,1 goto ssswait2 return cwait movf speed,0 movwf wa clrf wa2 cwait2 nop nop decfsz wa2,1 goto cwait2 decfsz wa,1 goto cwait2 return scwait movf speed,0 movwf wa movlw 128 movwf wa2 scwait2 nop nop decfsz wa2,1 goto scwait2 movlw 128 movwf wa2 decfsz wa,1 goto scwait2 return sscwait movf speed,0 movwf wa sscwait2 nop nop decfsz wa,1 goto sscwait2 return end