;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		Ｉ２Ｃコントロールテスト　Ver０．１	ＪＡ０ＱＯＮ
;
;		マスター送信ルーチンを作ってみる
;		PIC12F1823 32MHZ（内部オシレータ）
;
;       目的
;       Ｉ２Ｃモジュールへの制御だが、自分がマスタ
;       今回は４桁７セグＬＥＤの制御
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



		LIST	P=PIC16F1823
		INCLUDE	P16F1823.INC

;
;CONFIGURATION WORD 1(ADDRESS:8007H)
;					設定
;bit13		FCMEN	0	Fail-Safe Clock Monitor
;						1=有効,0=無効
;bit12		IESO	0	内部･外部切替スイッチモード
;			________	1=有効,0=無効
;bit11		CLKOUTEN 1	クロック出力イネーブルビット
;						1=無効　RA4I/O使用可
;						0=有効　クロックがCLKPUTピンに出力される
;bit10-9	BOREN	00	ブラウンアウト設定
;						11=有効
;						10=スリープ時以外有効
;			___			00=無効
;bit8		CPD		1	データメモリプロテクション
;			__			1=無効,0=有効
;bit7		CP		1	プログラムメモリプロテクション　
;						1=無効,0=有効
;bit6		MCLRE	0	RA3/MCLRピン選択ビット
;			_____		1=MCLR有効,0=RA3有効(Digital input)
;bit5		PWRTE	0	power_up timer　使います。
;						1=無効,0=有効
;bit4-3		WDTE	00	Watchdog Timer
;						11=有効
;						10=ランニング中に有効、スリープ中は無効
;						01=レジスタによるコントロール
;						00=無効
;bit2-0		FOSC	100	発振器選択ビット
;						111=ECH:外部クロック入力（4-32MHZ)、RA4I/O可
;						110=ECM:外部クロック入力（0.5-4MHZ)、RA4I/O可
;						101=ECL:外部クロック入力（0-0.5MHZ)、RA4I/O可
;						100=INTOSC:内部発振、RA4-RA5I/O可
;						011=EXTRC:外部RC発振、RA4I/O可、RA5不可
;						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  1  0  0  1  1  0  0  0  0  １  0  0
;
;
	__CONFIG _CONFIG1,	B'0000100110000100'
;
;CONFIGURATION WORD 2(ADDRESS:8008H)マニュアル52ページ
;					設定
;bit13		LVP		0	低電圧プログラミング設定
;						1=有効
;			_____		0=無効、高電圧必要
;bit12		DEBUG	1	インサーキット･デバッガ モード設定
;						1=無効
;						0=有効、RA0-1をデバッガに使用
;bit11					Unimplemented
;bit10		BORV	0	ブラウンアウト･リセット電圧選択ビット（Vbor参照)
;						1=低電圧で動作
;						0=高電圧で動作
;bit9		STVREN	0	スタック･オーバーフロー･リセット設定
;						1=有効
;						0=無効
;bit8		PLLEN	0	PLL設定
;						1=4xPLL有効
;						0=4xPLL無効
;bit7-5					未実装　読み出し=1
;bit4					Reserved　これらのビットは'1'にしておく
;bit3-2					未実装　読み出し=1
;bit1-0		WRT		11	フラッシュメモリ プロテクション設定（EECONレジスタ参照)
;						11=無効
;						10=0h-1FFh有効
;						01=0h-3FFh有効
;						00=0h-7FFh有効
;
;bit	15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
;data    0  0  0  1  0  0  0  0  1  1  1  1  1  1  1  1
;
;
	__CONFIG _CONFIG2,	B'0001000011111111'


;		ワークエリア定義
;
;		BANK0	20h-7Fh
;
;		使用していないのもあります
;

hex0		equ		020h		;32ビット取得HEXデータ
hex1		equ		021h		;
hex2		equ		022h
hex3		equ		023h
hexw0		equ		024h		;32ビットバイナリ演算用
hexw1		equ		025h
hexw2		equ		026h
hexw3		equ		027h
cnt0		equ		028h		;時間待ちルーチン用
cnt1		equ		029h
cnt2		equ		02ah
cnt3		equ		02bh
tmp0		equ		02ch		;汎用ワーク
tmp1		equ		02dh
FLG			equ		02eh		;エラー＆設定フラグ
MODE		equ		02fh		;実行モード設定
;ロータリーエンコーダ関連
FDA0		equ		030h		;アップダウンカウンタ
FDA1		equ		031h		;
RESTP		equ		032h		;１ステップあたりのカウント数
REDAT		equ		033h		;REデータ保存用
rew0		equ		034h		;RE用ワーク
rew1        equ     035h        ;RE用ワーク
;ＢＣＤ変換関連
digit12     equ     03ah        ;BCD変換出力1，2桁
digit34     equ     03bh		;BCD変換出力3，4桁
digit56     equ     03ch        ;BCD変換出力5，6桁
digit78     equ     03dh        ;BCD変換出力7，8桁
digit9A     equ     03eh        ;BCD変換出力9，10桁
bcdw0		equ		03fh		;BCD補正処理ワーク
bcdw1		equ		040h
;
wrk0		equ		041h        ;演算用汎用ワーク
wrk1		equ		042h
shift       equ     043h        ;ビットシフト用ワーク
blk			equ		044h		;ゼロブランキング制御フラグ
colum		equ		045h		;現在の桁位置
colw0		equ		046h		;桁位置処理ワーク
colw1		equ		047h		;
;
CMD0		equ		048h		;コマンドパケット下位8ビット
CMD1		equ		049h		;コマンドパケット上位8ビット
DBUF0		equ		04ah		;SPI送信データ編集用バッファ
DBUF1		equ		04bh
DBUF2		equ		04ch
DBUF3		equ		04dh
DBUF4		equ		04eh
DBUF5		equ		04fh
DBUF6		equ		050h
DBUF7		equ		051h
;
DSP_ADR     equ     05fh
icw0        equ     060h
icw1        equ     061h
MSAD0		equ		062h
MSAD1		equ		063h
REKEY		equ		064h

