;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		ＰＩＣＥＹＥ	プログラム	Ver1.0	ＪＡ０ＱＯＮ
;
;
;		フルカラーLEDによるチューニング&シグナルメーター
;
;		PIC12F683 8MHZ（内部オシレータ）
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



		LIST	P=PIC12F683
		INCLUDE	P12F683.INC

;
;CALIBRATION WORD(ADDRESS:2008H)
;bit13		Unimplemented
;bit12-6	FCAL	内部発振器調整
;					0111111=最大発振周波数
;					.
;					0000000=中間
;					.
;					1111111=最小発振周波数
;bit5		Unimplemented
;bit4-3		POR		パワーオンリセット電圧調整
;					00=最小電圧
;					11=最大電圧
;bit2-0		BOD		ブラウンアウト電圧調整
;					000=Reservd
;					001=最小電圧
;					111=最大電圧
;
;		
;CONFIGURATION WORD(ADDRESS:2007H)
;					設定
;bit13-12	Unimplemented
;bit11		FCMEN	0	Fail-Safe Clock Monitor
;						1=有効,0=無効
;bit10		IESO	0	内部･外部切替スイッチモード
;						1=有効,0=無効
;bit9-8		BODEN	00	ブラウンアウト設定
;						11=有効
;						10=スリープ時以外有効
;						01=PCONレジスタSBODENビットでコントロールされる
;						00=無効
;bit7		CPD		1	データメモリプロテクション
;						1=無効,0=有効
;bit6		CP		1	プログラムメモリプロテクション　
;						1=無効,0=有効
;bit5		MCLRE	0	GP3/MCLRピン選択ビット
;						1=MCLR有効,0=GP3有効(Digital input)
;bit4		PWRTE	0	power_up timer　使います。
;						1=無効,0=有効
;bit3		WDTE	0	Watchdog Timer　使いません。
;						1=有効,0=無効
;bit2-0		FOSC	100	発振器選択ビット、今回はINTOSCIOを使用
;						111=RC:2pinでRC発振、GP4_CLKOUT、I/O不可
;						110=RCIO:　〃　GP4I/O可
;						101=INTRC:内部発振　GP4_CLKOUT、GP5I/O可
;						100=INTRCIO:内部発振、GP4-GP5I/O可
;						011=EC:2pin外部クロック入力、GP4I/O可
;						010=HS：外部発振子、I/O不可
;						001=XT：　〃
;						000=LP：　〃
;
;bit	15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
;data    0  0  0  0  0  0  0  0  1  1  0  0  0  １  0  0
;

		__CONFIG	B'0000000011000100'
	

;		ワークエリア定義
;
;		BANK0	20h-7Fh
;
;		使用していないのもあります
;

