;オートバイ時計他表示 Ver 1b	bitメカ工房		2009-05-12(火)
;
;[プログラム概要]
;･LCDを4ビットモードで表示させる｡
;
;　気温[℃]　スロットル開度[%]　経過時間
;
;	  1234567890123456
;	┌────────┐
;	│12.3c 100% 00:00│
;	│S.naoyuki  12:34│
;	└────────┘
;
;　予備空きスペース　時計
;　(◆電流計)
;
;・オシレーターは内部RC4MHzを使用する｡(1命令≒0.000001秒(1/4000000*4))
;　　(デジタル温度センサーのソフトを流用するため)
;
;･タイマー1のオシレーターは時計用として32768Hzの水晶発信器を使用する｡
;･タイマー1のプリスケーラを【2】にしてオーバーフロータイムを【4】秒とする｡
;　　1/32768x256x256x2=4秒
;(参考)
;・その場合の1カウント時間は　1/32768x2=0.00006103515625秒
;
;
;[PIC選定仕様他]
; ･PIC16F88-I/P使用｡(秋月電子通商で230円/個)
;
;			     ┌─┰─┐
;	(未使用)	 RA2 ┥	     ┝ RA1	気温
;	押しボタン-	 RA3 ┥	     ┝ RA0	スロットル開度
;	押しボタン+	 RA4 ┥	     ┝ RA7	LCD_DB7
;	MCLR		 RA5 ┥PIC   ┝ RA6	LCD_DB6
;			 Vss ┥ 16F88┝ Vdd	5.0V
;	5V検知用	 RB0 ┥	     ┝ RB7	水晶
;	LCD_E		 RB1 ┥	     ┝ RB6	水晶
;	LCD_R/W		 RB2 ┥	     ┝ RB5	LCD_DB5
;	LCD_RS		 RB3 ┥	     ┝ RB4	LCD_DB4
;			     └───┘
;
;◆後日変更予定…RA2を5V検知とし､RB0をLCD電源にする｡
;　　　　　　　　押しボタンをRB4､RB5と共用にして､電流計入力表示する｡
;
;
;-------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メモリー関係設定？
;
;
;[凡例] (自分で分かりやすいように目印を付ける)
; 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	_mclr_on		;MCLR端子(リセット)→設定する
	fuses	_pwrte_on		;電源投入72ms間リセット→有効
	fuses	_wdt_off		;ウォッチドックタイマー→無効
	fuses	_intrc_io		;オシレーター設定→内蔵RC

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

	id	'0010'			;Ver1.0



LCD_E		=	rb.1		;LCD用
LCD_RW		=	rb.2		;LCD用
LCD_RS		=	rb.3		;LCD用

;-------プログラムメモリー割当----------;

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

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

mTIME_SS	=	39h		;経過時間 割込カウント用 秒
mTIME_MM	=	3Ah		;経過時間 割込カウント用 分
mTIME_MX	=	3Bh		;経過時間 分 1桁目表示用
mTIME_XM	=	3Ch		;経過時間 分 2桁目表示用
mTIME_HH	=	3Dh		;経過時間 割込カウント用 時
mTIME_HX	=	3Eh		;経過時間 時 1桁目表示用
mTIME_XH	=	3Fh		;経過時間 時 2桁目表示用
mCOLON		=	40h		;":"点滅用

mAD_THR		=	41h		;スロットル開度 A/D用
mLCD_T07	=	42h		;スロットル開度 3桁目表示用
mLCD_T08	=	43h		;スロットル開度 2桁目表示用
mLCD_T09	=	44h		;スロットル開度 1桁目表示用

mBCD_0		=	45h		;気温の小数表示用
mSOUSIN		=	46h		;DS18S20送信データー用
mDS18_L		=	47h		;DS18S20温度データー下位バイト
mDS18_H		=	48h		;DS18S20温度データー上位バイト
mDATA_2		=	49h		;？(THレジスタまたはユーザー･バイト1)
mDATA_3		=	4Ah		;？(TLレジスタまたはユーザー･バイト2)
mDATA_4		=	4Bh		;？(予約済み)
mDATA_5		=	4Ch		;？(予約済み)
mDATA_6		=	4Dh		;？(温度変換カウンタ(COUNT REMAIN))
mDATA_7		=	4Eh		;？(温度変換カウンタ(COUNT PERﾟC))
mDS_CRC		=	4Fh		;CRC
mSHR1		=	50h		;計算で得たCRC

mERROR		=	51h		;エラーチェック用

mLCD_T01	=	52h		;気温 2桁目表示用
mLCD_T02	=	53h		;気温 1桁目表示用
mLCD_T04	=	54h		;気温 小数点第1位表示用

mFREE_C		=	55h		;DS18S20の時間カウント用
mFREE_D		=	56h		;DS18S20のエラーチェック用