;
;	液晶表示バッファ
;
;	A0H-AFH		1行目16バイトでA0Hは最右側、AFHが最左側
;	B0H-BFH		2行目
;	FSR0でアクセス

			ORG		0h
			goto	init
			ORG		04h
			goto	init

			org		05h



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			PIC16F1823　イニシャライズ
;
;		OSCCON(BANK1　099H) マニュアル69ページ
;			bit7	SPLLEN	ソフトウエアPLL設定ビット
;							1 = 4xPLL有効
;							0 = 4xPLL無効(リセット後)
;			＊コンフィグレーションワードPLLEN=1の時、この設定は無視される。
;			bit6-3	IRCF	内部発振器クロック選択ビット
;							000x = 31KHZ LF
;							0010 = 31.25KHZ MF
;							0011 = 31.25KHZ HF
;							0100 = 62.5KHZ MF
;							0101 = 125KHZ MF
;							0110 = 250KHZ MF
;							0111 = 500KHZ MF（デフォルト）
;							1000 = 125kHZ HF
;							1001 = 250kHZ HF
;							1010 = 500kHZ HF
;							1011 = 1MHZ HF
;							1100 = 2MHZ HF
;							1101 = 4MHZ HF
;							1110 = 8MHZ or 32MHZ HF
;							1111 = 16MHZ HF
;			bit2			Unimplemented
;			bit1-0	SCS		システムクロック選択ビット
;							1x = 内部発振器
;							01 = タイマ1発振器
;							00 = FOSCで指定された発振器(リセット後)
;			(注)詳細はマニュアルあるいは当局HP内解説を参照
;							HF=HFINTOSC（16MHZ)
;							MF=MFINTOSC(500KHZ)
;							LF=LFINTOSC(32KHZ)
;
;
;			32MHZ内部発振設定
;		コンフィグレーションワード1		FOSC=100
;		OSCCON				SCS=00
;		OSCCON				IRCF=1110
;		OSCCON				SPLLEN=1(#1)
;		コンフィグレーションワード2		PLLEN=1(#1)
;						(#1)設定はどちらかでOKだが、PLLEN=1とすると、
;							OSCCONのSPLLEN=0の設定は無効となる。
;							また、8MHZのHFINTOSCは選択の余地が無い。
;
;		PORTA(BANK0　00CH）　マニュアル126ページ
;			bit7-6	Unimplemented(read=0)
;			bit5-4	RA5-4	デジタルI/O、アナログ入力
;			bit3	RA3		デジタルInputのみ
;			bit2	RA2-1	デジタルI/O、アナログ入力
;			bit0	RA0		デジタル･アナログI/O,DAコンバータ出力
;
;		PORTC(BANK0　00EH）　マニュアル130ページ
;			bit7-6	Unimplemented(read=0)
;			bit5-4	RC5-4	デジタルI/O
;			bit3	RC3-0	デジタルI/O、アナログ入力
;
;		TRISA(BANK1　08CH)　マニュアル126ページ
;			bit7-6	Unimplemented(read=0)
;			bit5-4	RA5-4	1=入力、0=出力
;			bit3	RA3		常に1
;			bit2	RA2-0	1=入力、0=出力
;
;		TRISC(BANK1　08EH)　マニュアル130ページ
;			bit7-6	Unimplemented(read=0)
;			bit5-4	RA5-0	1=入力、0=出力
;
;		LATA(BANK2　10CH)　データラッチﾚｼﾞｽﾀ　マニュアル127ページ
;			bit7-6	Unimplemented(read=0)
;			bit5-4	RA5-4	出力データ保持
;			bit3	Unimplemented(read=0)
;			bit2	RA2-0	出力データ保持
;			（このラッチデータはTRISAレジスタ設定で各ピンに反映される）
;
;		LATC(BANK2　10EH)　データラッチﾚｼﾞｽﾀ　マニュアル130ページ
;			bit7-6	Unimplemented(read=0)
;			bit5-0	RA5-4	出力データ保持
;			（このラッチデータはTRISCレジスタ設定で各ピンに反映される）
;
;
;		ANSELA(BANK3　18CH)　マニュアル127ページ
;			bit7-5	Unimplemented(read=0)
;			bit4	ANSA3/RA4	アナログ/デジタル選択ビット
;								1=アナログ入力
;								0=デジタルI/O
;			bit3	Unimplemented(read=0)
;			bit2-0	ANA2-0/RA2-0アナログ/デジタル選択ビット
;								1=アナログ入力
;								0=デジタルI/O
;			＊デフォルトでは、すべて1(アナログ入力)となっている
;
;		ANSELC(BANK3　18EH)　マニュアル131ページ
;			bit7-4	Unimplemented(read=0)
;			bit3-0	ANSC3-0/RC3-0　アナログ/デジタル選択ビット
;								1=アナログ入力
;								0=デジタルI/O
;			＊デフォルトではアナログ入力となっている
;
;		WPUA(BANK4　20CH)　ポートAプルアップ設定ビット
;			bit7-6	Unimplemented(read=0)
;			bit5-0			1=PORTA各ビットプルアップ有効
;					 _____	0=PORTA各ビットプルアップ無効
;					*WPUENビットが有効の時のみ、設定有効となる。
;
;		WPUC(BANK4　20EH)　ポートCプルアップ設定ビット
;			bit7-6	Unimplemented(read=0)
;			bit5-0			1=PORTC各ビットプルアップ有効
;					 _____	0=PORTC各ビットプルアップ無効
;					*WPUENビットが有効の時のみ、設定有効となる。
;
;
;		ADCON1レジスタ(BANK1　09EH)マニュアル
;		bit7	ADFM	変換結果格納指定
;						1=右詰
;						0=左詰め
;		bit6-4	ADCS	A/D変換クロック選択ビット
;						000	= Fosc/2
;						001 = Fosc/8
;						010 = Fosc/32
;						011 = Frc
;						100 = Fosc/4
;						101 = Fosc/16
;						110 = Fosc/64
;						111 = Frc
;		bit3-2	Unimplemented(read=0)
;		bit1-0	ADPREF	参照正電圧指定
;						00 = VDD
;						01 = Reserved
;						10 = 外部VREF+ (RA1)
;						11 = 内部FVRモジュール
;
;
;		OPTION_REG(BANK1　095H)　マニュアル177ページ
;					_____
;			bit7=1	WPUEN	プルアップ グローバル設定ビット
;							0=有効,1=無効
;			bit6=0	INTEDG	INTピン割り込み信号エッジ↑
;							1=↑
;							0=↓
;			bit5=0	TMR0CS	TMR0クロックソース選択ビット
;							1=外部入力RA2/T0CKI
;							0=内部システムクロック(Fosc/4)
;			bit4=1	TMR0SE	TMR0ソースエッジ選択ビット
;							1=RA4/T0CKIピンが↑の時インクリメント
;							0=RA4/T0CKIピンが↓の時インクリメント
;			bit3=0	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
;
;   SSP1CON1    SSP制御レジスタ１   BSR=4
;       bit7    WCOL：書込みコリジョン検出ビット
;               マスタの場合
;               1=I2Cの送信開始条件が無効の時にSSP1BUFレジスタへ書込みが行われた
;               0=問題無
;               スレーブの場合
;               1=前のワードの送信中にSSP1BUFレジスタへの書き込みが行われた
;               0=問題無
;                   *ソフトウエアでクリアする必要あり
;       bit6    SSP1OV：受信オーバーフロー インジケータービット(注1)
;               1=オーバーフロー発生
;               2=問題無
;                   *ソフトウエアでクリアする必要あり
;       bit5    SSP1EN：同期シリアルポートイネーブルビット
;               1=シリアルポート有効(注2)
;               0=シリアルポート無効、I/Oポート使用可
;       bit4    CKP：クロック極性選択ビット
;               1=クロックを有効化
;               0=クロックをLOWに保持（クロックストレッチ）
;                   *マスタモードでは使用しない
;       bit3-0  SSP1M：同期シリアルポート モード選択ビット
;               0110=スレーブモード、7ビットアドレス
;               0111=スレーブモード、10ビットアドレス
;               1000=マスターモード、クロック=FOSC/(4*SP1ADD+1))(注3)
;               1011=ファームウエア制御のマスターモード（スレーブアイドル）
;               1110=スレーブモード、7ビットアドレス、
;                    スタートビットとストップビットの割込み有効
;               1111=スレーブモード、10ビットアドレス、
;                    スタートビットとストップビットの割込み有効
;
;       注1)マスターモードの場合、新たな送受信はSSP1BUFへの書込みによって
;       　　開始するため、オーバーフロービットはセットされない
;       注2)SDAピンとSCLピンは入力としてTRIS設定
;       注3)SP1ADDの値、0,1,2はサポートされない
;
;   SSP1CON2    SSP制御レジスタ２
;       bit7    GCEN：ジェネラルコールイネーブルビット
;               1=SSP1SRでGCアドレス(00H)を受信した時の割込みを有効にする
;               0=GCアドレスを無効にする
;       bit6    ACKSTAT：肯定応答(ACK)ステータスビット
;               1=ACK受信した
;               0=ACK受信していない
;       bit5    ACKDT：ACKデータビット（受信モード）
;               1=ACKしない
;               0=ACKあり
;       bit4    ACKEN：ACKシーケンス イネーブルビット（マスタ受信モード）（注1）
;               1=ACKシーケンスを開始し、ACKDTビットを送信する
;               0=ACKシーケンスをアイドルにする
;       bit3    RCEN：受信イネーブルビット（マスターモードのみ）（注1）
;               1=受信モードを有効にする
;               0=受信をアイドルにする
;       bit2    PEN：ストップ条件イネーブルビット（注1）
;               SCK解放制御
;               1=ストップ条件を開始する、ハードウエアによって自動でクリアされる
;               0=ストップ条件をアイドルにする
;       bit1    RSEN：反復スタート条件イネーブルビット（注1）
;               1=反復スタート条件を開始する
;               　ハードウエアによって自動でクリアされる
;               0=反復スタート条件をアイドルにする
;       bit0    SEN：スタート条件イネーブルビット（注1）
;               マスターモードの場合
;               1=スタート条件を開始する、ハードウエアによって自動でクリアされる
;               0=スタート条件をアイドルにする
;
;       注1）I2Cモジュールがアイドルで無い場合、これらのビットはセットされず、
;            SSP1BUFに書き込まれない場合がある（SSP1BUFへの書込み無効）
;
;   SSP1CON3    SSP1制御レジスタ３
;       bit7    ACKTIM：肯定応答(ACK)タイムステータスビット（注1）
;               1=ACKシーケンスを実行中。
;               　SCLクロックの8番目の立下りエッジでセットされる
;               0=ACKシーケンスではない。
;               　SCLクロックの9番目の立上がりエッジでクリアされる
;       bit6    PCIE：ストップ条件割込みイネーブルビット
;               1=ストップ条件検出時の割込みを有効にする
;               0=ストップ条件検出時の割込みを無効にする
;       bit5    SCIE：スタート条件割込みイネーブルビット
;               1=スタート／リスタート条件検出時の割込みを有効にする
;               0=スタート条件検出時の割込みを無効にする
;       bit4    BOEN：バッファ上書きイネーブルビット
;               1=SSP1BUFは更新され、受信したアドレス／データバイトに対して
;               　ACK信号が生成される。
;               　BFビットが0の場合のみSSP1OVビットの状態を無視する。
;               0=SSP1OVがクリアされている時のみSSP1BUFが更新される
;               *マスタモードの場合、このビットは無視される
;       bit3    SDAHT：SDAホールド時間の選択ビット
;               1=SDAのホールド時間はSCLの立下りエッジから最小300ns
;               0=SDAのホールド時間はSCLの立下りエッジから最小100ns
;       bit2    SBCDE：スレーブモードのバスコリジョン検出イネーブルビット
;               1=スレーブバスコリジョン割込みを有効にする
;               0=スレーブバスコリジョン割込みを無効にする
;       bit1    AHEN：アドレスホールドイネーブルビット（スレーブモードのみ）
;               1=一致受信アドレスバイトのSCLの8番目の立下りエッジ後、SSP1CON1
;               　レジスタのCKPビットをクリアし、SCLがLOWに保持される
;               0=アドレスホールド機能を無効にする
;       bit0    DHEN：データホールドイネーブルビット（スレーブモードのみ）
;               1=受信データバイトのSCLの8番目の立下りエッジ後、スレーブハードウ
;               エアがSSP1CON1レジスタのCKPビットをクリアし、SCLがLOWに保持される
;               0=データホールド機能を無効にする
;       *注1）ACKTIMステータスビットがアクティブになるのは、AHENビットまたは、
;             DHENビットがセットされている場合のみ
;
;   SSP1MSK     SSP1マスクレジスタ
;       bit7-1  MSK：マスクビット
;               1=受信アドレスbitnをSSP1ADD(n)と比較して、I2Cアドレス一致を検出
;               0=受信アドレスbitnをI2Cアレス一致の検出に使わない
;       bit0    I2Cスレーブモードのマスクビット、10ビットアドレス
;               I2Cスレーブモード、10ビットアドレス（SSP1M3-0=0111または1111)
;               1=受信アドレスbit0をSSP1ADD(0)と比較して、I2Cアドレス一致を検出
;               0=受信アドレスbit0をI2Cアレス一致の検出に使わない
;               *スレーブモード、7ビットアドレスでは、このビットは無視される
;
;   SSP1ADD     MSSP1アドレス／ボーレートジェネレータ
;               マスターモードの場合
;       bit7-0  ADD：ボーレートクロック分周ビット（(ADD(7-0)+1)*4）/FOSC
;               スレーブモードの場合
;       bit7-1  ADD：7ビットのアドレス
;       bit0    未使用
;           *10ビットアドレスモードでの状態は割愛します
;
;   SSP1STAT    SSP1ステータスレジスタ
;       bit7    SMP：スルーレート制御
;               1=スルーレート制御の標準速度モード(100KHZ,1MHZ)を無効にする
;               0=スルーレート制御の高速モード(100KHZ)を有効にする
;       bit6    CKE：SMBus仕様互換入力
;               1=しきい値がSMBus仕様に準拠する入力
;               0=無効
;       bit5    D_NOT_A：データ/アドレスビット
;               1=最後に送受信したバイトがデータ
;               0=最後に送受信したバイトがアドレス
;       bit4    P：ストップビット
;               1=最後にストップビットが検出された事を示す
;               0=最後にストップビットが検出されなかった事を示す
;       bit3    S：スタートビット
;               1=最後にスタートビットが検出された事を示す
;               0=最後にスタートビットが検出されなかった事を示す
;       bit2    R_NOT_W：READ/WRITEビット情報
;               スレーブモード
;               1=読み出し
;               0=書込み
;               マスタモード
;               1=送信動作中
;               0=送信動作中で無い
;       *このビットとSEN,RSEN,PEN,RCEN,ACKENのどれかをORするとMSSP1がアイドル中
;        かどうかが判る
;       bit1    UA：交信アドレスビット（10ビットアドレスモードのみ）
;               1=アドレスの更新が必要
;               0=アドレスの更新が不要
;       bit0    BF：バッファフル ステータスビット
;               受信
;               1=受信が完了、SSP1BUFがフルである
;               0=受信が完了していない、SSP1BUFがエンプティ
;               送信
;               1=データ送信中(ACK及びｽﾄｯﾌﾟﾋﾞｯﾄを含まない)SSP1BUFはフル
;               0=データ送信完了(ACK及びｽﾄｯﾌﾟﾋﾞｯﾄを含まない)SSP1BUFはエンプティ
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

