;リアルタイムクロックモジュール設定	bitメカ工房		2010-09-07(火)
;
;[プログラム概要]
;・リアルタイムクロックモジュール(RTC-8564)の初期設定を行えるようにする｡
;・ﾘｱﾙﾀｲﾑｸﾛｯｸﾓｼﾞｭｰﾙの現在時間を表示させ､時刻合わせ可能にする｡
;・PICの内蔵RCを使用して微調整して経過時間を出来るだけ正確に表示する｡
;　ﾘｱﾙﾀｲﾑｸﾛｯｸﾓｼﾞｭｰﾙと比較表示して､狂いの度合いが分かるようにする｡
;　(内蔵RC微調整の目安に使用する｡)
;・表示はLCDにて4ビットモード仕様とする｡
;
;---------------------------------------;
;	  1234567890123456
;	┌────────┐
;	│E     C 00:00 00│←経過時間 (PIC内蔵RC)
;	│      T 12:34 56│←現在時刻 (ﾘｱﾙﾀｲﾑｸﾛｯｸﾓｼﾞｭｰﾙ)
;	└────────┘
;		　時 分 秒
;---------------------------------------;
;
;(参考)
;・タイマー1のプリスケーラを最長【 8 】にした場合のオーバーフロータイム
;　4.19MHz動作として､1/4194304x4x256x256x[8]=0.5秒 (8はプリスケーラ値)
;　RCを微調整して4.194304MHzに近づける｡
;・タクトスイッチのチャタリングによる､意図しないボタン押し対策用とし
;　タイマー0を使用してチェックする｡
;　1/4194304x4x256x[256]=0.0625秒 (256はプリスケーラ値)
;
;[PIC選定仕様他]
; ･PIC16F88-I/P使用｡(秋月電子通商で200円/個)
; ･オシレーターは内蔵の4MHzを使用する｡
;　(1命令は1/4194304*4=0.000000954秒)
; ･MCLRは外配線を簡略するため内部接続モードとする｡
;
;			     ┌─┰─┐
;	時 +ﾀｸﾄSW4	 RA2 ┥	     ┝ RA1	LED
;	時 -ﾀｸﾄSW3	 RA3 ┥	     ┝ RA0	未使用
;	分 +ﾀｸﾄSW2	 RA4 ┥	     ┝ RA7	ﾘｱﾙﾀｲﾑｸﾛｯｸﾓｼﾞｭｰﾙ SDA
;	分 -ﾀｸﾄSW1	 RA5 ┥PIC   ┝ RA6	ﾘｱﾙﾀｲﾑｸﾛｯｸﾓｼﾞｭｰﾙ SCL
;	GND		 Vss ┥ 16F88┝ Vdd	5.0V
;	秒 00 ﾀｸﾄSW0	 RB0 ┥	     ┝ RB7	LCD_DB7
;	LCD_E		 RB1 ┥	     ┝ RB6	LCD_DB6
;	LCD_R/W		 RB2 ┥	     ┝ RB5	LCD_DB5
;	LCD_RS		 RB3 ┥	     ┝ RB4	LCD_DB4
;			     └───┘
;
;[プログラムの流れ概要]
;
;　	電源ON
;	↓
;	ﾀｸﾄSW0 押しているか？→YES	約1秒待つ(8564時計の安定)
;　　	↓NO			
;	経過時間カウントアップ←←←←←←←←←┐
;	↓					↑
;	8564時計読み出し			↑
;	↓					↑
;	LCD表示					↑
;	↓					↑
;	ﾀｸﾄSW 押しているか(時刻合わせ)→YES	↑
;	↓NO					↑
;	└→→→→→→→→→→→→→→→→→→→┘
;
;・ﾀｸﾄSW0を押しながら電源を入れると､ﾘｱﾙﾀｲﾑｸﾛｯｸﾓｼﾞｭｰﾙの初期設定となる｡
;　そのモードが選択された時はLEDを点灯する｡
;　それの確認後､ﾀｸﾄSW0を離すとプログラムが先に進む｡
;
;・経過時間のリセットは､通常の時計表示中に､ﾀｸﾄSW0を押した瞬間とする｡
;
;(その他)
;・call文は深くしないように心掛ける｡(後で分かり難くなるので｡)
;・8564時計のアクノリッジエラーがあった場合は､LCD左上に｢E｣表示をする｡
;　(表示のみで対処はしない)
;・8564時計のSCLは1.3μS以上必要なパターンがある｡PICのクロックを上げる場合､
;　注意が必要｡
;
;[凡例] (自分で分かりやすいように目印を付ける)
; m???:メモリー  r???:ラベル  s???:サブルーチン  v???:変数  ★:調整箇所など
;
;======= PICｺﾝﾌｨｷﾞｭﾚｰｼｮﾝ設定 ===========;(CVASM16アセンブラ用記述)

	include	'16f88.inc'

	fuses	_cp_off			;コードプロテクト→無効
	fuses	_ccp1_rb2		;PWMピン選定(_rb0or_rb3) 【バグ！？】
	fuses	_debug_off		;インサーキットデバックモード→無効
	fuses	_wrt_enable_off		;eeconのFlashメモリ可能→しない
	fuses	_cpd_off		;eepromのコードプロテクト→無効
	fuses	_lvp_off		;低電圧プログミング(5V)→無効
	fuses	_boden_off		;低電圧リセット(約4V以下)→無効
	fuses	_mclr_off		;MCLR端子(リセット)→設定しない
	fuses	_pwrte_on		;電源投入72ms間リセット→有効
	fuses	_wdt_off		;ウォッチドックタイマー→無効
	fuses	_intrc_io		;オシレーター設定→内蔵RC

;	fuses	_ieso_off		;内部/外部スイッチオーバーモード？
;	fuses	_fcmen_off		;フェイルセーフクロックモニター？

;　★★★↑cvasm16+PICkit2では手動設定修正必要あり！★★★

	id	'0100'			;Ver1.00

LCD_E		=	rb.1		;LCD表示信号用
LCD_RW		=	rb.2		;LCD表示信号用
LCD_RS		=	rb.3		;LCD表示信号用

;======= プログラムメモリー割当 ========;(メモリーは20hから)

mFREE_A		=	20h		;汎用カウンター(LCD初期)
mFREE_B		=	21h		;汎用カウンター(LCD初期)
mLCD_44		=	22h		;LCDデーター分割送信用

mBINA08		=	23h		;BCD計算用
mBINAXX		=	24h		;　　〃
mSHOW08		=	25h		;　　〃
mBCD_1		=	26h		;B→Dの1桁目(一の位)
mBCD_2		=	27h		;B→Dの2桁目(十の位)
mBCD_3		=	28h		;B→Dの3桁目(百の位､表示せず)