;=======プログラム初期設定==============;

	org	0			;
	jmp	rSTART			;





;iiiiiii割り込み時プログラムiiiiiiiiiiii;
	org	4			;

	clrb	tmr1if			;tmr1/INT割込旗解除
					;4秒間隔で割込入る

	add	mTIME_SS,#4		;+4秒

	cjb	mTIME_SS,#60,rINT_END	;
	clr	mTIME_SS		;
	inc	mTIME_MM		;+1

	cjb	mTIME_MM,#60,rINT_END	;
	clr	mTIME_MM		;
	inc	mTIME_HH		;+1

	cjb	mTIME_HH,#25,rINT_END	;
	clr	mTIME_HH		;

rINT_END
	reti				;

;iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii;





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

rSTART
;Bank 0
	clr	ra			;
	clr	rb			;

	mov	t1con,#00011111b	;
					;bit7…Unimplemented
					;bit6…ｼｽﾃﾑｸﾛｯｸはT1ｵｼﾚｰﾀｰ【不使用】
					;bit5～4…プリスケールレート【1:2】
					;bit3…T1ｵｼﾚｰﾀｰ【有効】
					;bit2…
					;bit1…
					;bit0…タイマー1【使用】

	mov	t2con,#00000100b	;プリスケール1:1

	setb	rp0			;ページ変更(Bank 1へ)
;Bank 1
	mov	trisa,#00111111b	;RAの入出力ピン設定
	mov	trisb,#11000001b	;RBの入出力ピン設定

	setb	tmr1ie			;タイマー1割込を使用する

	mov	osccon,#01100010b	;内蔵オシレーター周波数を4MHzに設定

	mov	ansel,# 0000000b	;RAはすべてデジタルピンに設定
	clrb	rp0			;ページ変更(Bank 0へ戻す)



;---------------------------------------;
;LCD初期設定

;	setb	ra.2			;LCDの電源ON､trisaの変更必要

	clr	mFREE_A			;
;8MHzの場合
;	mov	mFREE_B,#31		;M1632-0Aでダメだった
;	mov	mFREE_B,#32		;M1632-0Aで不安定だった
;	mov	mFREE_B,#33		;M1632-0AでOKだがSC2004Cではダメだった
;	mov	mFREE_B,#75		;これでもSC2004Cではダメ
;	mov	mFREE_B,#76		;これでやっとSC2004CでOK!

;	mov	mFREE_B,#128		;(76の1.5～2倍で128にしておく)
	mov	mFREE_B,#64		;(4MHzなので128x0.5)

rWAIT00	djnz	mFREE_A,rWAIT00		;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_			;


;---------------
;LCD自作キャラクター登録
	mov	mLCD_44,#01000000b	;アドレスセット №0-0
	call	sLCD_E_			;
;【℃】
	mov	mLCD_44,#00011000b	;0-0ドットデーター
	call	sLCD_RE			;
	mov	mLCD_44,#00011000b	;0-1ドットデーター
	call	sLCD_RE			;
	mov	mLCD_44,#00001110b	;0-2ドットデーター
	call	sLCD_RE			;
	mov	mLCD_44,#00010001b	;0-3ドットデーター
	call	sLCD_RE			;
	mov	mLCD_44,#00010000b	;0-4ドットデーター
	call	sLCD_RE			;
	mov	mLCD_44,#00010001b	;0-5ドットデーター
	call	sLCD_RE			;
	mov	mLCD_44,#00001110b	;0-6ドットデーター
	call	sLCD_RE			;
	mov	mLCD_44,#00000000b	;0-7ドットデーター
	call	sLCD_RE			;