init
;			各レジスタ初期設定

			;クロック設定
			movlb	01h			;BANK１に切替
			movlw	0f0h		;1111000B
			movwf	OSCCON		;内部発振器は8MHZに設定
								;4xPLL=ON
			;I/Oポート初期化
			movlb	0h			;BANK0
			clrf	PORTA		;Init PORT
			clrf	PORTC
			movlb	02h			;BANK2
			clrf	LATA		;出力ラッチレジスタ
			clrf	LATC
			movlb	03h			;BANK3
			movlw	01h			;00000001B
			movwf	ANSELA		;RA0,アナログ
								;RA1-5,デジタルI/O
			clrf	ANSELC		;RC0-5,デジタルI/O
			movlb	01h			;BANK1
			movlw	0ffh
			movwf	TRISA		;すべて入力
			movwf	TRISC		;すべて入力

			;TMR0およびプルアップ設定
			movlb	01h			;BANK1
			movlw	090H		;10010000b
			movwf	OPTION_REG	;プルアップOFF
								;割込みエッジ↓
								;クロックソース内部（Fosc/4）
								;TMR0カウントエッジ↑
								;プリスケーラ割当→TMR0
								;プリスケーラ分周1/2にセット

			;ADC
			movlb	01h			;BANK1
			movlw	030h		;0011000B
			movwf	ADCON1		;左詰め、基準電圧VDD
								;ADCクロック　Fosc/64=2us(32MHZ)