mC_SS		=	29h		;秒カウンター
mC_SX		=	2Ah		;経過時間 秒 1桁目表示用
mC_XS		=	2Bh		;経過時間 秒 2桁目表示用
mC_MM		=	2Ch		;分カウンター
mC_MX		=	2Dh		;経過時間 分 1桁目表示用
mC_XM		=	2Eh		;経過時間 分 2桁目表示用
mC_HH		=	2Fh		;時カウンター
mC_HX		=	30h		;経過時間 時 1桁目表示用
mC_XH		=	31h		;経過時間 時 2桁目表示用

mT_SX		=	32h		;現在時刻 秒 1桁目表示用
mT_XS		=	33h		;現在時刻 秒 2桁目表示用
mT_MX		=	34h		;現在時刻 分 1桁目表示用
mT_XM		=	35h		;現在時刻 分 2桁目表示用
mT_HX		=	36h		;現在時刻 時 1桁目表示用
mT_XH		=	37h		;現在時刻 時 2桁目表示用

mC_05		=	38h		;PIC内部0.5秒間隔チェック用

mT_SS		=	39h		;現在時刻 秒 時刻設定時の計算用
mT_MM		=	3Ah		;現在時刻 分 時刻設定時の計算用
mT_HH		=	3Bh		;現在時刻 時 時刻設定時の計算用
mERROR		=	3Ch		;8564時計書き込みエラーチェック用
mBTN_CHK	=	3Dh		;ﾀｸﾄSW チャタリング防止設定用

;=======プログラム初期設定==============;
;Bank 0
	clr	ra			;

	setb	ra.7			;ﾘｱﾙﾀｲﾑｸﾛｯｸﾓｼﾞｭｰﾙ SDAをHi(準備)
	setb	ra.6			;ﾘｱﾙﾀｲﾑｸﾛｯｸﾓｼﾞｭｰﾙ SCLをHi(準備)

	clr	rb			;
	mov	intcon,#00000000b	;割り込み設定
	mov	t1con,#01110001b	;
					;bit7…設定項目無し
					;bit6…システムクロック
					;bit5～4…プリスケールレート【8】
					;bit3…0 タイマー1専用オシレーター
					;bit2…0 外部クロック同期
					;bit1…0 タイマー1クロックソース選択
					;bit0…1 タイマー1オン

	setb	rp0			;ページ変更(Bank 1へ)
;Bank 1
	mov	option_reg,#10000111b	;
					;bit7…1 RBプルアップ【無】
					;bit6…割り込みエッジ
					;bit5…0 タイマー0は内蔵クロック使用
					;bit4…タイマー0エッジ
					;bit3…プリスケーラはタイマー0へ割当
					;bit2～0…プリスケールレート【256】

	mov	trisa,#00111100b	;RAの入出力ピン設定
	mov	trisb,#00000001b	;RBの入出力ピン設定
	mov	osccon,#01100010b	;内蔵オシレーター周波数を4MHzに設定
	mov	osctune,#00001101b	;★内蔵オシレーター周波数微調整
	mov	ansel,# 0000000b	;すべてデジタルピンに設定

	clrb	rp0			;ページ変更(Bank 0へ戻す)

;LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL;
;LCD初期設定
	clr	mFREE_A			;
	mov	mFREE_B,#64		;8MHzﾃｽﾄ#128から算出(#128/8MHzx4MHz)
rWAIT00
	djnz	mFREE_A,$		;LCD受付OKになる頃まで待つ
	djnz	mFREE_B,rWAIT00		;(8MHzの場合で計算すると0.05秒くらい)

	mov	rb,#00100010b		;4ビットモード､+E+PW
	clrb	LCD_E			;これで4ビットモードになる
;↓4
	mov	mLCD_44,#00101000b	;(6)ファンクションセット設定
	call	sLCD_E_			;N=1(1/16)にすること

	mov	mLCD_44,#00001100b	;(4)表示オン/オフコントロール
	call	sLCD_E_			;

;---------------------------------------;

	clr	tmr1l			;タイマー1 下位8bit
	clr	tmr1h			;タイマー1 上位8bit
	setb	tmr1if			;約0.5秒

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;
	jnb	rb.0,r8564_Z		;8564時計 初期設定へジャンプ
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;
rC_CLR
;	clr	mC_SS			;経過時間 秒 クリア
;	clr	mC_MM			;経過時間 分 クリア
;	clr	mC_HH			;経過時間 時 クリア

;キーONスタート調整
	mov	mC_SS,#59		;
	mov	mC_MM,#59		;
	mov	mC_MM,#59		;

	mov	mC_05,#255		;PIC内部0.5秒間隔チェック用
	setb	ra.1			;LED●
	mov	mERROR,#' '		;8564時計書き込みエラー表示部用
	clr	mBTN_CHK		;ﾀｸﾄSWチェック用





;↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ;
;***[ メインループ ]********************;
rREPEAT

	jnb	tmr1if,rNO_05S		;約0.5秒間隔で更新
	clrb	tmr1if			;約0.5秒間隔旗クリア
	xor	ra,#00000010b		;LED点滅●○

	call	sCOUNT_T		;経過時間アップカウント
r8564_R
	call	sT_READ			;現在時刻読み込み
	call	sLCD_GO			;LCD表示

rNO_05S
	snb	rb.0			;
	clrb	mBTN_CHK.0		;ﾀｸﾄSW0
	snb	ra.2			;
	clrb	mBTN_CHK.4		;ﾀｸﾄSW4
	snb	ra.3			;
	clrb	mBTN_CHK.3		;ﾀｸﾄSW3
	snb	ra.4			;
	clrb	mBTN_CHK.2		;ﾀｸﾄSW2
	snb	ra.5			;
	clrb	mBTN_CHK.1		;ﾀｸﾄSW0

	test	mBTN_CHK		;
	jnz	rREPEAT			;

rBTN_0
	jb	rb.0,rBTN_4		;時計｢秒｣ 00リセット
	clr	tmr0			;チャタリング防止
	clrb	tmr0if			;約0.0625秒
	jnb	tmr0if,$		;
	jnb	rb.0,rT_S_00		;
rBTN_4
	jb	ra.2,rBTN_3		;時計｢時｣ +1
	clr	tmr0			;
	clrb	tmr0if			;
	jnb	tmr0if,$		;
	jnb	ra.2,rT_H_UP		;
rBTN_3
	jb	ra.3,rBTN_2		;時計｢時｣ -1
	clr	tmr0			;
	clrb	tmr0if			;
	jnb	tmr0if,$		;
	jnb	ra.3,rT_H_DN		;
rBTN_2
	jb	ra.4,rBTN_1		;時計｢分｣ +1
	clr	tmr0			;
	clrb	tmr0if			;
	jnb	tmr0if,$		;
	jnb	ra.4,rT_M_UP		;
rBTN_1
	jb	ra.5,rBTN_E		;時計｢分｣ -1
	clr	tmr0			;
	clrb	tmr0if			;
	jnb	tmr0if,$		;
	jnb	ra.5,rT_M_DN		;
