;**************************************** ;   回転灯制御 by PIC12C509 ;    4つのLEDを制御。「なめらかな」点滅 ;**************************************** list p=12c509 include ; *** 変数レジスタ定義 *** OTPT1 EQU 07H ; OTPT2 EQU 08H CNT1 EQU 09H CNT2 EQU 10H CNT3 EQU 11H ; *** メインルーチン *** RESET GOTO START ORG 04H START MOVLW 09FH OPTION MOVLW 08H TRIS GPIO MAIN MOVLW 21H ;0000 0011 → 0010 0001に徐々に推移 MOVWF OTPT1 ;0, 1, 4, 5ビットが各LEDの点灯スイッチ MOVLW 03H ;ここでは、LED0はつきっぱなし、1は徐々に消える MOVWF OTPT2 ;4はずっと消えている、5は徐々につく。 CALL LOOPX MOVLW 30H ;0010 0001 → 0011 0000 MOVWF OTPT1 ;0は徐々に消える、1は消えている MOVLW 21H ;4は徐々につく、5はついている。 MOVWF OTPT2 CALL LOOPX MOVLW 12H ;0011 0000 → 0001 0010 MOVWF OTPT1 ;0は消えている、1は徐々につく MOVLW 30H ;4はついている、5は徐々に消える MOVWF OTPT2 CALL LOOPX MOVLW 03H ; 0001 0010 → 0000 0011 MOVWF OTPT1 ;0は徐々につく、1はついている MOVLW 12H ;4は徐々に消える、5は消えている。 MOVWF OTPT2 CALL LOOPX GOTO MAIN ; *** 点灯パターンサブ *** ; 変数OTPT2の点灯パターンから、徐々にOTPT1の ; パターンに推移。 LOOPX MOVLW 01H MOVWF CNT1 ;CNT1がパターン1の時間比率(/FFH) LOOPY MOVLW 01H ;CNT3でサイクル時間調整可能 MOVWF CNT3 ;今回は1回ループのみ LOOP0 MOVF OTPT1,W ;パターン1 MOVWF GPIO MOVF CNT1,W MOVWF CNT2 ;CNT2で実際にカウント LOOP1 DECFSZ CNT2,F ;CNT2が0になるまで減算ループ GOTO LOOP1 ;(CNT1)回のループ MOVF OTPT2,W ;パターン2の点灯 MOVWF GPIO MOVF CNT1,W ;(0FFh-CNT1)回パターン2 MOVWF CNT2 ;CNT2をリセット LOOP2 INCFSZ CNT2,F ;CNT2がオーバーするまで加算 GOTO LOOP2 ;(FFH-CNT1)回のループ DECFSZ CNT3,F ;同じ点灯パターンを繰り返す GOTO LOOP0 ;ことも可能だが今回は1回 INCFSZ CNT1,F ;点灯スロープを一段階進める GOTO LOOPY ;最終的にはOTPT1の点灯パターンに RETLW 0 END