;			初期設定終了
			clrf	BSR
			goto	coldst

;
;		基本アクセス（１）
;		連続送信シーケンス
;
;
DEBUG1
			call	wait1s		;TM1637安定化待ち
			call	MSSP_MAS	;MSSP起動、マスターモード
			call	STARTCON	;スタートコンディション送信
			movlw	40h			;桁アドレス自動インクリメント
			call	SEND_BYTE	;Command1送信
			call	STOPCON		;いったん終了

			call	STARTCON
			movlw	0c0h		;最上位桁アドレス指定
			call	SEND_BYTE	;Command2：桁アドレス送信

			movlw	006h		;”１”
			call	SEND_BYTE	;セグメントデータ送信

			movlw	0dbh		;”２：”
			call	SEND_BYTE	;SEGデータ連続送信

			movlw	04fh		;”３”
			call	SEND_BYTE

			movlw	066h		;”４”
			call	SEND_BYTE
			call	STOPCON		;ストップコンディション送信

			call	STARTCON
			movlw	08fh		;ラッチ、最大光度
			call	SEND_BYTE	;Command3送信
			call	STOPCON
			call	wait1s
			;
			NOP
			bra		$-1			;無限ループ

;
;	基本アクセス（２）
;	単発送信シーケンス
;
DEBUG2		
			call	wait1s		;TM1637安定化待ち
			call	MSSP_MAS	;MSSP起動、マスターモード
			call	STARTCON	;スタートコンディション送信
			movlw	44h			;桁アドレス固定
			call	SEND_BYTE	;Command1送信
			call	STOPCON		;いったん終了

			call	STARTCON
			movlw	0c0h		;桁アドレス指定
			call	SEND_BYTE	;Command2：桁アドレス送信

			movlw	03fh		;”０”
			call	SEND_BYTE	;セグメントデータ送信
			call	STOPCON		;ストップコンディション送信

			call	STARTCON
			movlw	0c1h		;桁アドレス指定
			call	SEND_BYTE	;Command2：桁アドレス送信

			movlw	07dh		;”６”
			call	SEND_BYTE	;セグメントデータ送信
			call	STOPCON		;ストップコンディション送信

			call	STARTCON
			movlw	0c2h		;桁アドレス指定
			call	SEND_BYTE	;Command2：桁アドレス送信

			movlw	05bh		;”２”
			call	SEND_BYTE	;セグメントデータ送信
			call	STOPCON		;ストップコンディション送信

			call	STARTCON
			movlw	0c3h		;桁アドレス指定
			call	SEND_BYTE	;Command2：桁アドレス送信

			movlw	06dh		;”５”
			call	SEND_BYTE	;セグメントデータ送信
			call	STOPCON		;ストップコンディション送信

			call	STARTCON
			movlw	08fh		;ラッチ、最大光度
			call	SEND_BYTE	;Command3送信
			call	STOPCON
			call	wait1s
			;
			NOP
			bra		$-1			;無限ループ


;
;		メイン　（サンプル プログラム）
;
;		ロータリーエンコーダによる、アップダウンカウンタ
;
coldst		movlw	0ah
			movwf	FDA0		;スタート値
            clrf	FDA1
            movlw	01h			;増減ステップ
            movwf	RESTP
			movlw	08h			;00001000B
			movwf	FLG			;セロブランキングのみ指定
			call	wait1s		;TM1637安定化待ち
			call	MSSP_MAS	;MSSP起動、マスターモード
			goto	newdat		;スタート値表示してからループに突入

mloop		call	RE_DATA		;出力はFDAx16ビット
            iorlw	0h			;W=0以外ならカウント有
			btfsc	STATUS,Z	;W=0は変化無なので何もしない
			goto	mloop		;何もしないでループ先頭へ