rBTN_E

	jmp	rREPEAT			;

;***[ メインループここまで ]************;
;↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ;





rT_S_00
	setb	mBTN_CHK.0		;00000001b
;TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT;
;*** 8564時計｢秒｣リセット 0秒書き込み ***
;TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT;

;***PICから開始条件送信***
	clrb	ra.7			;SDAをLoに変化させる
	clrb	ra.6			;*SDLをLoにして1区切りとする

;PICからスレーブアドレスをR/Wビット書き込みモードで送信
;1010 0010b
	call	s8564_W1		;
	call	s8564_W0		;
	call	s8564_W1		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W1		;
	call	s8564_W0		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むアドレスを送信
;0000 0000b (control1)
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むデーターを送信
;0	0010 0000b (Control1)
	call	s8564_W0		;STOP
	call	s8564_W0		;
	call	s8564_W1		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むデーターを送信
;1	0000 0000b (Control2)
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むデーターを送信
;2	0000 0000b (Seconds)
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	sACK_A			;アクノリッジ確認

;***PICから停止条件送信***
	clrb	ra.7			;SDAをLo(準備)
	setb	ra.6			;SCLをHi(準備)
	setb	ra.7			;SDAをHiに変化させる


;CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC;
;*** 経過時間リセット ***
;CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC;
	clr	mC_SS			;経過時間 秒 クリア
	clr	mC_MM			;経過時間 分 クリア
	clr	mC_HH			;経過時間 時 クリア
	clr	mC_05			;

;ボタン押し直ぐに｢00｣表示する
	call	sCOUNT_T		;経過時間アップカウント
	call	sT_READ			;現在時刻読み込み
	call	sLCD_GO			;LCD表示

	clr	tmr1l			;タイマー1 下位8bit
	clr	tmr1h			;タイマー1 上位8bit
	clrb	tmr1if			;約0.5秒

	jnb	tmr1if,$		;8564時計は0.5秒早くスタートする
	clrb	tmr1if			;のでここで約0.5秒待つ調整する

;	clr	mC_05			;



;***PICから開始条件送信***
	clrb	ra.7			;SDAをLoに変化させる
	clrb	ra.6			;*SDLをLoにして1区切りとする

;PICからスレーブアドレスをR/Wビット書き込みモードで送信
;1010 0010b
	call	s8564_W1		;
	call	s8564_W0		;
	call	s8564_W1		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W1		;
	call	s8564_W0		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むアドレスを送信
;0000 0000b (control1)
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むデーターを送信
;0	0010 0000b (Control1)
	call	s8564_W0		;START
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	sACK_A			;アクノリッジ確認

;***PICから停止条件送信***
	clrb	ra.7			;SDAをLo(準備)
	setb	ra.6			;SCLをHi(準備)
	setb	ra.7			;SDAをHiに変化させる


	jmp	rREPEAT			;

;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^;





rT_H_UP
	setb	mBTN_CHK.4		;00010000b
;TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT;
;*** 8564時計｢時｣ +1書き込み ***
;TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT;
;桁上がりパターンチェック
	cjne	mT_HH,#00001001b,rTH_U1	;9時か？
	mov	mT_HH,#00010000b	;10
	jmp	rTH_UE			;
rTH_U1
	cjne	mT_HH,#00011001b,rTH_U2	;19時か？
	mov	mT_HH,#00100000b	;20
	jmp	rTH_UE			;
rTH_U2
	cjne	mT_HH,#00100011b,rTH_UI	;23時か？
	clr	mT_HH			;0
	jmp	rTH_UE			;
rTH_UI
	inc	mT_HH			;+1
rTH_UE


;***PICから開始条件送信***
	clrb	ra.7			;SDAをLoに変化させる
	clrb	ra.6			;*SDLをLoにして1区切りとする

;PICからスレーブアドレスをR/Wビット書き込みモードで送信
;1010 0010b
	call	s8564_W1		;
	call	s8564_W0		;
	call	s8564_W1		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W1		;
	call	s8564_W0		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むアドレスを送信
;0000 0100b (時)
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W1		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むデーターを送信
;--XX XXXXb
;7
	clrb	ra.7			;0(データー)
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
;6
	clrb	ra.7			;0(データー)
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
;5
	clrb	ra.7			;0(データー)
	snb	mT_HH.5			;
	setb	ra.7			;1
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
;4
	clrb	ra.7			;0(データー)
	snb	mT_HH.4			;
	setb	ra.7			;1
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
;3
	clrb	ra.7			;0(データー)
	snb	mT_HH.3			;
	setb	ra.7			;1
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
;2
	clrb	ra.7			;0(データー)
	snb	mT_HH.2			;
	setb	ra.7			;1
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
;1
	clrb	ra.7			;0(データー)
	snb	mT_HH.1			;
	setb	ra.7			;1
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
;0
	clrb	ra.7			;0(データー)
	snb	mT_HH.0			;
	setb	ra.7			;1
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする

	call	sACK_A			;アクノリッジ確認

;***PICから停止条件送信***
	clrb	ra.7			;SDAをLo(準備)
	setb	ra.6			;SCLをHi(準備)
	setb	ra.7			;SDAをHiに変化させる

	jmp	r8564_R			;再表示へ

;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^;





rT_H_DN
	setb	mBTN_CHK.3		;00001000b
;TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT;
;*** 8564時計｢時｣ -1書き込み ***
;TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT;

;桁下がりパターンチェック
	cjne	mT_HH,#00010000b,rTH_D1	;10時か？
	mov	mT_HH,#00001001b	;9
	jmp	rTH_DE			;
rTH_D1
	cjne	mT_HH,#00100000b,rTH_D2	;20時か？
	mov	mT_HH,#00011001b	;19
	jmp	rTH_UE			;
rTH_D2
	test	mT_HH			;0時か？
	jnz	rTH_DD			;
	mov	mT_HH,#00100011b	;23
	jmp	rTH_DE			;
rTH_DD
	dec	mT_HH			;-1
rTH_DE


;***PICから開始条件送信***
	clrb	ra.7			;SDAをLoに変化させる
	clrb	ra.6			;*SDLをLoにして1区切りとする

;PICからスレーブアドレスをR/Wビット書き込みモードで送信
;1010 0010b
	call	s8564_W1		;
	call	s8564_W0		;
	call	s8564_W1		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W1		;
	call	s8564_W0		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むアドレスを送信
;0000 0100b (時)
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W1		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むデーターを送信
;--XX XXXXb
;7
	clrb	ra.7			;0(データー)
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
;6
	clrb	ra.7			;0(データー)
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
;5
	clrb	ra.7			;0(データー)
	snb	mT_HH.5			;
	setb	ra.7			;1
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
;4
	clrb	ra.7			;0(データー)
	snb	mT_HH.4			;
	setb	ra.7			;1
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
;3
	clrb	ra.7			;0(データー)
	snb	mT_HH.3			;
	setb	ra.7			;1
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
;2
	clrb	ra.7			;0(データー)
	snb	mT_HH.2			;
	setb	ra.7			;1
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
;1
	clrb	ra.7			;0(データー)
	snb	mT_HH.1			;
	setb	ra.7			;1
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
;0
	clrb	ra.7			;0(データー)
	snb	mT_HH.0			;
	setb	ra.7			;1
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする

	call	sACK_A			;アクノリッジ確認