hex0		equ		020h		;HEXデータ
hex1		equ		021h		;
hex2		equ		022h
hex3		equ		023h
colum		equ		028h		;現在の桁位置
cnt0		equ		029h		;時間待ちルーチン用
cnt1		equ		02ah
cnt2		equ		02bh
cnt3		equ		02ch
tmp0		equ		02dh		;雑用
tmp1		equ		02eh
bcdw0		equ		02fh		;BCD変換ルーチン用
bcdw1		equ		030h
cary1		equ		031h
cary2		equ		032h
cary3		equ		033h
shift		equ		034h		;送信ルーチンでのシフトカウンタ用
work1		equ		035h
work2		equ		036h
bsyc0		equ		037h
bsyc1		equ		038h
tcnt0		equ		039h
tcnt1		equ		03ah
tcnt2		equ		03bh		;表示基板への伝達フラグ
flg			equ		03ch		;エラー＆設定フラグ
mode		equ		03dh		;プリスケーラ設定
gtime		equ		03eh		;ｹﾞｰﾄタイム設定
pscnt		equ		03fh		;プリスケーラ残カウント
hexw0		equ		040h		;HEXデータ演算用ワーク
hexw1		equ		041h
hexw2		equ		042h
hexw3		equ		043h
CY			equ		044h		;PMW用カウンタ
CYC			equ		045h
RL			equ		046h		;赤カウンタ
RLC			equ		047h
GL			equ		048h		;緑カウンタ
GLC			equ		049h
BL			equ		04ah		;青カウンタ
BLC			equ		04bh
TUNC		equ		04ch		;チューニング用カウンタ
rotc		equ		04dh
;

			ORG		0h
			goto	init
			ORG		04h
			goto	init

			org		05h
			



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			PIC12F683　イニシャライズ			
;
;		OSCCON(8FH)
;			bit7	Unimplemented
;			bit6-4	IRCF	内部発振器クロック選択
;							000 = 31KHZ
;							001 = 125KHZ
;							010 = 250KHZ
;							011 = 500KHZ
;							100 = 1MHZ
;							101 = 2MHZ
;							110 = 4MHZ
;							111 = 8MHZ
;			bit3	OSTS	クロックソース発振器動作ステータスビット
;							1=FOSCで指定された外部クロックで動作中
;							0=内部発振器で動作中
;			bit2	HTS		HFINTOSCステータス
;							1=安定に動作中
;							0=不安定
;			bit1	LTS		LFINTOSCステータス
;							1=安定に動作中
;							0=不安定
;			bit0	SCS		システムクロック選択ビット
;							1=内部発振器
;							0=FOSCで規定されたクロックソース
;
;		OSCTUNE(90H)
;			bit7-5	Unimplemented
;			bit4-0	TUN		内部発振器微調整
;							01111 = 最大
;							01110 =
;							・
;							00001 = 
;							00000 = 標準
;							11111 = 
;							･
;							10000 = 最少
;
;
;		CMCON0(19H)
;			bit7	Unimplemented
;			bit6	COUT	コンパレータ出力ビット
;			bit5	Unimplemented
;			bit4	CINV	コンパレータ出力反転ビット
;							1=出力反転
;							0=出力非反転
;			bit3	CIS		コンパレータ入力スイッチビット
;			bit2-0	CM		コンパレータモード　GP0-1入力、GP2出力を設定
;							000	すべてアナログ入力　出力OFF（GP2デジタルI/O可）
;							001	すべてアナログ入力　出力ON
;							010	すべてアナログ入力　出力ON(GP2デジタルI/O可)
;							011	GP0デジタル、GP1アナログ入力　出力ON(GP2)
;							100	GP0デジタル、GP1アナログ入力　出力ON(GP2デジタルI/O可）
;							101	GP0-1アナログ入力　出力ON(GP2)CIS有効
;							110	GP0-1アナログ入力　出力ON(GP2)CIS有効
;							111	停止　入出力はすべてデジタルI/O
;										
;
;		ANSEL(9FH)
;			bit7	Unimplemented
;			bit6-4	A/D変換クロック選択ビット
;							000	= Fosc/2
;							001 = Fosc/8
;							010 = Fosc/32
;							x11 = Frc
;							100 = Fosc/4
;							101 = Fosc/16
;							111 = Fosc/64
;			bit3-0	ANSx	アナログ選択ビット
;							1=アナログ入力
;							0=デジタルI/O
;			bit3=0	ANS3/GP4
;			bit2=1	ANS2/GP2
;			bit1=0	ANS1/GP1
;			bit0=0	ANS0/GP0
;
;		TRISIO(85H)	1=input mode,0=output mode
;			bit7=0	Unimplemented
;			bit6=0	Unimplemented
;			bit5=0	GP5	I/O	設定条件あり、コンフィグレーションワード参照
;			bit4=1	GP4	I/O　設定条件あり、　〃
;			bit3=1	GP3	Inputのみ
;			bit2=1	GP2	I/O
;			bit1=0	GP1	I/O
;			bit0=0	GP0	I/O
;
;
;		OPTION_REG(81H)
;			bit7=1	GPPU	GPIOプルアップOFF
;							0=enabled,1=disabled
;			bit6=1	INTEGE	INT割り込み信号エッジ↑
;							1=↑,0=↓
;			bit5=1	T0CS	TMR0クロックは外部
;							1=外部入力GP2,0=内部
;			bit4=0	T0SE	TMR0カウントエッジ↑
;							1=↑,0=↓
;			bit3=1	PSA		プリスケーラ無し
;							1=WDT,0=TMR0
;			bit2-0	PS		プリスケーラ分周比	000 1/2
;										001	1/4
;										010	1/8
;										011	1/16
;										100	1/32
;										101	1/64
;										110	1/128
;										111	1/256
;
;
;		INTCONレジスタ(#2)
;			bit7	GIE		全割込制御
;							1許可、0禁止
;			bit6	PEIE	周辺割込制御
;							1許可、0禁止
;			bit5	T0IE	タイマ0割込許可制御
;							1許可、0禁止
;			bit4	INTE	RA2外部割込許可制御
;							1許可、0禁止
;			bit3	GPIE	GPIOポート状態変化割込許可制御
;							1許可、0禁止	
;			bit2	T0IF	タイマ0割込みフラグ(#1)
;							1オーバーフロー、0オーバーフローなし
;			bit1	INTF	GP2外部割込みフラグ(#1)
;							1割込み発生、0割込み発生なし
;			bit0	GPIF	GPポート状態変化割込フラグ(#1)
;							1割込発生、0割込無
;
;							#1)ソフトウエアでリセット必要
;							#2)初期値=0なので、初期設定で0設定する必要は無い
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	
init
;			各レジスタ初期設定
			clrf	GPIO		;Init PORT
			clrf	INTCON		;割込みOFF
			movlw	04h			;CMx=100
			movwf	CMCON0		;コンパレータCIN-_ON　GP0,2　digital
			bsf		STATUS,RP0	;バンク１に切替
			movlw	070h		;0111000b
			movwf	OSCCON		;内部発振器は8MHZに設定
			movlw	083H		;10000011b
			movwf	OPTION_REG	;プルアップOFF
								;割込みエッジ↓
								;プリスケーラ割当→TMR0
								;プリスケーラ分周1/16にセット
								;
			movlw	0bh			;00001011b
			movwf	TRISIO		;GP0,1,3入力、GP2,4,5出力モード
			movlw	052h		;01010010b
			movwf	ANSEL		;GP1アナログ入力　GP0,GP2,4,デジタルI/O
								;Fosc/16 = 2us at 8MHz
			bcf		STATUS,RP0	;バンク０に切替
			bcf		ADCON0,ADON	;A/DコンバータOFF
;			初期値セット
			bsf		GPIO,2		;RED_OFF
			bsf		GPIO,4		;GREEN_OFF
			bsf		GPIO,5		;BLUE_OFF
			movlw	0ffh		;1サイクルのカウント数初期値セット、0-ffh
			movwf	CY			;1サイクルは最大255分割される
								;RL,GL,BLの最大長もCY値に合わせる事
			clrf	CYC
			clrf	RLC
			clrf	GLC
			clrf	BLC
        	clrf	flg	

;
;			立ち上がり時のLEDチェック動作
;
;			ヒータ発熱までの時間で、ちょっとお遊びします。
;			不要の場合は削除してください。
;			設定スイッチJP2がOFF(H)で穏やか発光
;			設定スイッチJP2がON(L)で賑やか発光、
;
;		RGB原色のみによる発色(全7色)
;			GP5	GP4	GP2		H=OFF,L=ON
;			青	緑	赤		発色
;			OFF	OFF	OFF		無
;			OFF	OFF	ON		赤
;			OFF	ON	OFF		緑
;			OFF	ON	ON		黄
;			ON	OFF	OFF		青
;			ON	OFF	ON		マゼンダ
;			ON	ON	OFF		水色
;			ON	ON	ON		白




coldst     	btfss	GPIO,0		;JP2スイッチチェック
			goto	cost2

;			シンプルに各色点灯チェック(7秒)
cost1
;			赤色
			bcf		GPIO,2		;赤点灯
			call	wait1s		;1秒待ち

;			黄色(赤緑)
			bcf		GPIO,4		;緑点灯(追加)
			call	wait1s		;1秒待ち

;			緑色
			bsf		GPIO,2		;赤消灯
			call	wait1s		;1秒待ち

;			水色(青緑)
			bcf		GPIO,5		;青点灯
			call	wait1s		;1秒待ち

;			青色
			bsf		GPIO,4		;緑消灯
			call	wait1s		;1秒待ち

;			マゼンダ（赤青）
			bcf		GPIO,2		;赤点灯
			call	wait1s		;1秒待ち

			bcf		GPIO,2		;白点灯
			call	wait1s		;1秒待ち
			movlw	032h
			movf	GPIO
			goto	main

;			賑やかにフェードイン
cost2
			movlw	064h		;100(1秒)
			call	emitw
			
			movlw	032h		;50(0.5秒)
			call	emitw
			call	emitw
			
			movlw	019h		;25(0.25秒)
			call	emitw
			call	emitw
			call	emitw

			movlw	0ah			;10(0.1秒)
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			
			movlw	05h
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw

			movlw	01h
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			call	emitw
			
			clrf	GPIO		;白点灯
			call	wait1s		;1秒待ち
			movlw	032h
			movf	GPIO

		
;
;		AGC電圧でLED駆動
;
main
			call	get_mode
			call	get_adc2
			call	ledmod
			goto	main
			
;
;			Wreg×10msのインタバルで6色を発光
;
;			使用変数　rotc
;
emitw
			movwf	rotc
;			赤色
			bcf		GPIO,2		;赤点灯
			call	waitx		;10ms×(W)

;			黄色(赤緑)
			bcf		GPIO,4		;緑点灯(追加)
			movf	rotc,W
			call	waitx		;

;			緑色
			bsf		GPIO,2		;赤消灯
			movf	rotc,W
			call	waitx		;

;			水色(青緑)
			bcf		GPIO,5		;青点灯
			movf	rotc,W
			call	waitx		;

;			青色
			bsf		GPIO,4		;緑消灯
			movf	rotc,W
			call	waitx		;

;			マゼンダ（赤青）
			bcf		GPIO,2		;赤点灯
			movf	rotc,W
			call	waitx
			bsf		GPIO,2		;赤消灯
			nop
			bsf		GPIO,5		;青消灯
			movf	rotc,W
			return



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			動作設定
;
;		TMR0設定
;				プリスケーラ		1/256
;				カウント回数		100h-xxh（アップカウンタなので差分をセット）
;
;		使用ワーク
;				動作モード				mode0	VRによるLED点灯
;									mode1	VRによる色S点灯
;									mode2	AGCによる色S点灯
;									mode4	AGCによるチューニング点灯
;				1サイクル中の割込み回数		CY		01-ffh
;				1サイクル中の赤発光時間		RL		01-ffh
;				1サイクル中の緑発光時間		GL		01-ffh
;				1サイクル中の青発光時間		BL		01-ffh
;				
;		INTCONレジスタ(#2)
;			bit7	GIE		全割込制御
;							1許可、0禁止
;			bit6	PEIE	周辺割込制御
;							1許可、0禁止
;			bit5	T0IE	タイマ0割込許可制御
;							1許可、0禁止
;			bit4	INTE	RA2外部割込許可制御
;							1許可、0禁止
;			bit3	RAIE	RAポート状態変化割込許可制御
;							1許可、0禁止	
;			bit2	T0IF	タイマ0割込みフラグ(#1)
;							1オーバーフロー、0オーバーフローなし
;			bit1	INTF	RA2外部割込みフラグ(#1)
;							1割込み発生、0割込み発生なし
;			bit0	RAIF	RAポート状態変化割込フラグ(#1)
;							1割込発生、0割込無
;
;							#1)ソフトウエアでリセット必要
;							#2)初期値=0なので、初期設定で0設定する必要は無い
;
;		スイッチ回路
;				GP3	JP1		立ち上がり時設定用
;				GP0	JP2		動作中モード設定用
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

get_mode
        	btfss	GPIO,3		;JP1スイッチチェック
			goto	mode4
mode2		movlw	2			;SW_OFF(H)で色S点灯モード　
			movwf	mode		;mode=2
			return
mode4      	movlw	4			;SW_ON(L)でチューニング点灯モード
			movwf	mode		;mode=4
			return
			
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;			Ａ／Ｄ変換サブルーチン
;
;		アナログ入力ポート		GP1/AN1/CH1	AGC入力
;		結果格納方法		ADFM=0/左詰め/ADRESHのみ取得
;		出力データ			hex0/AGC
;
;		ADCON0ﾚｼﾞｽﾀ
;		bit7	ADFM	変換結果格納指定
;						1=右詰
;						0=左詰め
;		bit6	VCFG	参照電圧指定
;						1=VREF pin(GP1)
;						0=VDD
;		bit5-4	Un		Read as '0'
;		bit3-2	CHSx	チャンネル指定
;						00 = CH0(AN0/GP0)
;						01 = CH1(AN1/GP1)
;						10 = CH2(AN2/GP2)
;						11 = CH3(AN3/GP4)
;		bit1	GO/DONE	A/D変換ステータスビット
;						1=変換開始指令（１にすると変換動作開始）
;						0=変換完了(変換完了すると０になる）
;		bit0	ADON	A/D変換ステータスビット
;						1=A/Dコンバータ動作
;						0=A/Dコンバータ停止
;
;
;		使用ワーク		;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;			AGCデータにより色データ設定

get_adc2
;			PWMサイクルチェック
			clrw				;CYCゼロチェック
			addwf	CYC,W
			btfss	STATUS,Z	;CYC=0ならサンプリング開始
			return				;CYCがゼロでないなら何もしない			

aport
			movlw	05h			;00000101b
								;左詰め、基準電圧VDD、
								;CH1(GP1)選択、ADON_ON
			movwf	ADCON0		;電圧サンプリング開始
			call	d10u		;サンプリング電圧安定化待ち
			call	d10u
			bsf		ADCON0,GO	;A/D変換開始指令
aloop
			btfsc	ADCON0,GO	;A/D変換完了待ち 
			goto	aloop		;GO=0ならば次へ
			movf	ADRESH,W	;データ上位８ビット
			movwf	hex0		;
			bcf		ADCON0,ADON	;A/DコンバータOFF

;			modeチェック
			btfss	mode,2		;mode4ならチューニング処理へ
			goto	sset		;mode4以外なら色S処理へ

;			強弱発光モード			好みで色々変化させて楽しみます・・・(^^♪
cset		movf	hex0,W
			movwf	TUNC
			movlw	0h			;発光色データ変化設定
			movwf	RL			;赤　00-00-ffｈ
;			movlw	0h			;
			movwf	GL			;緑　00-ff-ffh
			movlw	0ffh
			movwf	BL			;青　ff-00-ffｈ

			movlw	033h
			subwf	TUNC,F
			btfss	STATUS,C	;ボロー(C=0)が発生したら、0hにする
			clrf	TUNC
			incf	TUNC,F
			;
cloop1		decfsz	TUNC,F		;1'stステージ
			goto	cset1
			return
cset1		movlw	04h
			subwf	BL,F		;BLは4ずつ減算
			addwf	GL,F		;GLは４ずつ加算
			btfss	STATUS,C	;GLのO.Fチェック
			goto	cloop1
			movlw	0ffh		;ステージ終値の整理
			movwf	GL
			clrf	BL
			
cloop2		decfsz	TUNC,F		;2'stステージ
			goto	cset2
			return
cset2		movlw	04h
			addwf	RL,F
			btfss	STATUS,C
			goto	cloop2
			movlw	0ffh		;ステージ終値の整理
			movwf	RL

cloop3		decfsz	TUNC,F		;3'stステージ
			goto	cset3
			return
cset3		movlw	04h
			addwf	BL,F
			btfss	STATUS,C
			goto	cloop3
			movlw	0ffh		;最終値の整理
			movwf	BL			;RL=FFH
			return				;GL=FFH
								;BL=FFH
								
								
;			色Sモード
;			AGC電圧分別

sset		movlw	047h		;計算上アナログ1.0V=33h、電位差0.1V=5h
			subwf	hex0,W		;F-W=Wで負ならC=0、正ならC=1
			btfss	STATUS,C
			goto	s00

			movlw	04dh		;AGC=0.8V以下
			subwf	hex0,W
			btfss	STATUS,C
			goto	s01			;4DH未満ならs01
			
			movlw	054h		;AGC=1.0V以下
			subwf	hex0,W
			btfss	STATUS,C
			goto	s02
			
			movlw	05bh
			subwf	hex0,W
			btfss	STATUS,C
			goto	s03
			
			movlw	061h		;AGC=1.93V以下
			subwf	hex0,W
			btfss	STATUS,C
			goto	s04

			movlw	068h
			subwf	hex0,W
			btfss	STATUS,C
			goto	s05
			
			movlw	072h
			subwf	hex0,W
			btfss	STATUS,C
			goto	s06
			
			movlw	7ch
			subwf	hex0,W
			btfss	STATUS,C
			goto	s07
			
			movlw	086h
			subwf	hex0,W
			btfss	STATUS,C
			goto	s08
			
			movlw	090h
			subwf	hex0,W
			btfss	STATUS,C
			goto	s09
			
			movlw	09dh
			subwf	hex0,W
			btfss	STATUS,C
			goto	s10
			
			movlw	0abh
			subwf	hex0,W
			btfss	STATUS,C
			goto	s11
			
			movlw	0b8h
			subwf	hex0,W
			btfss	STATUS,C
			goto	s12
			
			movlw	0c9h
			subwf	hex0,W
			btfss	STATUS,C
			goto	s13
			
			movlw	0fbh
			subwf	hex0,w
			btfss	STATUS,C
			goto	s14
			
s15			movlw	0ffh		;白
			movwf	RL
			movlw	0ffh
			movwf	GL
			movlw	0ffh
			movwf	BL
			return

s14			movlw	080h		;灰
			movwf	RL
			movlw	064h
			movwf	GL
			movlw	047h
			movwf	BL
			return

s13			movlw	0ffh		;薄ピンク
			movwf	RL
			movlw	030h
			movwf	GL
			movlw	034h
			movwf	BL
			return

s12			movlw	0ffh		;ピンク
			movwf	RL
			movlw	0eh
			movwf	GL
			movlw	02ah
			movwf	BL
			return

s11			movlw	0ffh		;薄赤
			movwf	RL
			movlw	010h
			movwf	GL
			movlw	0h
			movwf	BL
			return

s10			movlw	0ffh		;赤
			movwf	RL
			movlw	0h
			movwf	GL
			movlw	0h
			movwf	BL
			return
						
s09			movlw	0ffh		;薄オレンジ
			movwf	RL
			movlw	07eh
			movwf	GL
			movlw	0h
			movwf	BL
			return
			
s08			movlw	0ffh		;オレンジ
			movwf	RL
			movlw	052h
			movwf	GL
			movlw	0h
			movwf	BL
			return

s07			movlw	0ffh		;黄
			movwf	RL
			movlw	0ffh
			movwf	GL
			movlw	0h
			movwf	BL
			return

s06			movlw	03eh		;薄黄（黄緑）
			movwf	RL
			movlw	0ffh
			movwf	GL
			movlw	0h
			movwf	BL
			return

s05			movlw	0h			;薄緑（青緑）
			movwf	RL
			movlw	0ffh
			movwf	GL
			movlw	046h
			movwf	BL
			return

s04			movlw	0h			;緑
			movwf	RL
			movlw	0ffh
			movwf	GL
			movlw	0h
			movwf	BL
			return
			
s03			movlw	060h		;薄紫
			movwf	RL
			movlw	032h
			movwf	GL
			movlw	0ffh
			movwf	BL
			return
			
s02			movlw	03ah		;紫
			movwf	RL
			movlw	0h
			movwf	GL
			movlw	0ffh
			movwf	BL
			return
			
s01			movlw	024h		;薄青
			movwf	RL
			movlw	02dh
			movwf	GL
			movlw	0ffh
			movwf	BL
			return

s00			movlw	0h			;青
			movwf	RL
			movlw	0h
			movwf	GL
			movlw	0ffh
			movwf	BL
			return



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			フルカラーＬＥＤ発光色コントロール
;
;		角型ＬＥＤ	OSTA71A1D-A	アノードコモンを想定
;			RED		GP2	Input	VF	1.8-2.4
;			Green	GP4	Input	VF	2.8-3.6
;			Blue	GP5	Input	VF	2.9-3.6
;
;		使用変数
;			割込み周期カウンタ		CY	0-255
;			明るさ設定	赤素子	RL	0-255
;					緑素子	GL	0-255
;					青素子	BL	0-255
;			内部パルス幅カウンタ	CYC,RLC,GLC,BLC
;
;
;		想定呼出周期
;			60us以下を想定　60us*255=15300us(約65HZ)
;			呼出周期が長いと、ＬＥＤがチラつきます。
;			明るさ設定RL,GL,BLを設定してから呼び出す
;			この、RL,GL,BLの組み合わせで概ね発色が決まる
;			このルーチンでは時間は管理できず、1周期の時間は呼出ルーチンで決定される
;			よって、基本的に割込み処理ルーチンからの呼出を想定している
;			最長255回呼出されると1周期終了と認識し、次の周期処理をする
;			各色明るさカウンタは指定の回数分の時間ONとし、デクレメントされる
;			明るさカウンタがゼロになると1サイクル終了までOFFとする
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;		フルカラーLEDの発行色を変えるためのPWM変調
ledmod

;		サイクル内かどうかチェック
ckcyc
			clrw				;CYCゼロチェック
			addwf	CYC,W
			btfss	STATUS,Z
			goto	cying			
									
;		サイクル初期化
;
;		一旦初期化すると１サイクルが終了するまで設定変数はリロードされない
;
cyst		movf	CY,W		;1サイクルは最長255カウントされる
			movwf	CYC

cystr		movf	RL,W		;movfはZフラグに影響を与える
			movwf	RLC
			btfss	STATUS,Z
			goto	redon
redof		bsf		GPIO,2		;最初からRL=0なのでRed　off
			goto	cystg
redon		bcf		GPIO,2		;Red on

cystg		movf	GL,W
			movwf	GLC
			btfss	STATUS,Z
			goto	greon
greof		bsf		GPIO,4		;最初からGL=0なのでgreen　off
			goto	cystb
greon		bcf		GPIO,4		;Green on

cystb		movf	BL,W
			movwf	BLC
			btfss	STATUS,Z
			goto	bluon
bluof		bsf		GPIO,5		;最初からBL=0なのでblue　off
			goto	cying
bluon		bcf		GPIO,5		;blue on

;		サイクル処理中
cying		decf	CYC,F		;サイクルカウンタを減算

rlport		clrw				;赤ポート(RC0)処理
			addwf	RLC,W		;RLC値ゼロチェック
			btfsc	STATUS,Z
			goto	glport		;RLCがすでに0ならば緑ポート処理へ
			decf	RLC,F		;RLCを減算
			btfss	STATUS,Z	;減算結果が↓
			goto	glport		;RLC=0でないのでONのまま緑へ
			bsf		GPIO,2		;RLC=0となったので赤OFF
		
glport		clrw				;緑ポート(RC1)処理
			addwf	GLC,W
			btfsc	STATUS,Z	;GLC値ゼロチェック
			goto	blport		;GLCがすでに0ならば青ポート処理へ
			decf	GLC,F		;GRLCを減算
			btfss	STATUS,Z	;減算結果が↓
			goto	blport		;GLC=0でないのでONのまま青へ
			bsf		GPIO,4		;GLC=0となったので緑OFF

blport		clrw				;青ポート(RC2)処理
			addwf	BLC,W		;BLC値ゼロチェック
			btfsc	STATUS,Z
			return				;RLがすでに0ならば終了
			decf	BLC,F		;RLを減算
			btfss	STATUS,Z	;減算結果が↓
			return				;RL=0でないのでONのまま終了へ
			bsf		GPIO,5		;RL=0となったので青OFF
			return


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			遅延時間サブルーチン
;
;		clock	= 8MHz(0.125us)
;		1cycle	= 0.5us
;		使用レジスタ	= cnt0,cnt1,cnt2,cnt3
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

wait100u						;呼び出しも含めて、100us
								;call is 2cycles
			movlw	09h			;1
			movwf	cnt2		;1
			nop
			nop
			nop					;3
w1u			nop					;
			call	d10u		;10*8=80us(ここだけ命令ステップを数えない）
			decfsz	cnt2,F		;4*7+3=31cycles
			goto	w1u
			return				;2+5+31+2=40cycles=20us

wait50u							;呼び出しも含めて、50us
			call	wait25u
wait25u							;呼び出しも含めて、25us
			call	d10u
			call	d10u
			nop					;5us=0.5us*10cycles			
			nop					;
			nop
			nop
			nop
			nop
			return				;2+6+2=10cycles=5us

wait2m
			movlw	02h
			movwf	cnt2
w2m			call	d1m
			decfsz	cnt2,F
			goto	w2m
			return

wait5m							; 5ms delay
			movlw	05h
			movwf	cnt2
w5m			call	d1m
			decfsz	cnt2,F
			goto	w5m
			return

wait10m							; 10ms delay
			movlw	d'10'
			movwf	cnt2
w10m		call	d1m
			decfsz	cnt2,F
			goto	w10m
			return

wait20m							; 20ms delay
			movlw	d'20'
			movwf	cnt2
w20m		call	d1m
			decfsz	cnt2,F
			goto	w20m
			return
wait50m							; 50ms delay
			movlw	d'50'
			movwf	cnt2
w50m		call	d1m
			decfsz	cnt2,F
			goto	w50m
			return

wait100m						; 100ms delay
			movlw	d'100'
			movwf	cnt2
w100m		call	d1m
			decfsz	cnt2,F
			goto	w100m
			return

wait500m						; 500ms delay
			movlw	05h
			movwf	cnt3
w500m		call	wait100m
			decfsz	cnt3,F
			goto	w500m
			return

wait1s							; 1s delay
			movlw	d'10'
			movwf	cnt3
w1s			call	wait100m
			decfsz	cnt3,F
			goto	w1s
			return

;			Wregで指定した回数10msウェイトルーチンを呼び出す
waitx
			movwf	work1		;
wtx			call	wait10m
			decfsz	work1
			goto	wtx
			return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			1ms 基本ウェイト 
;
;		clock	= 8MHz(0.125usec)
;		1cycle	= 0.5usec
;		1ms		= 0.5usec * 2000cycles
;
;		# 'goto' and 'call' and 'return' - 2cycles
;			使用変数　cnt0,cnt1
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
d1m
			movlw		02h
			movwf		cnt0		;
;			外周ループ
d1m0		movlw		0c7h		;199d
			movwf		cnt1		;
;			内周ループ
d1m1		nop						;
			nop						;5cycles*cnt1
			decfsz		cnt1,F		;5*199=995c/s
			goto		d1m1		;
;
			decfsz		cnt0,F		;(d1m1-1+3)*cnt0
			goto		d1m0		;(995-1+5)*2=1998cycles
			return					;other=3cycles
									;Total 2001*0.5usec=約1ms

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			10us 基本ウェイト
;			呼び出しも含めて、10usとなる。
;
;		clock	= 8MHZ(0.125us)
;		1cycle	= 0.5us
;		10us	= 0.5us * 20cycles
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

									;"call" inst = 2cycles
d10u
			movlw		05h			;1
			movwf		cnt0		;1
d10u0								;3*4+2=14
			decfsz		cnt0,F		;
			goto		d10u0		;
			return					;2+1+1+14+2=20cycles
			
;
			END
			