;			設定値が変更された
newdat		movf	FDA0,W
            movwf	hex0
            movf	FDA1,W
            movwf	hex1
            clrf	hex2
            clrf	hex3
            call	BCD
			call	SETBUF		;データ整理
			call	PUTL		;モジュールに送信
			goto	mloop


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		ロータリーエンコーダ入力パルス　カウントサブルーチン
;
;		想定部品	ALPS	EC12E2420801(クリックタイプ）
;						EC12E2420803(ノンクリックタイプ)
;						チャタリング	3ms(max),R=10KΩ
;						バウンズ	2ms(max),R=10KΩ
;		エンコーダA端子		RC3
;		エンコーダB端子		RC4
;		カウント出力データ	FDA0
;							FDA1
;
;		エンコーダ右回り	アップカウント
;		エンコーダ左回り	ダウンカウント
;       カウントステップ    RESTPに事前設定
;
;
;		状態変化無ならWreg=0でリターン
;		状態変化有ならWreg=1、REDAT下位2ビットに記録
;       REDAT   エンコーダ用ビットデータ
;		旧ビットデータは左シフトされ、オーバーフロービットは破棄される
;		t(0)	→bit1,0(REA,REB)
;		t(-1)	→bit3,2(REA,REB)
;		t(-3)	→bit5,4(REA,REB)
;		t(-4)	→bit7,6(REA,REB)
;
;		使用専用ワーク	rew0,rew1,REDAT,RESTP
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

RE_DATA
;			ポートデータチェック
;			rew0	取得データ（下位2ビット有効）
			movf	PORTC,W     ;RC3,RC4ポート読込(1'st)
			movwf	rew0
			lsrf	rew0
			lsrf	rew0
			lsrf	rew0		;bit0=REA,bit1=REB
			movlw	03h         ;
			andwf	rew0,F      ;不要ビットをクリア
			call	w1m			;チャタリング終了待ち3ms
			call	w1m
			call	w1m
			movf	PORTC,W		;RC0,RC1ポート読込(2'st)
			movwf	rew1
			lsrf	rew1
			lsrf	rew1
			lsrf	rew1		;
			movlw	03h			;不要ビットをクリア
			andwf	rew1,W
			xorwf	rew0,W		;1'stと2'stを比較
			btfss	STATUS,Z	;Z=1ならば取得データ有効
			goto	RE_DATA     ;データ読込エラー リトライ

;			ポートデータ新旧比較
			movf	REDAT,W
			movwf	rew1		;過去データをコピー
			movlw	03h
			andwf	rew1,W		;不要ビットをクリア
			xorwf	rew0,W		;新旧データ比較
			btfsc	STATUS,Z	;Z=0ならば状態変化有
			retlw	0h			;状態変化無で終了

;			保存データ更新
;			過去データ      REDAT
;			一時保存ワーク  rew1
			movf	REDAT,W		;過去ビット保存データ
			movwf	rew1		;過去データ一時保存
			lslf	REDAT,F		;新データ挿入のため2ビット左シフト
			lslf	REDAT,F		;bit0-1はクリアされます
			movf	rew0,W
			iorwf	REDAT,F		;保存データ更新
                                ;bit0→REA新取得データ
                                ;bit1→REB新取得データ
                                ;bit2→REA旧データ
                                ;bit3→REB旧データ

;			回転方向判別
;           rew1=過去データ
;           rew0=現在データ
;           判別式D=rew1*2 XOR rew0
;           D(bit1)=0ならCW（時計回り）
;           D(bit1)=1ならCCW（反時計回り）
			movlw	03h			;
			andwf	rew1,F		;rew1=F(-1)の2ビットのみとする
			lslf	rew1,W		;F(-1)ビットを左シフト
			xorwf	rew0,F		;(取得ビット)XOR(旧ビット)
			btfsc	rew0,1		;Lなら時計回転
			goto	ccw			;Hなら反時計回転

;			右回転処理
;   		FDA(0-1)を指定ステップでインクリメント
;			RESTP=アップダウンステップ
cw			movf	RESTP,W     ;1カウントの加算ステップ数
			movwf	hexw0
			clrf	hexw1
            movf	FDA0,W
			movwf	hex0
			movf	FDA1,W
            movwf	hex1
			call	add16b		;ステップ周波数分を加算
            movf    hex0,W
            movwf   FDA0
            movf    hex1,W
            movwf   FDA1
;           最大行番号越えをチェック
            movf    hex0,W
            movwf   hexw0
            movf    hex1,W
            movwf   hexw1
            movlw   0fh
            movwf   hex0
            movlw   027h
            movwf   hex1		;hexw=270FH=9999
            call    sub16b
            iorlw   0h			;ボローチェック
            btfsc    STATUS,Z
			retlw	01h         ;状態変化有、正常終了
;           最大行番号保護
            movlw   0fh
            movwf   FDA0
            movlw   027h
            movwf   FDA1		;FDAx=270FH=9999
            retlw   0h			;状態変化無、カウンタ最大値

;			左回転処理		FDA(0-1)を指定ステップでデクリメント
ccw			movf	RESTP,W		;1カウントの減算ステップ数
			movwf	hexw0
			clrf	hexw1
            movf	FDA0,W
			movwf	hex0
			movf	FDA1,W
            movwf	hex1
			call	sub16b		;ステップ周波数分を減算
            iorlw	0h          ;ボローチェック
            btfss	STATUS,Z
            goto	ccwer
            movf	hex0,W
            movwf	FDA0
            movf	hex1,W
            movwf	FDA1
			retlw	01h         ;状態変化有、終了
ccwer       clrf	FDA0        ;
            clrf	FDA1
            retlw	0h          ;状態変化無、カウンタリセット


;		16ビットバイナリ加算
;	hex(0-1)=hex(0-1)+hexw(0-1)
;	W=0の時、正常終了
;	W=1の時、エラー発生（キャリー）、演算結果は保障されない
add16b
			movf	hexw0,W		;W=hexw0
			addwf	hex0,F		;hex0=hex0+hexw0
			btfss	STATUS,C
			goto	ad11		;キャリー無で次の加算
			incf	hex1,F		;キャリー発生、hex1=hex1+1
			btfsc	STATUS,C
			retlw	01h			;キャリー発生、加算エラー終了
ad11		movf	hexw1,W		;W=hexw1
			addwf	hex1,F		;hex1=hex1+hexw1
			btfsc	STATUS,C
			retlw	01h			;キャリー発生、加算エラー終了
			retlw	0h			;加算正常終了


;		16ビットバイナリ減算
;	hex(0-1)=hex(0-1)-hexw(0-1)
;	W=0の時、正常終了
;	W=1の時、エラー発生（ボロー）、演算結果は保障されない
sub16b
			movf	hexw0,W		;W=hexw0
			subwf	hex0,F		;hex0=hex0-hexw0
			movlw	01h			;フラグ変化しない
			btfsc	STATUS,C
			goto	sb11		;ボロー無で次の減算
			subwf	hex1,F		;ボロー発生、hex1=hex1-1
			btfss	STATUS,C
			retlw	01h			;ボロー発生、減算エラー終了

sb11		movf	hexw1,W		;W=hexw1
			subwf	hex1,F		;hex1=hex1-hexw1
			btfss	STATUS,C
			retlw	01h			;ボロー発生、減算エラー終了
			retlw	0h			;減算正常終了




;
;		ＧＲＯＶＥ7セグ　表示データバッファのセッティング
;
;	入力データ		5バイト(10桁分)BCD　この内容は保存される
;				digit12
;				digit34
;				digit56（表示されない）
;				digit78（表示されない）
;				digit9A（表示されない）
;
;	表示桁		colum　この内容は保存される
;
;	入力制御フラグ	flg　この内容は保存される
;		4桁表示固定	
;	　2桁表示指令	flg=xxxxx001（無視される）
;	　4桁表示指令	flg=xxxxx011（無視される）
;	　6桁表示指令	flg=xxxxx101（無視される）
;	　8桁表示指令	flg=xxxxx111（無視される）
;	　ゼロブランキング
;					flg=xxxx0xxx	bit3=0	しない
;					flg=xxxx1xxx	bit3=1	する
;	　ドット表示指令	flg=x000xxxx　表示なし
;					bit4=1	2,5桁点燈（無視される）
;					bit5=1	3,6桁点燈（3桁目のみ）
;					bit6=1	4,7桁点燈（無視される）
;
;
;		DBUFx　	各桁バッファ データフォーマット
;		bit0-3	表示する十進数値データ	0H-9H→0-9(注1)
;		bit4	不使用
;		bit5	ゼロブランキング
;		bit6	不使用
;		bit7　　ドット表示	0=OFF、1=ON
;		注1)表示数値データは送信時にLED表示ビットデータに変換されます
;
;	使用ワーク	bufw0
;
SETBUF
;			表示する数値データを全バッファに書込み
			swapf	digit78,W
			andlw	0fh
			movwf	DBUF7		;8桁目に数値データ書込み

			movf	digit78,W
			andlw	0fh
			movwf	DBUF6		;7桁目に数値データ書込み
			
			swapf	digit56,W
			andlw	0fh
			movwf	DBUF5		;6桁目に数値データ書込み

			movf	digit56,W
			andlw	0fh
			movwf	DBUF4		;5桁目に数値データ書込み
			
			swapf	digit34,W
			andlw	0fh
			movwf	DBUF3		;4桁目に数値データ書込み

			movf	digit34,W
			andlw	0fh
			movwf	DBUF2		;3桁目に数値データ書込み
			
			swapf	digit12,W
			andlw	0fh
			movwf	DBUF1		;2桁目に数値データ書込み

			movf	digit12,W
			andlw	0fh
			movwf	DBUF0		;1桁目に数値データ書込み

;			その他指定処理を全バッファに行う
;			呼び出し順番によっては上手く機能しなくなるので注意
			call	zbk			;ゼロブランキング処理
			call	addot		;ドット表示処理

;			オーバーフローチェック
			movf	digit9A,W	;ここにデータがある場合O.Fとなる
			iorlw	0h
			btfss	STATUS,Z
			retlw	01h
			return

;
;			ゼロブランキング処理
;
;		入力		DBUFx　（数値データ設定済であること)
;				flg	ビット3　ZBKフラグ
;		使用ワーク	無
;
zbk
			btfss	FLG,3		;ZBK命令フラグチェック
			return				;命令無いので終了

			movf	DBUF4,W		;
			andlw	0fh			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			bsf		DBUF4,5		;ブランキングセット

			movf	DBUF3,W		;
			andlw	0fh			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			bsf		DBUF3,5		;ブランキングセット

			movf	DBUF2,W		;
			andlw	0fh			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			bsf		DBUF2,5		;ブランキングセット

			movf	DBUF1,W		;
			andlw	0fh			;数値データゼロチェック
			btfss	STATUS,Z
			return				;データはゼロで無いので終了
			bsf		DBUF1,5		;ブランキングセット

			return				;DBUF0はゼロブランキングしない



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			ドットを表示するか否かの処理ルーチン
;
;		入力	flg		
;
;		出力	DBUFx,4=0		ドット点燈無
;		出力	DBUFx,4=1		ドット点燈有
;
;		flg
;			ドット表示位置		flg=x111xxxx
;							bit4=1	2,5桁点燈
;							bit5=1	3,6桁点燈
;							bit6=1	4,7桁点燈
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

addot
			bcf		DBUF0,4		;ドット点灯ビットリセット
			bcf		DBUF1,4		;
			bcf		DBUF2,4		;
			bcf		DBUF3,4		;

adt2		;3桁点燈指令チェック
			btfss	FLG,5		;
			return				;違うので終了
			;3桁目点燈処理
			bsf		DBUF2,4		;3桁目ドット点燈
			return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		４バイトバイナリの10桁BCDへの変換
;		MicroChip社のアプリケーションノートより
;
;		入力		4バイト(32ビット)16進バイナリ
;				hex0
;				hex1
;				hex2
;				hex3
;
;		出力		5バイト(10桁)ＢＣＤ
;				digit12
;				digit34
;				digit56
;				gidit78
;				gidit9A
;
;		使用ワーク
;				hexw0	入力データ保存用
;				hexw1
;				hexw2
;				hexw3
;				shift	シフトカウンタ
;				bcdw0	補正処理ワーク
;				bcdw1
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BCD
			BCF		STATUS,C	;キャリーリセット
			MOVLW	020H		;シフトカウンタ初期化
			MOVWF	shift		;4バイト分32回の指定 
			CLRF	digit12		;BCDデータエリア初期化
			CLRF	digit34
			CLRF	digit56
			CLRF	digit78
			CLRF	digit9A
			MOVF	hex0,W
			MOVWF	hexw0
			MOVF	hex1,W
			MOVWF	hexw1
			MOVF	hex2,W
			MOVWF	hexw2
			MOVF	hex3,W
			MOVWF	hexw3
			
			;変換ループ処理
loop
			RLF		hexw0,F		;16進データ左シフト
			RLF		hexw1,F
			RLF		hexw2,F
			RLF		hexw3,F
			RLF		digit12,F	;BCDデータ左シフト
			RLF		digit34,F
			RLF		digit56,F
			RLF		digit78,F
			RLF		digit9A,F
			DECFSZ	shift,F		;
			GOTO	adjst		;BCD調整処理へ
			RETURN
			
			;BCDデータ全桁補正処理
adjst
			MOVF	digit12,W	;digit12
			CALL	adjbcd
			MOVWF	digit12
			MOVF	digit34,W	;digit34
			CALL	adjbcd
			MOVWF	digit34
			MOVF	digit56,W	;digit56
			CALL	adjbcd
			MOVWF	digit56
			MOVF	digit78,W	;digit78
			CALL	adjbcd
			MOVWF	digit78
			MOVF	digit9A,W	;digit9A
			CALL	adjbcd
			MOVWF	digit9A
			GOTO	loop

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			1バイト2桁分必要に応じて+3補正処理
;
;			入力		W_reg
;			出力		W_reg
;
;			使用ワーク	bcdw0
;					bcdw1
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
adjbcd
			MOVWF	bcdw0		;元データをbcdw0に保存
			MOVLW	3			;W=3
			ADDWF	bcdw0,W		;W=3+bcdw0
			MOVWF	bcdw1		;下桁を+3した上下桁をbcdw1に保存
			BTFSC	bcdw1,3		;if 下桁<7 then next_skip
			MOVWF	bcdw0		;下桁を+3した上下桁をbcdw0に保存 
		
			MOVLW	030H		;W+30
			ADDWF	bcdw0,W		;W=上桁+3
			MOVWF	bcdw1		;それをいったんbcdw1に保存
			BTFSC	bcdw1,7		;if 上桁<7 then next_skip
			MOVWF	bcdw0		;上桁を+3した上下桁をbcdw0に保存
			MOVF	bcdw0,W		;W_regに入れてリターン
			RETURN


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		GROVE７セグモジュール用セグメントデータへの変換
;
;	入力			Wレジスタに桁データ(DBUFx)を入れてコール
;				ドット消灯の場合、00H~0FH
;				ドット点灯の場合、10H~1FH
;
;	使用ワーク		segw0
;				
;	出力			Wレジスタに8ビット分ポート出力データを入れてリターン
;				
;	モジュール内セグメント
;		bit=1の時SEG_ON、BIT=0の時SEG_OFF
;
;		a				bit0=a	bit4=e
;	f		b			bit1=b	bit5=f
;		g		Dp		bit2=c	bit6=g
;	e		c			bit3=d	bit7=Dp
;		d		Dp		
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

GET_7SEG
			
			movwf	tmp0		;Wreg保存
			btfsc	tmp0,5		;ブランク制御フラグチェック
			retlw	0h			;ブランク返し
			andlw	01fh		;下位5ビット取り出し
			brw

;			ドット無
			retlw	B'00111111'	;Code 0 abcdef
			retlw	B'00000110'	;Code 1 bc
			retlw	B'01011011'	;Code 2 abdeg
			retlw	B'01001111'	;Code 3 abcdg
			retlw	B'01100110'	;Code 4 bcfg
			retlw	B'01101101'	;Code 5 acdfg
			retlw	B'01111101'	;Code 6 acdefg
			retlw	B'00000111'	;Code 7 abc
			retlw	B'01111111'	;Code 8 abcdefg
			retlw	B'01100111'	;Code 9 abcfg

			retlw	B'01110111'	;Code A abcefg
			retlw	B'01111100'	;Code B cdefg
			retlw	B'00111001'	;Code C adef
			retlw	B'01011110'	;Code D bcdeg
			retlw	B'01110011'	;Code E adefg
			retlw	B'01110001'	;Code F aefg

;			ドット有
			retlw	B'10111111'	;Code 0 abcdef
			retlw	B'10000110'	;Code 1 bc
			retlw	B'11011011'	;Code 2 abdeg
			retlw	B'11001111'	;Code 3 abcdg
			retlw	B'11100110'	;Code 4 bcfg
			retlw	B'11101101'	;Code 5 acdfg
			retlw	B'11111101'	;Code 6 acdefg
			retlw	B'10000111'	;Code 7 abc
			retlw	B'11111111'	;Code 8 abcdefg
			retlw	B'11100111'	;Code 9 abcfg

			retlw	B'11110111'	;Code A abcefg
			retlw	B'11111100'	;Code B cdefg
			retlw	B'10111001'	;Code C adef
			retlw	B'11011110'	;Code D bcdeg
			retlw	B'11110011'	;Code E adefg
			retlw	B'11110001'	;Code F aefg


;
;       ＧＬＯＶＥ　４桁７セグＬＥＤ ＤＩＳＰＬＡＹ
;			ＴＭ１６３７
;
;       書込みサブルーチン群
;
;       Ｉ２Ｃアドレス　無と思われる
;
;       コマンド
;		データセットアップ命令
;		bit7-6		bit7=0、bit6=1 でこの命令となる
;		bit5-4		00固定
;		bit3		bit=0でノーマル、bit=1でテスト
;		bit2		bit=0で桁アドレス自動インクリメント、bit=1で桁アドレス固定
;		bit1-0		00でデータはそのままレジスタ、10でキーを読んでデータ生成
;
;		アドレス設定命令
;		bit7-6		bit7=1、bit6=1 でこの命令となる
;		bit5-4		00固定
;		bit3-0		0000で桁アドレス00h
;		bit3-0		0001で桁アドレス01h
;		bit3-0		0010で桁アドレス02h
;		bit3-0		0011で桁アドレス03h
;		bit3-0		0100で桁アドレス04h（未実装）
;		bit3-0		0101で桁アドレス05h（未実装）
;
;		ＬＥＤ表示命令
;		bit7-6		bit7=1、bit6=0でこの命令
;		bit5-4		00固定
;		bit3		0でLED表示OFF、1でLED表示ON
;		bit2-0		000で輝度1/16
;		bit2-0		001で輝度2/16
;		bit2-0		010で輝度4/16
;		bit2-0		011で輝度10/16
;		bit2-0		100で輝度11/16
;		bit2-0		101で輝度12/16
;		bit2-0		110で輝度13/16
;		bit2-0		111で輝度14/16
;

;
;   Ｗレジスタの「ＳＥＧデータ」を単発で書き込む
;
;		表示位置指定	DSP_ADR
;
PUTW
			movwf	icw0		;PUSH Wreg
			call	STARTCON    ;スタートコンディション送信
			movlw	044h        ;桁アドレス固定モード
			call	SWAP_BYTE
			call	SEND_BYTE   ;Command1送信
			call	STOPCON

			call	STARTCON
			movf	DSP_ADR,W
			call	SWAP_BYTE
			call	SEND_BYTE	;Command2：桁アドレス送信
			movf	icw0,W		;POP Wreg
			call	SWAP_BYTE
			call	SEND_BYTE	;表示セグメントデータ
			call	STOPCON
			call	STARTCON
			movlw	08fh		;Command3：最大光度
			call	SWAP_BYTE
			call	STOPCON
			return

;
;	バッファの数値データを桁アドレスに連続送信・ラッチ
;
;		DBUF3	C0H
;		DBUF2	C1H
;		DBUF1	C2H
;		DBUF0	C3H
；
PUTL
			call	STARTCON    ;スタートコンディション送信
			movlw	040h        ;桁アドレス自動インクリメントモード
			call	SEND_BYTE   ;Command1送信
			call	STOPCON

			call	STARTCON
			movlw	0c0h		;開始桁アドレス
			call	SEND_BYTE	;Command2：桁アドレス送信

			movf	DBUF3,W
			call	GET_7SEG
			call	SEND_BYTE	;SEGデータをレジスタに転送

			movf	DBUF2,W
			call	GET_7SEG
			call	SEND_BYTE

			movf	DBUF1,W
			call	GET_7SEG
			call	SEND_BYTE

			movf	DBUF0,W
			call	GET_7SEG
			call	SEND_BYTE
			call	STOPCON

			call	STARTCON
			movlw	08fh		;ラッチ、最大光度
			call	SEND_BYTE	;Command3
			call	STOPCON
			return

			

;
;	ＭＳＳＰモジュール　Ｉ２Ｃモード制御サブルーチン群
;

;   I2C　マスタモード初期化サブルーチン
;
;       RC0     SCL         I2Cクロック
;       RC1     SDA         I2Cデータ
;       RC0,RC1は入力モードに設定

MSSP_MAS
            movlb   04h
            movlw   028h        ;28H=00101000
            movwf   SSP1CON1    ;SSP1イネーブル、
            movlw   04fh
            movwf   SSP1ADD     ;100KHZボーレート
            clrf    BSR
            call    MSSP_IDLE
            return

;
;   ＭＳＳＰ１アイドル待ち
;
;   R/WとSEN,RSEN,PEN,RCEN,ACKENのどれかとＯＲ演算すると
;   MSSP1がアイドルかどうかが分かる
;
MSSP_IDLE
            movlb   04h
msid01      movf    SSP1CON2,W
            andlw   01fh        ;1FH=00011111B
            btfss	STATUS,Z
			bra		msid01		;MSSP not idle
            btfsc	SSP1STAT,R_NOT_W
            bra		$-1			;R/Wbit=1 not idle
            clrf    BSR
            return
;
;	ＳＴＡＲＴ ＣＯＮＤＩＴＩＯＮ 送信
;
STARTCON
            movlb   04h
            bcf SSP1CON1,WCOL   ;衝突フラグクリア
            bsf SSP1CON2,SEN    ;スタート出力
            btfsc   SSP1CON1,WCOL
            goto    STARTCON    ;スタート再出力
            btfsc   SSP1CON2,SEN
            bra     $-1         ;送信完了チェック
            clrf    BSR
            return
;
;   反復スタート
;
RESTART
            bcf     PIR1,SSP1IF
            movlb   04h
            bsf SSP1CON2,RSEN
            btfsc   SSP1CON2,RSEN
            bra     $-1         ;送信完了チェック
            clrf    BSR
            return
;
;   マスターモード　1バイト送信
;   送信データはＷレジスタ
;
SEND_BYTE
			call	SWAP_BYTE
			bcf     PIR1,SSP1IF
            movlb   04h
            movwf   SSP1BUF
            btfsc   SSP1STAT,BF
            bra     $-1         ;送信終了待ち
            btfsc   SSP1CON2,ACKSTAT
            bra     $-1         ;ACK返信待ち
            clrf    BSR
			call    MSSP_IDLE   ;アイドル待ち
            return
;
;   マスターモード　1バイト受信
;   受信データはＷレジスタ
;
RCV_BYTE
            bcf     PIR1,SSP1IF
            movlb   04h
            bsf SSP1CON2,RCEN   ;マスタモード受信許可
            btfsc   SSP1CON2,RCEN
            bra     $-1         ;受信終了待ち
            bcf SSP1CON2,ACKDT  ;ACKにセット
            bsf SSP1CON2,ACKEN  ;ACK返送
            btfsc   SSP1CON2,ACKEN
            bra     $-1
            movf    SSP1BUF,W
            clrf    BSR
			call	SWAP_BYTE
            movwf   wrk1        ;受信データ一時保管
            movlb   04h
            bcf SSP1CON1,SSPOV  ;受信OFフラグリセット
            clrf    BSR
			call    MSSP_IDLE   ;アイドル待ち
            movf    wrk1,W
            return
;
;   最終バイト受信
;
LAST_RCV
            movlb   04h
            bsf SSP1CON2,RCEN   ;受信許可
            btfsc   SSP1CON2,RCEN
            bra     $-1         ;受信終了待ち
            bsf SSP1CON2,ACKDT  ;NACKにセット
            bsf SSP1CON2,ACKEN
            btfsc   SSP1CON2,ACKEN
            bra     $-1
            movf    SSP1BUF,W
            clrf    BSR
			call	SWAP_BYTE
            movwf   wrk1
			call    MSSP_IDLE   ;アイドル待ち
            return
;
;   ＳＴＯＰ ＣＯＮＤＩＴＩＯＮ 送信
;
STOPCON
            movlb   04h
            bsf SSP1CON2,PEN
            btfsc   SSP1CON2,PEN
            bra     $-1
            clrf    BSR
            return

;
;	８ビット上位下位対象入れ替え
;
;	76543210B→01234567B
;	入出力ともにＷレジスタ
;
SWAP_BYTE
			movwf	wrk0
			clrf	wrk1
			movlw	08h
			movwf	tmp0
			lsrf	wrk0,F		;データ元LSBがCに入る
			rlf		wrk1,F		;データ先LSBにCが入る
			decfsz	tmp0,F
			bra		$-3
			movf	wrk1,W
			return



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			遅延時間サブルーチン	32MHZ用
;
;		1cycle	= 0.125us
;		使用レジスタ	= cnt2,cnt3
;		BSR		=0(BANK0)
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

wait100u						;呼び出しも含めて、100us
								;call is 2cycles
			movlw	09h			;1
			movwf	cnt2		;1
			movlb	0h
			nop
			nop					;3
w100u		nop					;
			call	w10u		;10*9=90us(ここだけ命令ステップを数えない）
			decfsz	cnt2,F		;4*8+3=31cycles
			goto	w100u
			return				;2+5+31+2=40cycles=20us

wait50u							;呼び出しも含めて、50us
			call	wait25u
wait25u							;呼び出しも含めて、25us
			call	w10u
			call	w10u
			movlw	0bh			;5us=0.125us*40cycles
			movwf	cnt2		;
w25u		decfsz	cnt2,F		;ループ 2+10*3+2=34cycles
			goto	w25u
			nop
			nop
			return				;2+34+2+2=40cycles=5us

wait5m							; 5ms
			movlb	0h
			movlw	05h
			movwf	cnt2
w5m			call	w1m
			decfsz	cnt2,F
			goto	w5m
			return

wait10m							; 10ms
			movlb	0h
			movlw	d'10'
			movwf	cnt2
w10m		call	w1m
			decfsz	cnt2,F
			goto	w10m
			return

wait20m							; 20ms
			movlb	0h
			movlw	d'20'
			movwf	cnt2
w20m		call	w1m
			decfsz	cnt2,F
			goto	w20m
			return
wait50m							; 50ms
			movlb	0h
			movlw	d'50'
			movwf	cnt2
w50m		call	w1m
			decfsz	cnt2,F
			goto	w50m
			return

wait100m						; 100ms
			movlb	0h
			movlw	d'100'
			movwf	cnt2
w100m		call	w1m
			decfsz	cnt2,F
			goto	w100m
			return

wait500m						; 500ms
			movlb	0h
			movlw	05h
			movwf	cnt3
w500m		call	wait100m
			decfsz	cnt3,F
			goto	w500m
			return

wait1s							; 1s
			movlb	0h
			movlw	d'10'
			movwf	cnt3
w1s			call	wait100m
			decfsz	cnt3,F
			goto	w1s
			return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			1ms 基本ウェイト
;			呼び出しを含めて1msとなる。
;
;		clock	= 32MHz(0.03125usec)
;		1cycle	= 0.125usec
;		1ms		= 0.125usec * 8000cycles
;
;			使用変数　cnt0,cnt1
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
w1m
			movlb	0h
			movlw	08h
			movwf	cnt0		;
;			外周ループ
w1m0		movlw	0c7h		;199d
			movwf	cnt1		;
;			内周ループ
w1m1		nop					;
			nop					;5cycles*cnt1
			decfsz	cnt1,F		;2+5*198+4=996c/s
			goto	w1m1		;
;
			decfsz	cnt0,F		;
			goto	w1m0		;2+7*999+998=7993cycles
			nop
			return					;other=(3+4)cycles
									;Total 8000*0.125us=1ms


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			10us 基本ウェイト
;			呼び出し（call　w10u)も含めて、10usとなる。
;
;		clock	= 32MHZ(0.03125us)
;		1cycle	= 0.125us
;		10us	= 0.125us * 80cycles
;		使用変数　cnt0,cnt1
;		'goto','call','return'は2サイクル消費する
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

w10u
			movlb	0h
			movlw	018h		;18H=24
			movwf	cnt0		;
w10u0		decfsz	cnt0,F		;3*23+2=71
			goto	w10u0		;
			nop
			nop
			return				;2+3+71+2+2=80cycles

w05u
			movlw	0bh			;5us=0.125us*40cycles
			movwf	cnt0		;
w05u0		decfsz	cnt0,F		;ループ 2+3*10+2=34cycles
			goto	w05u0
			nop
			nop
			return				;2+34+2+2=40cycles=5us

w02u
			movlw	04h			;2us=0.125us*16cycles
			movwf	cnt0		;
w02u0		decfsz	cnt0,F		;2+3*3+2+1+2=16cycles
			goto	w02u0
			nop
			return				;
w01u
			nop					;1us=0.125us*8cycles
			nop					;2+4+2=8cycles
			nop
			nop
			return
;
			END

SWAP_BYTE
			movlw	wrk0		;データ保存
			clrf	wrk1		;変更データ先
			clrf	CYC1		;変更先ビット
			movlw	08h
			movwf	wrk2		;ループカウンタ
			movlw	07h
			movwf	CYC0		;変更元ビット

swblp		btfss	wrk0,CYC0
			goto	swbl		;bit=0
swbh		bsf		wrk1,CYC1	;bit=1処理
swben		decf	wrk2
			btfsc	STATUS,Z	;終了チェック
			bra		swben2
swben1		decf	CYC0		;
			incf	CYC1		;
			bra		swblp
swben2		movf	wrk1,W		;終了処理
			return
swbl		bsf		wrk1,CYC1	;bit=0処理
			bra		swben