;***PICから停止条件送信***
	clrb	ra.7			;SDAをLo(準備)
	setb	ra.6			;SCLをHi(準備)
	setb	ra.7			;SDAをHiに変化させる

	jmp	r8564_R			;再表示へ

;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^;





rT_M_UP
	setb	mBTN_CHK.2		;00000100b
;TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT;
;*** 8564時計｢分｣ +1書き込み ***
;TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT;

;桁上がりパターンチェック
	cjne	mT_MM,#00001001b,rTM_U1	;9分か？
	mov	mT_MM,#00010000b	;10
	jmp	rTM_UE			;
rTM_U1
	cjne	mT_MM,#00011001b,rTM_U2	;19分か？
	mov	mT_MM,#00100000b	;20
	jmp	rTM_UE			;
rTM_U2
	cjne	mT_MM,#00101001b,rTM_U3	;29分か？
	mov	mT_MM,#00110000b	;30
	jmp	rTM_UE			;
rTM_U3
	cjne	mT_MM,#00111001b,rTM_U4	;39分か？
	mov	mT_MM,#01000000b	;40
	jmp	rTM_UE			;
rTM_U4
	cjne	mT_MM,#01001001b,rTM_U5	;49分か？
	mov	mT_MM,#01010000b	;50
	jmp	rTM_UE			;
rTM_U5
	cjne	mT_MM,#01011001b,rTM_UI	;59分か？
	clr	mT_MM			;0
	jmp	rTM_UE			;
rTM_UI
	inc	mT_MM			;+1
rTM_UE


;***PICから開始条件送信***
	clrb	ra.7			;SDAをLoに変化させる
	clrb	ra.6			;*SDLをLoにして1区切りとする

;PICからスレーブアドレスをR/Wビット書き込みモードで送信
;1010 0010b
	call	s8564_W1		;
	call	s8564_W0		;
	call	s8564_W1		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W1		;
	call	s8564_W0		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むアドレスを送信
;0000 0011b (分)
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W1		;
	call	s8564_W1		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むデーターを送信
;-XXX XXXXb
;7
	clrb	ra.7			;0(データー)
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
;6
	clrb	ra.7			;0(データー)
	snb	mT_MM.6			;
	setb	ra.7			;1
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
;5
	clrb	ra.7			;0(データー)
	snb	mT_MM.5			;
	setb	ra.7			;1
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
;4
	clrb	ra.7			;0(データー)
	snb	mT_MM.4			;
	setb	ra.7			;1
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
;3
	clrb	ra.7			;0(データー)
	snb	mT_MM.3			;
	setb	ra.7			;1
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
;2
	clrb	ra.7			;0(データー)
	snb	mT_MM.2			;
	setb	ra.7			;1
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
;1
	clrb	ra.7			;0(データー)
	snb	mT_MM.1			;
	setb	ra.7			;1
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
;0
	clrb	ra.7			;0(データー)
	snb	mT_MM.0			;
	setb	ra.7			;1
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする

	call	sACK_A			;アクノリッジ確認

;***PICから停止条件送信***
	clrb	ra.7			;SDAをLo(準備)
	setb	ra.6			;SCLをHi(準備)
	setb	ra.7			;SDAをHiに変化させる

	jmp	r8564_R			;再表示へ

;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^;





rT_M_DN
	setb	mBTN_CHK.1		;00000010b
;TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT;
;*** 8564時計｢分｣ -1書き込み ***
;TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT;

;桁上がりパターンチェック
	cjne	mT_MM,#00010000b,rTM_D1	;10分か？
	mov	mT_MM,#00001001b	;9
	jmp	rTM_DE			;
rTM_D1
	cjne	mT_MM,#00100000b,rTM_D2	;20分か？
	mov	mT_MM,#00011001b	;19
	jmp	rTM_DE			;
rTM_D2
	cjne	mT_MM,#00110000b,rTM_D3	;30分か？
	mov	mT_MM,#00101001b	;29
	jmp	rTM_DE			;
rTM_D3
	cjne	mT_MM,#01000000b,rTM_D4	;40分か？
	mov	mT_MM,#00111001b	;39
	jmp	rTM_DE			;
rTM_D4
	cjne	mT_MM,#01010000b,rTM_D5	;50分か？
	mov	mT_MM,#01001001b	;49
	jmp	rTM_DE			;
rTM_D5
	test	mT_MM			;0分か？
	jnz	rTM_DD			;
	mov	mT_MM,#01011001b	;59
	jmp	rTM_DE			;
rTM_DD
	dec	mT_MM			;-1
rTM_DE


;***PICから開始条件送信***
	clrb	ra.7			;SDAをLoに変化させる
	clrb	ra.6			;*SDLをLoにして1区切りとする

;PICからスレーブアドレスをR/Wビット書き込みモードで送信
;1010 0010b
	call	s8564_W1		;
	call	s8564_W0		;
	call	s8564_W1		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W1		;
	call	s8564_W0		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むアドレスを送信
;0000 0011b (分)
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W1		;
	call	s8564_W1		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むデーターを送信
;-XXX XXXXb
;7
	clrb	ra.7			;0(データー)
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
;6
	clrb	ra.7			;0(データー)
	snb	mT_MM.6			;
	setb	ra.7			;1
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
;5
	clrb	ra.7			;0(データー)
	snb	mT_MM.5			;
	setb	ra.7			;1
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
;4
	clrb	ra.7			;0(データー)
	snb	mT_MM.4			;
	setb	ra.7			;1
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
;3
	clrb	ra.7			;0(データー)
	snb	mT_MM.3			;
	setb	ra.7			;1
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
;2
	clrb	ra.7			;0(データー)
	snb	mT_MM.2			;
	setb	ra.7			;1
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
;1
	clrb	ra.7			;0(データー)
	snb	mT_MM.1			;
	setb	ra.7			;1
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
;0
	clrb	ra.7			;0(データー)
	snb	mT_MM.0			;
	setb	ra.7			;1
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする

	call	sACK_A			;アクノリッジ確認

;***PICから停止条件送信***
	clrb	ra.7			;SDAをLo(準備)
	setb	ra.6			;SCLをHi(準備)
	setb	ra.7			;SDAをHiに変化させる

	jmp	r8564_R			;再表示へ

;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^;





r8564_Z
;TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT;
;*** 8564時計 初期設定送信 ***
;TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT;