;[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|
;	---+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+




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


	clr	tmr1l			;
	clr	tmr1h			;
	clrb	tmr1if			;

	clr	mTIME_SS		;
	clr	mTIME_MM		;
	clr	mTIME_HH		;

	mov	intcon,#11000000b	;割込有効


	clr	mERROR			;気温計エラーチェック

	mov	mLCD_T01,#'-'		;気温初期表示
	mov	mLCD_T02,#'-'		;気温初期表示
	mov	mLCD_T04,#'-'		;気温初期表示


;↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ;
;***[ メインループ ]********************;
;繰り返し
rREPEAT


;DS18S20計測開始
	cjb	tmr1h,#128,rDS_READ	;◆2秒ごと

	call	sDRESET			;DS18S20/RESET送信

	jb	mERROR.1,rERROR1	;断線エラー
	jb	mERROR.2,rERROR2	;短絡エラー
	jb	mERROR.3,rERROR3	;リセットエラー

	mov	mSOUSIN,#0CCh		;スキップROMコード(CCh)送信
	call	sSOUSIN			;11001100b
	mov	mSOUSIN,#44h		;コンバートTコード(44h)送信
	call	sSOUSIN			;01000100b


	jmp	rDS_PASS		;

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

;　↑
;データーシートでは変換に0.75秒必要となっている
;　↓


rDS_READ
;---------------------------------------;

;DS18S20データー読み取り開始
	call	sDRESET			;DS18S20/RESET送信
	mov	mSOUSIN,#0CCh		;スキップROMコード(CCh)送信
	call	sSOUSIN			;11001100b
	mov	mSOUSIN,#0BEh		;リード･スクラッチ･パッド･コード(BEh)
	call	sSOUSIN			;送信10111110b
	call	sREAD_9			;スクラッチ･パットのデーターを読む
	call	s9BCRC			;CRC計算とエラー判定


;-------エラー判定と表示ジャンプ

	jb	mERROR.4,rERROR4	;CRCエラーがあった場合｢Er4｣表示へ

;-------温度計算------------------------;

;マイナス判定とマイナス処理

;-0.1ﾟC～-0.3ﾟCをチェックする｡
	test	mDS18_L			;ゼロかどうか
	jnz	rHMINUS			;ゼロでなければパス

	cjbe	mDATA_6,#012,rHMINUS	;データー(6)が012以下はパス
	setb	mDS18_H.0		;マイナス符号付加用
	jmp	rTABLE_			;マイナステーブルへ


rHMINUS
	jnb	mDS18_H.7,rPLUS		;mDS18_Hの7ビット目でマイナス判定

	clr	mFREE_A			;ゼロ化
	sub	mFREE_A,mDS18_L		;0-mDS18_L
	mov	mDS18_L,mFREE_A		;

;-9.8ﾟCを超えたか？
	cjae	mDS18_L,#020,rLOW	;｢LLL｣表示へ

rTABLE_

;小数点第一位表示(表示ステップ0.1ﾟC)マイナスの場合

	cje	mDATA_6,#001,rXX3	;
	cje	mDATA_6,#002,rXX4	;
	cje	mDATA_6,#003,rXX4	;
	cje	mDATA_6,#004,rXX5	;
	cje	mDATA_6,#005,rXX6	;
	cje	mDATA_6,#006,rXX6	;
	cje	mDATA_6,#007,rXX7	;
	cje	mDATA_6,#008,rXX8	;

	cje	mDATA_6,#009,rXX8D	;
	cje	mDATA_6,#010,rXX9D	;
	cje	mDATA_6,#011,rXX9D	;

	cje	mDATA_6,#012,rXX0	;
	cje	mDATA_6,#013,rXX1	;
	cje	mDATA_6,#014,rXX1	;
	cje	mDATA_6,#015,rXX2	;
	cje	mDATA_6,#016,rXX3	;

	jmp	rNNN			;エラーとして｢---｣表示



rPLUS

;+85ﾟCか？
	cje	mDS18_L,#170,rNNN	;立ち上げ直後の初期状態｢---｣

;+85ﾟC超えているか？
	cja	mDS18_L,#170,rHIGH	;｢HHH｣

;小数点第一位表示(表示ステップ0.1ﾟC)プラスの場合

	cje	mDATA_6,#001,rXX7	;
	cje	mDATA_6,#002,rXX6	;
	cje	mDATA_6,#003,rXX6	;
	cje	mDATA_6,#004,rXX5	;
	cje	mDATA_6,#005,rXX4	;
	cje	mDATA_6,#006,rXX4	;
	cje	mDATA_6,#007,rXX3	;
	cje	mDATA_6,#008,rXX3	;
	cje	mDATA_6,#009,rXX2	;
	cje	mDATA_6,#010,rXX1	;
	cje	mDATA_6,#011,rXX1	;
	cje	mDATA_6,#012,rXX0	;

	cje	mDATA_6,#013,rXX9D	;
	cje	mDATA_6,#014,rXX9D	;
	cje	mDATA_6,#015,rXX8D	;
	cje	mDATA_6,#016,rXX8D	;

	jmp	rNNN			;エラーとして｢---｣表示

rXX0	mov	mBCD_0,#0		;
	jmp	rBCD7			;
rXX1	mov	mBCD_0,#1		;
	jmp	rBCD7			;
rXX2	mov	mBCD_0,#2		;
	jmp	rBCD7			;
rXX3	mov	mBCD_0,#3		;
	jmp	rBCD7			;
rXX4	mov	mBCD_0,#4		;
	jmp	rBCD7			;
rXX5	mov	mBCD_0,#5		;
	jmp	rBCD7			;
rXX6	mov	mBCD_0,#6		;
	jmp	rBCD7			;
rXX7	mov	mBCD_0,#7		;
	jmp	rBCD7			;
rXX8	mov	mBCD_0,#8		;
	jmp	rBCD7			;
rXX8D	mov	mBCD_0,#8		;
	dec	mDS18_L			;-1補正
	jmp	rBCD7			;
rXX9D	mov	mBCD_0,#9		;
	dec	mDS18_L			;-1補正

rBCD7

;温度データー÷2計算
	clc				;クリアキャリー
	rr	mDS18_L			;÷2

	mov	mBINA08,mDS18_L		;温度計測データーをBCD化
	call	sBCDCAL			;BCD計算へ


;BCD→7セグメントLED表示変換

	mov	mLCD_T01,mBCD_2		;2桁目
	mov	mLCD_T02,mBCD_1		;1桁目
	mov	mLCD_T04,mBCD_0		;少数点第1位

	add	mLCD_T01,#48		;
	add	mLCD_T02,#48		;
	add	mLCD_T04,#48		;


;マイナスの場合マイナス符号表示
	jnb	mDS18_H.0,$+4		;mDS18_Hの1ビット目でマイナス判定
	mov	mLCD_T01,#'-'		;☆｢-｣パターンを入れる


;---------------------------------------;
;---------------------------------------;
rDS_PASS








;A/D【スロットル開度】チェック
	setb	rp0			;ページ変更(Bank 1へ)
;Bank 1
	mov	adcon1,#00000000b	;
	clrb	rp0			;ページ変更(Bank 0へ戻す)
;Bank 0
	mov	adcon0,#11000001b	;A/D設定(Channel 0 (RA0/AN0))
	nop				;20μs必要
	nop				;
	nop				;
	nop				;
	nop				;
	nop				;
	nop				;
	nop				;
	nop				;
	nop				;
	nop				;
	nop				;
	nop				;
	nop				;
	nop				;
	nop				;
	nop				;
	nop				;
	nop				;
	nop				;

	setb	go_done			;A/D変換開始
	jb	go_done,$		;A/D変換終了(bit0)まで待つ

	mov	mAD_THR,adresh		;

	call	sTHROTTL		;スロットル変換テーブルへ

	call	sBCDCAL			;BCD計算へ

	mov	mLCD_T07,mBCD_3		;XXX%
	mov	mLCD_T08,mBCD_2		;
	mov	mLCD_T09,mBCD_1		;

	add	mLCD_T07,#48		;
	add	mLCD_T08,#48		;
	add	mLCD_T09,#48		;



;---------------------------------------;
;◆押しボタンテスト
	jb	ra.4,rTEST_A		;+ボタン

	jb	ra.3,rTEST_B		;-ボタン

rTEST_A
	nop				;
rTEST_B
	nop				;



;---------------------------------------;
;経過時間の表示変換

	mov	mBINA08,mTIME_MM	;【分】
	call	sBCDCAL			;BCD計算へ

	mov	mTIME_XM,mBCD_2		;
	mov	mTIME_MX,mBCD_1		;

	add	mTIME_XM,#48		;
	add	mTIME_MX,#48		;

;---------------
	mov	mBINA08,mTIME_HH	;【時】
	call	sBCDCAL			;BCD計算へ

	mov	mTIME_XH,mBCD_2		;
	mov	mTIME_HX,mBCD_1		;

	add	mTIME_XH,#48		;
	add	mTIME_HX,#48		;



;---------------------------------------;
;キャラクターコード送信(表示)

	mov	mLCD_44,#80h		;1行目1桁目
	call	sLCD_E_			;

	mov	mLCD_44,mLCD_T01	;1 気温
	call	sLCD_RE			;
	mov	mLCD_44,mLCD_T02	;2 気温
	call	sLCD_RE			;
	mov	mLCD_44,#'.'		;3 
	call	sLCD_RE			;
	mov	mLCD_44,mLCD_T04	;4 気温
	call	sLCD_RE			;
	mov	mLCD_44,#0		;5 キャラクター登録№0【℃】
	call	sLCD_RE			;
	mov	mLCD_44,#' '		;6
	call	sLCD_RE			;
	mov	mLCD_44,mLCD_T07	;7 スロットル開度
	call	sLCD_RE			;
	mov	mLCD_44,mLCD_T08	;8 スロットル開度
	call	sLCD_RE			;
	mov	mLCD_44,mLCD_T09	;9 スロットル開度
	call	sLCD_RE			;
	mov	mLCD_44,#'%'		;10
	call	sLCD_RE			;
	mov	mLCD_44,#' '		;11
	call	sLCD_RE			;
	mov	mLCD_44,mTIME_XH	;12
	call	sLCD_RE			;
	mov	mLCD_44,mTIME_HX	;13
	call	sLCD_RE			;
	mov	mLCD_44,mCOLON		;14
	call	sLCD_RE			;
	mov	mLCD_44,mTIME_XM	;15
	call	sLCD_RE			;
	mov	mLCD_44,mTIME_MX	;16
	call	sLCD_RE			;

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

	mov	mLCD_44,#'S'		;1
	call	sLCD_RE			;
	mov	mLCD_44,#'.'		;2
	call	sLCD_RE			;
	mov	mLCD_44,#'n'		;3
	call	sLCD_RE			;
	mov	mLCD_44,#'a'		;4
	call	sLCD_RE			;
	mov	mLCD_44,#'o'		;5
	call	sLCD_RE			;
	mov	mLCD_44,#'y'		;6
	call	sLCD_RE			;
	mov	mLCD_44,#'u'		;7
	call	sLCD_RE			;
	mov	mLCD_44,#'k'		;8
	call	sLCD_RE			;
	mov	mLCD_44,#'i'		;9
	call	sLCD_RE			;
	mov	mLCD_44,#' '		;10
	call	sLCD_RE			;
	mov	mLCD_44,#' '		;11
	call	sLCD_RE			;
	mov	mLCD_44,#'W'		;12
	call	sLCD_RE			;
	mov	mLCD_44,#'A'		;13
	call	sLCD_RE			;
	mov	mLCD_44,#'T'		;14
	call	sLCD_RE			;
	mov	mLCD_44,#'C'		;15
	call	sLCD_RE			;
	mov	mLCD_44,#'H'		;16
	call	sLCD_RE			;



;---------------------------------------;
;LCD表示後のWAIT

rNEXT0
	cjne	tmr1h,#0,rNEXT1
	mov	mCOLON,#' '		;1秒待ち
	jmp	rREPEAT
rNEXT1
	cjne	tmr1h,#64,rNEXT2
	mov	mCOLON,#':'		;1秒待ち
	jmp	rREPEAT
rNEXT2
	cjne	tmr1h,#128,rNEXT3
	mov	mCOLON,#' '		;1秒待ち
	jmp	rREPEAT
rNEXT3
	cjne	tmr1h,#192,rNEXT0
	mov	mCOLON,#':'		;1秒待ち
	jmp	rREPEAT


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





;断線エラーがあった場合｢Er1｣表示
rERROR1
	mov	mLCD_T01,#'E'		;
	mov	mLCD_T02,#'r'		;
	mov	mLCD_T04,#'1'		;
	jmp	rDS_PASS		;

;短絡エラーがあった場合｢Er2｣表示
rERROR2
	mov	mLCD_T01,#'E'		;
	mov	mLCD_T02,#'r'		;
	mov	mLCD_T04,#'2'		;
	jmp	rDS_PASS		;

;リセットエラーがあった場合｢Er3｣表示
rERROR3
	mov	mLCD_T01,#'E'		;
	mov	mLCD_T02,#'r'		;
	mov	mLCD_T04,#'3'		;
	jmp	rDS_PASS		;


;CRCエラーがあった場合｢Er4｣表示
rERROR4
	mov	mLCD_T01,#'E'		;
	mov	mLCD_T02,#'r'		;
	mov	mLCD_T04,#'4'		;
	clrb	mERROR.4		;エラービットクリヤー
	jmp	rDS_PASS		;

;-9.9ﾟCを超えた場合は｢LLL｣表示とする｡
rLOW
	mov	mLCD_T01,#'L'		;
	mov	mLCD_T02,#'L'		;
	mov	mLCD_T04,#'L'		;
	jmp	rDS_PASS		;

;85ﾟCの場合は｢---｣表示とする｡
rNNN
	mov	mLCD_T01,#'-'		;
	mov	mLCD_T02,#'-'		;
	mov	mLCD_T04,#'-'		;
	jmp	rDS_PASS		;

;85ﾟCを超えた場合は｢HHH｣表示とする｡
rHIGH
	mov	mLCD_T01,#'H'		;
	mov	mLCD_T02,#'H'		;
	mov	mLCD_T04,#'H'		;
	jmp	rDS_PASS		;



;sssssss RESET送信及びエラーチェック sss;DS18S20
sDRESET
	clr	mERROR			;

	clrb	ra.1			;★Lo
;	mov	tmr1h,#0FDh		;480μs x1.5=720μsの待ちを作る
;	mov	tmr1l,#30h		;(16ビットで0-720(10進)=FD30(16進))
;	clrb	tmr1if			;
;	jnb	tmr1if,$		;

;　tmr1lの1カウント時間は　1/32768x2=0.00006103515625秒
;　720μsであれば､0.00072/0.00006103515625=11.8

	mov	mFREE_C,tmr1l		;
	add	mFREE_C,#12		;
	cjne	tmr1l,mFREE_C,$		;


	setb	rp0			;ページ変更(Bank 1へ)
	setb	trisa.1			;★入力に変更
	clrb	rp0			;ページ変更(Bank 0へ戻す)

;	mov	tmr1h,#0FDh		;480μs x1.5=720μs設定
;	mov	tmr1l,#30h		;(16ビットで0-720(10進)=FD30(16進))
;	clrb	tmr1if			;

	mov	mFREE_C,tmr1l		;
	add	mFREE_C,#12		;




;---Waits計測開始(15-60μs)
	clr	tmr2			;タイマー2の値クリア
	clrb	tmr2if			;タイマー2のオーバーフロー旗クリア

	jb	tmr2if,_rERRO1		;255μs超えの場合は断線エラーと判定する

	jb	ra.1,$-2		;★ビット0まで待つ
	mov	mFREE_A,tmr2		;タイマー2の値をメモリーに格納
	cjbe	mFREE_A,#15,_rERRO2	;15μs未満の場合は短絡エラーと判定する
	cjae	mFREE_A,#60,_rERRO3	;リセットエラー判定

;---pulse計測開始(60-240μs)
	clr	tmr2			;タイマー2の値クリア
	clrb	tmr2if			;タイマー2のオーバーフロー旗クリア

	jb	tmr2if,_rERRO3		;リセットエラー判定

	jnb	ra.1,$-2		;★ビット1まで待つ
	mov	mFREE_A,tmr2		;タイマー2の値をメモリーに格納
	cjbe	mFREE_A,#60,_rERRO3	;リセットエラー判定
	cjae	mFREE_A,#240,_rERRO3	;　　　〃

;	jb	tmr1if,$		;設定しておいた720μsになるまで待つ
	cjne	tmr1l,mFREE_C,$		;




_rERR_r
	setb	ra.1			;★あらかじめHiにしておく
	setb	rp0			;ページ変更(Bank 1へ)
	clrb	trisa.1			;★出力に変更
	clrb	rp0			;ページ変更(Bank 0へ戻す)

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


;RESETエラー処理
_rERRO1
	setb	mERROR.1		;
	jmp	_rERR_r			;
_rERRO2
	setb	mERROR.2		;
	jmp	_rERR_r			;
_rERRO3
	setb	mERROR.3		;
	jmp	_rERR_r			;


;sssssss 送信パターン｢0｣か｢1｣ ssssssssss;DS18S20

sSOUSIN
	mov	mFREE_A,#8		;8ビット分
_rSOUSI
	jb	mSOUSIN.0,_rWRIT1	;｢0｣か｢1｣の判定
;｢0｣だった場合
	clrb	ra.1			;★
	mov	tmr2,#196		;(256-60=196)
	clrb	tmr2if			;
	jnb	tmr2if,$		;60μs待つ
	setb	ra.1			;★送信終わりの合図
	rr	mSOUSIN			;
	djnz	mFREE_A,_rSOUSI		;

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

;｢1｣だった場合
_rWRIT1
	clrb	ra.1			;★
	setb	ra.1			;★
	mov	tmr2,#196		;(256-60=196)
	clrb	tmr2if			;
	jnb	tmr2if,$		;60μs待つ

	rr	mSOUSIN			;
	djnz	mFREE_A,_rSOUSI		;

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

;sssssss データー受信 ssssssssssssssssss;DS18S20
sREAD_9
	call	ssREAD9			;
	mov	mDS18_L,mFREE_A		;温度データー下位バイト
	call	ssREAD9			;
	mov	mDS18_H,mFREE_A		;温度データー上位バイト
	call	ssREAD9			;
	mov	mDATA_2,mFREE_A		;(THレジスタまたはユーザー･バイト1)
	call	ssREAD9			;
	mov	mDATA_3,mFREE_A		;(TLレジスタまたはユーザー･バイト2)
	call	ssREAD9			;
	mov	mDATA_4,mFREE_A		;(予約済み)
	call	ssREAD9			;
	mov	mDATA_5,mFREE_A		;(予約済み)
	call	ssREAD9			;
	mov	mDATA_6,mFREE_A		;(温度変換カウンタ(COUNT REMAIN))
	call	ssREAD9			;
	mov	mDATA_7,mFREE_A		;(温度変換カウンタ(COUNT PERﾟC))
	call	ssREAD9			;
	mov	mDS_CRC,mFREE_A		;CRC

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

;サブルーチンのサブルーチン
ssREAD9
	mov	mFREE_B,#8		;8ビット分
_rREAD9
	clrb	ra.1			;★

	setb	rp0			;ページ変更(Bank 1へ)
	setb	trisa.1			;★入力に変更
	clrb	rp0			;ページ変更(Bank 0へ戻す)

	nop				;
	nop				;
	nop				;

	clc				;クリアキャリー
	snb	ra.1			;★
	stc				;セットキャリー
	rr	mFREE_A			;データーを7ビット目に入れる
	nop				;
	nop				;
	nop				;
	nop				;
	nop				;
	nop				;
	nop				;
	nop				;
	nop				;
	nop				;
	jb	mFREE_A.7,rNZERO	;

;｢0｣だった場合
	mov	tmr2,#196		;(256-60=196)
	clrb	tmr2if			;
	jnb	tmr2if,$		;60μs待つ

;	jnb	ra.1,$			;★ビット立つまで待つ


;｢1｣だった場合(｢0｣だった場合の後処理共通)
rNZERO
	setb	ra.1			;★
	setb	rp0			;ページ変更(Bank 1へ)
	clrb	trisa.1			;★出力に変更
	clrb	rp0			;ページ変更(Bank 0へ戻す)

	djnz	mFREE_B,_rREAD9		;

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


;sssssss CRC計算 sssssssssssssssssssssss;DS18S20
;
;CRCの計算方法についてはよく分からないので､この部分は､
;｢トラ技2003年12月号の272P～280P PIC16F84を使った温度コントローラの製作
;<前編>DS18S20を使いこなそう! 軸丸 哲也 氏作成｣
;を､ほぼそのまま転用した｡
;
;8バイトデーターからCRCを計算
s9BCRC
	clr	mSHR1			;
	mov	w,mDS18_L		;
	call	ssCRC			;
	mov	w,mDS18_H		;
	call	ssCRC			;
	mov	w,mDATA_2		;
	call	ssCRC			;
	mov	w,mDATA_3		;
	call	ssCRC			;
	mov	w,mDATA_4		;
	call	ssCRC			;
	mov	w,mDATA_5		;
	call	ssCRC			;
	mov	w,mDATA_6		;
	call	ssCRC			;
	mov	w,mDATA_7		;
	call	ssCRC			;
;CRCエラー判定
	mov	mFREE_A,mDS_CRC		;
	sub	mFREE_A,mSHR1		;CRC-計算CRC
	jz	$+3			;↑の計算結果がゼロならOK(Words2)
	setb	mERROR.4		;(Words1)

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


;サブルーチンのサブルーチン
ssCRC
	mov	mFREE_A,w		;
	mov	mFREE_D,#8		;(汎用回数カウント)
_rCRC_L
	mov	w,mFREE_A		;
	xor	w,mSHR1			;mSHR1 = 計算で得たCRC
	mov	mFREE_B,w		;
	jnb	mFREE_B.0,_rZCRC	;
	xor	mSHR1,#11000b		;？0001 1000(生成多項式による)
_rZCRC
	rr	mFREE_B			;
	rr	mSHR1			;
	rr	mFREE_A			;
	djnz	mFREE_D,_rCRC_L		;
	ret





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

	setb	LCD_E			;

	and	rb,#11001111b		;RB4､5クリア
	and	ra,#00111111b		;RA6､7クリア

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

	clrb	LCD_E			;


	setb	LCD_E			;

	and	rb,#11001111b		;RB4､5クリア
	and	ra,#00111111b		;RA6､7クリア

	snb	mLCD_44.3		;
	setb	ra.7			;
	snb	mLCD_44.2		;
	setb	ra.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,#11001111b		;RB4､5クリア
	and	ra,#00111111b		;RA6､7クリア

	snb	mLCD_44.7		;
	setb	ra.7			;
	snb	mLCD_44.6		;
	setb	ra.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,#11001111b		;RB4､5クリア
	and	ra,#00111111b		;RA6､7クリア

	snb	mLCD_44.3		;
	setb	ra.7			;
	snb	mLCD_44.2		;
	setb	ra.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	trisa.7			;RA7を入力に変更
	clrb	rp0			;ページ変更(Bank 0へ戻す)

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

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

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



;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



;sssssss A/D→ｽﾛｯﾄﾙ開度変換ﾃｰﾌﾞﾙ sssssss;
sTHROTTL
	cja	mAD_THR,#22,$+7		;A/D値が【22】未満だったら【0】%とする
	mov	mBINA08,#0		;
	ret				;

	cja	mAD_THR,#24,$+7		;A/D値が【24】未満だったら【1】%とする
	mov	mBINA08,#1		;
	ret				;

	cja	mAD_THR,#26,$+7		;
	mov	mBINA08,#2		;
	ret				;

	cja	mAD_THR,#28,$+7		;
	mov	mBINA08,#3		;
	ret				;

	cja	mAD_THR,#30,$+7		;
	mov	mBINA08,#4		;
	ret				;

	cja	mAD_THR,#31,$+7		;
	mov	mBINA08,#5		;
	ret				;

	cja	mAD_THR,#33,$+7		;
	mov	mBINA08,#6		;
	ret				;

	cja	mAD_THR,#35,$+7		;
	mov	mBINA08,#7		;
	ret				;

	cja	mAD_THR,#37,$+7		;
	mov	mBINA08,#8		;
	ret				;

	cja	mAD_THR,#39,$+7		;
	mov	mBINA08,#9		;
	ret				;

	cja	mAD_THR,#41,$+7		;
	mov	mBINA08,#10		;
	ret				;

	cja	mAD_THR,#42,$+7		;
	mov	mBINA08,#11		;
	ret				;

	cja	mAD_THR,#44,$+7		;
	mov	mBINA08,#12		;
	ret				;

	cja	mAD_THR,#46,$+7		;
	mov	mBINA08,#13		;
	ret				;

	cja	mAD_THR,#48,$+7		;
	mov	mBINA08,#14		;
	ret				;

	cja	mAD_THR,#50,$+7		;
	mov	mBINA08,#15		;
	ret				;

	cja	mAD_THR,#52,$+7		;
	mov	mBINA08,#16		;
	ret				;

	cja	mAD_THR,#53,$+7		;
	mov	mBINA08,#17		;
	ret				;

	cja	mAD_THR,#55,$+7		;
	mov	mBINA08,#18		;
	ret				;

	cja	mAD_THR,#57,$+7		;
	mov	mBINA08,#19		;
	ret				;

	cja	mAD_THR,#59,$+7		;
	mov	mBINA08,#20		;
	ret				;

	cja	mAD_THR,#61,$+7		;
	mov	mBINA08,#21		;
	ret				;

	cja	mAD_THR,#63,$+7		;
	mov	mBINA08,#22		;
	ret				;

	cja	mAD_THR,#64,$+7		;
	mov	mBINA08,#23		;
	ret				;

	cja	mAD_THR,#66,$+7		;
	mov	mBINA08,#24		;
	ret				;

	cja	mAD_THR,#68,$+7		;
	mov	mBINA08,#25		;
	ret				;

	cja	mAD_THR,#70,$+7		;
	mov	mBINA08,#26		;
	ret				;

	cja	mAD_THR,#72,$+7		;
	mov	mBINA08,#27		;
	ret				;

	cja	mAD_THR,#74,$+7		;
	mov	mBINA08,#28		;
	ret				;

	cja	mAD_THR,#75,$+7		;
	mov	mBINA08,#29		;
	ret				;

	cja	mAD_THR,#77,$+7		;
	mov	mBINA08,#30		;
	ret				;

	cja	mAD_THR,#79,$+7		;
	mov	mBINA08,#31		;
	ret				;

	cja	mAD_THR,#81,$+7		;
	mov	mBINA08,#32		;
	ret				;

	cja	mAD_THR,#83,$+7		;
	mov	mBINA08,#33		;
	ret				;

	cja	mAD_THR,#85,$+7		;
	mov	mBINA08,#34		;
	ret				;

	cja	mAD_THR,#86,$+7		;
	mov	mBINA08,#35		;
	ret				;

	cja	mAD_THR,#88,$+7		;
	mov	mBINA08,#36		;
	ret				;

	cja	mAD_THR,#90,$+7		;
	mov	mBINA08,#37		;
	ret				;

	cja	mAD_THR,#92,$+7		;
	mov	mBINA08,#38		;
	ret				;

	cja	mAD_THR,#94,$+7		;
	mov	mBINA08,#39		;
	ret				;

	cja	mAD_THR,#96,$+7		;
	mov	mBINA08,#40		;
	ret				;

	cja	mAD_THR,#98,$+7		;
	mov	mBINA08,#41		;
	ret				;

	cja	mAD_THR,#99,$+7		;
	mov	mBINA08,#42		;
	ret				;

	cja	mAD_THR,#101,$+7	;
	mov	mBINA08,#43		;
	ret				;

	cja	mAD_THR,#103,$+7	;
	mov	mBINA08,#44		;
	ret				;

	cja	mAD_THR,#105,$+7	;
	mov	mBINA08,#45		;
	ret				;

	cja	mAD_THR,#107,$+7	;
	mov	mBINA08,#46		;
	ret				;

	cja	mAD_THR,#109,$+7	;
	mov	mBINA08,#47		;
	ret				;

	cja	mAD_THR,#110,$+7	;
	mov	mBINA08,#48		;
	ret				;

	cja	mAD_THR,#112,$+7	;
	mov	mBINA08,#49		;
	ret				;

	cja	mAD_THR,#131,$+7	;50%
	mov	mBINA08,#50		;
	ret				;

	cja	mAD_THR,#149,$+7	;
	mov	mBINA08,#60		;
	ret				;

	cja	mAD_THR,#167,$+7	;
	mov	mBINA08,#70		;
	ret				;

	cja	mAD_THR,#186,$+7	;
	mov	mBINA08,#80		;
	ret				;

	cjae	mAD_THR,#204,$+7	;
	mov	mBINA08,#90		;
	ret				;

	mov	mBINA08,#100		;100%
	ret				;