;8564時計の安定に1秒待つ
	jnb	tmr1if,$		;約0.5秒
	clrb	tmr1if			;
	jnb	tmr1if,$		;約0.5秒
	clrb	tmr1if			;

	setb	ra.1			;LED●

	clr	mERROR			;アクノリッジエラーチェック用

;電源ON時は全レジスタの設定が必要｡
;存在しない時刻データーは正常動作できない原因になるので注意｡
;後でcall記述を使い回しできるように､出来るだけ｢0｣､｢1｣で設定しておく｡
;8564時計を電源OFF状態から読み込んでみたところ､0時0分0秒だった｡
;　初期設定したことを区別するため､初期設定時は1時1分1秒に設定する｡

;00	0000 0000b	Control1
;01	0000 0000b	Control2
;02	0000 0001b	秒		01
;03	0000 0001b	分		01
;04	0000 0001b	時		01
;05	0000 0001b	日		01
;06	0000 0000b	曜		日曜
;07	0000 0001b	月		01
;08	0000 0001b	年		01
;09	1000 0001b	ｱﾗｰﾑ 分		無
;0A	1000 0001b	ｱﾗｰﾑ 時		無
;0B	1000 0001b	ｱﾗｰﾑ 日		無
;0C	1000 0001b	ｱﾗｰﾑ 曜		無
;0D	0000 0000b	CLKOUT		無
;0E	0000 0000b	Timer control	無
;0F	0000 0001b	Timer		001

;---------------------------------------

;*** PICから開始条件送信 ***
	clrb	ra.7			;SDAをHi→Loに変化させる
	clrb	ra.6			;*SDLをLoにして1区切りとする

;PICからスレーブアドレスをR/Wビット書き込みモードで送信
;1010 0010b
	call	s8564_W1		;
	call	s8564_W0		;
	call	s8564_W1		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W1		;
	call	s8564_W0		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込む｢アドレス｣を送信
;0000 0000b (Control1)
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むデーターを送信
;0	0000 0000b (Control1)
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むデーターを送信
;1	0000 0000b (Control2)
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むデーターを送信
;2	(Seconds)
	call	s8564_W0		;0
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	s8564_W0		;1
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W1		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むデーターを送信
;3	(Minutes)
	call	s8564_W0		;0
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	s8564_W0		;1
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W1		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むデーターを送信
;4	(Hours)
	call	s8564_W0		;0
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	s8564_W0		;1
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W1		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むデーターを送信
;5	0000 0001b (日)
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W1		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むデーターを送信
;6	0000 0000b (曜日)
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むデーターを送信
;7	0000 0001b (月)
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W1		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むデーターを送信
;8	0000 0001b (年)
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W1		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むデーターを送信
;9	1000 0001b (アラーム 分)
	call	s8564_W1		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W1		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むデーターを送信
;10	1000 0001b (アラーム 時)
	call	s8564_W1		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W1		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むデーターを送信
;11	1000 0001b (アラーム 日)
	call	s8564_W1		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W1		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むデーターを送信
;12	1000 0001b (アラーム 曜)
	call	s8564_W1		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W1		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むデーターを送信
;13	0000 0000b (CLKOUT)
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むデーターを送信
;14	0000 0000b (Timer control)
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	sACK_A			;アクノリッジ確認

;PICから8564時計に書き込むデーターを送信
;15	0000 0001b (Timer)
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W1		;

	call	sACK_A			;アクノリッジ確認


;*** PICから停止条件送信 ***
	clrb	ra.7			;SDAをLo(準備)
	setb	ra.6			;SCLをHi(準備)
	setb	ra.7			;SDAをHiに変化させる

;--- リターン前処理 ----
	jnb	rb.0,$			;ﾀｸﾄSW0を離すまで待つ
	clrb	ra.1			;LED○

	jmp	rC_CLR			;

;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^;





sCOUNT_T
;CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC;
;sss 経過時間カウント サブルーチン sss
;CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC;
	inc	mC_05			;+1
	jb	mC_05.0,rC_BNC		;0.5 or 1 秒判定

	inc	mC_SS			;+1
	cjb	mC_SS,#60,rC_BNC	;
	clr	mC_SS			;

	inc	mC_MM			;+1
	cjb	mC_MM,#60,rC_BNC	;
	clr	mC_MM			;

	inc	mC_HH			;+1
	cjb	mC_HH,#24,rC_BNC	;
	clr	mC_HH			;
rC_BNC
;UPカウント時計の表示変換
	mov	mBINA08,mC_SS		;【秒】
	call	sBCDCAL			;BCD計算へ
	mov	mC_XS,mBCD_2		;
	mov	mC_SX,mBCD_1		;
	add	mC_XS,#48		;+48
	add	mC_SX,#48		;+48

	mov	mBINA08,mC_MM		;【分】
	call	sBCDCAL			;BCD計算へ
	mov	mC_XM,mBCD_2		;
	mov	mC_MX,mBCD_1		;
	add	mC_XM,#48		;+48
	add	mC_MX,#48		;+48

	mov	mBINA08,mC_HH		;【時】
	call	sBCDCAL			;BCD計算へ
	mov	mC_XH,mBCD_2		;
	mov	mC_HX,mBCD_1		;
	add	mC_XH,#48		;+48
	add	mC_HX,#48		;+48

	ret				;



;TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT;
;sss 8564時計 サブルーチン sss
;TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT;

sT_READ
;TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT;
;*** 8564時計から受信 ***
;TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT;

;*** PICから開始条件送信 ***
	clrb	ra.7			;SDAをLoに変化させる
	clrb	ra.6			;*SDLをLoにして1区切りとする

;PICからスレーブアドレスをR/Wビット書き込みモードで送信
;1010 0010b
	call	s8564_W1		;
	call	s8564_W0		;
	call	s8564_W1		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W1		;
	call	s8564_W0		;

	call	sACK_A			;アクノリッジ確認

;PICが8564時計から読み出すアドレスを送信
;0000 0010b (Seconds)
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W1		;
	call	s8564_W0		;

	call	sACK_A			;アクノリッジ確認

;*** PICから開始条件｢再｣送信 ***
	setb	ra.7			;SDAをHi(準備)
	setb	ra.6			;SCLをHi(準備)
	clrb	ra.7			;SDAをLoに変化させる
	clrb	ra.6			;*SDLをLoにして1区切りとする

;PICからスレーブアドレスをR/Wビット読み出しモードで送信
;1010 0011b
	call	s8564_W1		;
	call	s8564_W0		;
	call	s8564_W1		;
	call	s8564_W0		;

	call	s8564_W0		;
	call	s8564_W0		;
	call	s8564_W1		;
	call	s8564_W1		;

	call	sACK_A			;アクノリッジ確認

;---------------------------------------;
;ここからPICがレシーバー､8564時計がトランスミッタとなる｡
;---------------------------------------;
	setb	rp0			;ページ変更(Bank 1へ)
;Bank 1
	setb	trisa.7			;｢1｣ RA7を入力に変更
	clrb	rp0			;ページ変更(Bank 0へ戻す)

;---------------------------------------;
;*** ｢秒｣ 読み出し格納 ***
;---------------------------------------;
	clr	mT_XS			;
	clr	mT_SX			;
;7bit
	setb	ra.6			;SCLをHi(読み出し開始)
	snb	ra.7			;RA7がLoならスキップ
	setb	mT_XS.3			;
	clrb	ra.6			;SCLをLo
;6bit
	nop				;1.3μS確保
	setb	ra.6			;SCLをHi(読み出し開始)
	snb	ra.7			;RA7がLoならスキップ
	setb	mT_XS.2			;
	clrb	ra.6			;SCLをLo
;5bit
	nop				;1.3μS確保
	setb	ra.6			;SCLをHi(読み出し開始)
	snb	ra.7			;RA7がLoならスキップ
	setb	mT_XS.1			;
	clrb	ra.6			;SCLをLo
;4bit
	nop				;1.3μS確保
	setb	ra.6			;SCLをHi(読み出し開始)
	snb	ra.7			;RA7がLoならスキップ
	setb	mT_XS.0			;
	clrb	ra.6			;SCLをLo
;3bit
	nop				;1.3μS確保
	setb	ra.6			;SCLをHi(読み出し開始)
	snb	ra.7			;RA7がLoならスキップ
	setb	mT_SX.3			;
	clrb	ra.6			;SCLをLo
;2bit
	nop				;1.3μS確保
	setb	ra.6			;SCLをHi(読み出し開始)
	snb	ra.7			;RA7がLoならスキップ
	setb	mT_SX.2			;
	clrb	ra.6			;SCLをLo
;1bit
	nop				;1.3μS確保
	setb	ra.6			;SCLをHi(読み出し開始)
	snb	ra.7			;RA7がLoならスキップ
	setb	mT_SX.1			;
	clrb	ra.6			;SCLをLo
;0bit
	nop				;1.3μS確保
	setb	ra.6			;SCLをHi(読み出し開始)
	snb	ra.7			;RA7がLoならスキップ
	setb	mT_SX.0			;
	clrb	ra.6			;SCLをLo

	call	sACK_B			;PICからアクノリッジ送信

;---------------------------------------;
;***　｢分｣ 読み出し格納 ***
;---------------------------------------;
	clr	mT_XM			;
	clr	mT_MX			;
;7bit
	setb	ra.6			;SCLをHi(読み出し開始)
	snb	ra.7			;RA7がLoならスキップ
	setb	mT_XM.3			;
	clrb	ra.6			;SCLをLo
;6bit
	nop				;1.3μS確保
	setb	ra.6			;SCLをHi(読み出し開始)
	snb	ra.7			;RA7がLoならスキップ
	setb	mT_XM.2			;
	clrb	ra.6			;SCLをLo
;5bit
	nop				;1.3μS確保
	setb	ra.6			;SCLをHi(読み出し開始)
	snb	ra.7			;RA7がLoならスキップ
	setb	mT_XM.1			;
	clrb	ra.6			;SCLをLo
;4bit
	nop				;1.3μS確保
	setb	ra.6			;SCLをHi(読み出し開始)
	snb	ra.7			;RA7がLoならスキップ
	setb	mT_XM.0			;
	clrb	ra.6			;SCLをLo
;3bit
	nop				;1.3μS確保
	setb	ra.6			;SCLをHi(読み出し開始)
	snb	ra.7			;RA7がLoならスキップ
	setb	mT_MX.3			;
	clrb	ra.6			;SCLをLo
;2bit
	nop				;1.3μS確保
	setb	ra.6			;SCLをHi(読み出し開始)
	snb	ra.7			;RA7がLoならスキップ
	setb	mT_MX.2			;
	clrb	ra.6			;SCLをLo
;1bit
	nop				;1.3μS確保
	setb	ra.6			;SCLをHi(読み出し開始)
	snb	ra.7			;RA7がLoならスキップ
	setb	mT_MX.1			;
	clrb	ra.6			;SCLをLo
;0bit
	nop				;1.3μS確保
	setb	ra.6			;SCLをHi(読み出し開始)
	snb	ra.7			;RA7がLoならスキップ
	setb	mT_MX.0			;
	clrb	ra.6			;SCLをLo

	call	sACK_B			;PICからアクノリッジ送信

;---------------------------------------;
;*** ｢時｣ 読み出し格納 ***
;---------------------------------------;
	clr	mT_XH			;
	clr	mT_HX			;
;7bit
	setb	ra.6			;SCLをHi(読み出し開始)
	snb	ra.7			;RA7がLoならスキップ
	setb	mT_XH.3			;
	clrb	ra.6			;SCLをLo
;6bit
	nop				;1.3μS確保
	setb	ra.6			;SCLをHi(読み出し開始)
	nop
	snb	ra.7			;RA7がLoならスキップ
	setb	mT_XH.2			;
	clrb	ra.6			;SCLをLo
;5bit
	nop				;1.3μS確保
	setb	ra.6			;SCLをHi(読み出し開始)
	snb	ra.7			;RA7がLoならスキップ
	setb	mT_XH.1			;
	clrb	ra.6			;SCLをLo
;4bit
	nop				;1.3μS確保
	setb	ra.6			;SCLをHi(読み出し開始)
	snb	ra.7			;RA7がLoならスキップ
	setb	mT_XH.0			;
	clrb	ra.6			;SCLをLo
;3bit
	nop				;1.3μS確保
	setb	ra.6			;SCLをHi(読み出し開始)
	snb	ra.7			;RA7がLoならスキップ
	setb	mT_HX.3			;
	clrb	ra.6			;SCLをLo
;2bit
	nop				;1.3μS確保
	setb	ra.6			;SCLをHi(読み出し開始)
	snb	ra.7			;RA7がLoならスキップ
	setb	mT_HX.2			;
	clrb	ra.6			;SCLをLo
;1bit
	nop				;1.3μS確保
	setb	ra.6			;SCLをHi(読み出し開始)
	snb	ra.7			;RA7がLoならスキップ
	setb	mT_HX.1			;
	clrb	ra.6			;SCLをLo
;0bit
	nop				;1.3μS確保
	setb	ra.6			;SCLをHi(読み出し開始)
	snb	ra.7			;RA7がLoならスキップ
	setb	mT_HX.0			;
	clrb	ra.6			;SCLをLo

;---------------------------------------;
;*** PICからアクノリッジ｢1｣送信 ***
;---------------------------------------;
	setb	ra.7			;
	setb	rp0			;ページ変更(Bank 1へ)
;Bank 1
	clrb	trisa.7			;｢0｣ RA7を出力(Lo)に変更
	clrb	rp0			;ページ変更(Bank 0へ戻す)

	setb	ra.6			;SCLをHi
	clrb	ra.6			;SCLをLo

;*** PICから停止条件送信 ***
	clrb	ra.7			;SDAをLo(準備)
	setb	ra.6			;SCLをHi(準備)
	setb	ra.7			;SDAをHiに変化させる

;=======================================;
;不定ビットのマスク
	and	mT_XS,#00000111b	;VLビットマスク
	and	mT_XM,#00000111b	;読み出し不定ビットマスク
	and	mT_XH,#00000011b	;読み出し不定ビットマスク

;---------------------------------------;
;*** 8564時計時間変更用 ***
;---------------------------------------;
	clr	mT_HH			;
	or	mT_HH,mT_HX		;格納コピー
	swap	mT_XH			;4bit入替
	or	mT_HH,mT_XH		;格納コピー
	swap	mT_XH			;4bit入替(戻し)

	clr	mT_MM			;
	or	mT_MM,mT_MX		;格納コピー
	swap	mT_XM			;4bit入替
	or	mT_MM,mT_XM		;格納コピー
	swap	mT_XM			;4bit入替(戻し)

;---------------------------------------;
;8564時計のLCD表示変換
	add	mT_XS,#48		;+48
	add	mT_SX,#48		;+48

	add	mT_XM,#48		;+48
	add	mT_MX,#48		;+48

	add	mT_XH,#48		;+48
	add	mT_HX,#48		;+48

	ret				;

;sssssss bit｢0｣送信 ssssssssssssssssssss;
s8564_W0
	clrb	ra.7			;0(データー)
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
	ret				;

;sssssss bit｢1｣送信 ssssssssssssssssssss;
s8564_W1
	setb	ra.7			;1(データー)
	setb	ra.6			;SCLをHi(送信)
	clrb	ra.6			;*SDLをLoにして1区切りとする
	ret				;

;sssssss アクノリッジ確認 ssssssssssssss;
sACK_A
	setb	rp0			;ページ変更(Bank 1へ)
;Bank 1
	setb	trisa.7			;｢1｣ RA7を入力に変更
	clrb	rp0			;ページ変更(Bank 0へ戻す)

	setb	ra.6			;SCL

	jnb	ra.7,rNO_ERR		;RA7がLoならジャンプ
	mov	mERROR,#'E'		;エラー表示
rNO_ERR
	clrb	ra.6			;*SDLをLoにして1区切りとする

	setb	rp0			;ページ変更(Bank 1へ)
;Bank 1
	clrb	trisa.7			;｢0｣ RA7を出力に変更
	clrb	rp0			;ページ変更(Bank 0へ戻す)

	ret				;

;sssssss PICアクノリッジ送信 sssssssssss;
sACK_B
	clrb	ra.7			;
	setb	rp0			;ページ変更(Bank 1へ)
;Bank 1
	clrb	trisa.7			;｢0｣ RA7を出力(Lo)に変更
	clrb	rp0			;ページ変更(Bank 0へ戻す)

	setb	ra.6			;SCLをHi
	clrb	ra.6			;SCLをLo

	setb	rp0			;ページ変更(Bank 1へ)
;Bank 1
	setb	trisa.7			;｢1｣ RA7を入力に変更
	clrb	rp0			;ページ変更(Bank 0へ戻す)

	ret				;



;LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL;
;sss LCDサブルーチン sss
;LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL;

sLCD_GO

;(LCD自作キャラクター登録…無し)
;[LCD文字位置] (16進)
;　   |01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|
;　---+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
;　01 |80|81|82|83|84|85|86|87|88|89|8A|8B|8C|8D|8E|8F|
;　---+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
;　02 |C0|C1|C2|C3|C4|C5|C6|C7|C8|C9|CA|CB|CC|CD|CE|CF|
;　---+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
;LCDキャラクターコード送信(表示)
	mov	mLCD_44,#80h		;1行目1桁目
	call	sLCD_E_			;

	mov	mLCD_44,mERROR		;1
	call	sLCD_RE			;
	mov	mLCD_44,#' '		;2
	call	sLCD_RE			;
	mov	mLCD_44,#' '		;3
	call	sLCD_RE			;
	mov	mLCD_44,#' '		;4
	call	sLCD_RE			;
	mov	mLCD_44,#' '		;5
	call	sLCD_RE			;
	mov	mLCD_44,#' '		;6
	call	sLCD_RE			;
	mov	mLCD_44,#'C'		;7
	call	sLCD_RE			;
	mov	mLCD_44,#' '		;8
	call	sLCD_RE			;
	mov	mLCD_44,mC_XH		;9
	call	sLCD_RE			;
	mov	mLCD_44,mC_HX		;10
	call	sLCD_RE			;
	mov	mLCD_44,#':'		;11
	call	sLCD_RE			;
	mov	mLCD_44,mC_XM		;12
	call	sLCD_RE			;
	mov	mLCD_44,mC_MX		;13
	call	sLCD_RE			;
	mov	mLCD_44,#' '		;14
	call	sLCD_RE			;
	mov	mLCD_44,mC_XS		;15
	call	sLCD_RE			;
	mov	mLCD_44,mC_SX		;16
	call	sLCD_RE			;

	mov	mLCD_44,#0C0h		;2行目1桁目
	call	sLCD_E_			;

	mov	mLCD_44,#' '		;1
	call	sLCD_RE			;
	mov	mLCD_44,#' '		;2
	call	sLCD_RE			;
	mov	mLCD_44,#' '		;3
	call	sLCD_RE			;
	mov	mLCD_44,#' '		;4
	call	sLCD_RE			;
	mov	mLCD_44,#' '		;5
	call	sLCD_RE			;
	mov	mLCD_44,#' '		;6
	call	sLCD_RE			;
	mov	mLCD_44,#'T'		;7
	call	sLCD_RE			;
	mov	mLCD_44,#' '		;8
	call	sLCD_RE			;
	mov	mLCD_44,mT_XH		;9
	call	sLCD_RE			;
	mov	mLCD_44,mT_HX		;10
	call	sLCD_RE			;
	mov	mLCD_44,#':'		;11
	call	sLCD_RE			;
	mov	mLCD_44,mT_XM		;12
	call	sLCD_RE			;
	mov	mLCD_44,mT_MX		;13
	call	sLCD_RE			;
	mov	mLCD_44,#' '		;14
	call	sLCD_RE			;
	mov	mLCD_44,mT_XS		;15
	call	sLCD_RE			;
	mov	mLCD_44,mT_SX		;16
	call	sLCD_RE			;

	ret				;

;sssssss LCD E 送信関係 ssssssssssssssss;
sLCD_E_
	call	sBUSY7			;LCD受付OKになるまで待つ

	setb	LCD_E			;

	and	rb,#00001111b		;RB4～7クリア

	snb	mLCD_44.7		;
	setb	rb.7			;
	snb	mLCD_44.6		;
	setb	rb.6			;
	snb	mLCD_44.5		;
	setb	rb.5			;
	snb	mLCD_44.4		;
	setb	rb.4			;

	clrb	LCD_E			;


	setb	LCD_E			;

	and	rb,#00001111b		;RB4～7クリア

	snb	mLCD_44.3		;
	setb	rb.7			;
	snb	mLCD_44.2		;
	setb	rb.6			;
	snb	mLCD_44.1		;
	setb	rb.5			;
	snb	mLCD_44.0		;
	setb	rb.4			;

	clrb	LCD_E			;

	ret				;リターン(サブルーチン終わり)

;sssssss LCDキャラクター表示 sssssssssss;
sLCD_RE
	call	sBUSY7			;LCD受付OKになるまで待つ

	setb	LCD_RS			;
	setb	LCD_E			;

	and	rb,#00001111b		;RB4～7クリア

	snb	mLCD_44.7		;
	setb	rb.7			;
	snb	mLCD_44.6		;
	setb	rb.6			;
	snb	mLCD_44.5		;
	setb	rb.5			;
	snb	mLCD_44.4		;
	setb	rb.4			;

	clrb	LCD_E			;
	clrb	LCD_RS			;


	setb	LCD_RS			;
	setb	LCD_E			;

	and	rb,#00001111b		;RB4～7クリア

	snb	mLCD_44.3		;
	setb	rb.7			;
	snb	mLCD_44.2		;
	setb	rb.6			;
	snb	mLCD_44.1		;
	setb	rb.5			;
	snb	mLCD_44.0		;
	setb	rb.4			;

	clrb	LCD_E			;
	clrb	LCD_RS			;

	ret				;リターン(サブルーチン終わり)

;sssssss LCDビジーチェック sssssssssssss;
sBUSY7
	setb	rp0			;ページ変更(Bank 1へ)
;Bank 1
	setb	trisb.7			;RB7を入力に変更
	clrb	rp0			;ページ変更(Bank 0へ戻す)

	setb	LCD_RW			;
	setb	LCD_E			;
	jb	rb.7,$			;ビジー信号が消えるまでここで待つ
	clrb	LCD_E			;
	clrb	LCD_RW			;

	setb	rp0			;ページ変更(Bank 1へ)
;Bank 1
	clrb	trisb.7			;RB7を出力に変更
	clrb	rp0			;ページ変更(Bank 0へ戻す)

	ret				;リターン(サブルーチン終わり)



;---------------------------------------;
;sss その他サブルーチン sss
;---------------------------------------;

;sssssss BCD割り算(8bit÷10) ssssssssss;
sBCDCAL
	call	sBCDZAN			;1桁目
	mov	mBCD_1,mBINAXX		;余りを入れる

	mov	mBINA08,mSHOW08		;商を入れる
	call	sBCDZAN			;2桁目
	mov	mBCD_2,mBINAXX		;余りを入れる
	mov	mBCD_3,mSHOW08		;商を入れる

;結果は1桁目→mBCD_1､2桁目→mBCD_2､3桁目→mBCD_3

	ret				;リターン(サブルーチン終わり)


;サブルーチンのサブルーチン
;---桁移動比較---
sBCDZAN
	mov	mFREE_A,#8		;ループ数設定
	clr	mBINAXX			;
rBCD_0	rl	mBINA08			;
	rl	mBINAXX			;

	jc	rBCD_2			;比較8ビット超判定
	cjae	mBINAXX,#10,rBCD_1	;勝ち負け判定
	clrb	c			;キャリー0
	jmp	rWARI_4			;
rBCD_1	sub	mBINAXX,#10		;引き算(余りはここに残る)
	jmp	rBCD_3			;
rBCD_2	clr	mFREE_B			;0にする
	sub	mFREE_B,#10		;
	add	mBINAXX,mFREE_B		;
rBCD_3	setb	c			;キャリー1

;---計算結果入れ---
rWARI_4	rl	mSHOW08			;計算結果を入れる
	djnz	mFREE_A,rBCD_0		;ループ継続判定
	ret



;---------------------------------------;
;    PIC初期状態確認                    ;(△:変更必要)
;---------------------------------------;
;Bank 0
;	tmr0		xxxxxxxx	;　タイマー0の状態
;	status		00011xxx	;　Bankセレクト設定､各旗の状態
;	porta		xxx00000	;△RAピン出力状態(xは不定)
;	portb		00xxxxxx	;△RBピン出力状態(xは不定)
;	intcon		0000000x	;　割り込み他､設定
;	pir1		-0000000	;　旗状態(A/D､タイマー､
;	pir2		00-0----	;　EEメモリー､他)
;	tmr1l		xxxxxxxx	;　タイマー1下位8bitの状態
;	tmr1h		xxxxxxxx	;　タイマー1上位8bitの状態
;	t1con		--000000	;　タイマー1コントロール関係設定
;	tmr2		00000000	;　タイマー2の状態
;	t2con		-0000000	;　タイマー2コントロール関係設定
;	sspbuf		xxxxxxxx	;　装置内通信SPI通信機能
;	sspcon		00000000	;　
;	ccpr1l		xxxxxxxx	;　
;	ccpr1h		xxxxxxxx	;　
;	ccp1con		--000000	;　キャプチャ/コンペア/PWM
;	adresh		xxxxxxxx	;　A/D変換値9､10bit？
;	adcon0		000000-0	;　A/Dコントロール関係設定
;Bank 1
;	option_reg	11111111	;　プルアップ､プリスケーラー比率他､設定
;	trisa		11111111	;△RAピンI/O制御設定(1は入力)
;	trisb		11111111	;△RBピンI/O制御設定(1は入力)
;	pie1		-0--0000	;　A/D､CCP､タイマー､EEメモリーの
;	pie2		---0----	;　割り込み使用するしない設定
;	pcon		------qq	;　パワーオン､低電圧リセットの？
;	osccon		-000-0--	;△内部RCオシレーター周波数設定
;	osctune		--000000	;　内蔵RCオシレーター微調整
;	pr2		11111111	;　
;	sspadd		00000000	;　
;	sspstat		00000000	;　
;	txsta		0000-010	;　
;	spbrg		00000000	;　
;	ansel		-1111111	;△アナログorデジタルI/O設定
;	cmcon		00000111	;　
;	cvrcon		000-0000	;　
;	adresl		xxxxxxxx	;　A/D変換値0～8bit
;	adcon1		00--0000	;　A/Dピン設定
;Bank 2
;	wdtcon		---01000	;　ウォッチドックタイマー分周
;	eedata		xxxxxxxx	;　EEメモリーの状態 Lo？
;	eeadr		xxxxxxxx	;　EEメモリーのアドレス位置 Lo
;	eedath		--xxxxxx	;　EEメモリーの状態 Hi？
;	eeadrh		-----xxx	;　EEメモリーのアドレス位置 Hi
;Bank 3
;	eecon1		x--xx000	;△EEメモリー関係設定
;	eecon2		--------	;　EEメモリー関係設定？

