;オートバイ用クランクケース負圧計 Ver 1.00	NAO TECHUNOHUT	2007-07-16(水)
;
;[プログラム概要]
; ･正負微圧センサー使用のオートバイ用クランクケース負圧計｡
; ･7セグメントLED2桁表示とする｡(秋月電子通商で200円/個)
; ･7セグメントLEDは普通の駆動とする｡(ダイナミック駆動じゃない)
;
; 1桁目(カソードコモン駆動)
;	　　Ａ
;	　　─
;	Ｆ│Ｇ│Ｂ
;	　　─
;	Ｅ│　│Ｃ
;	　　─　	       E D C B A F G
;	　　Ｄ		rb,# X X X X X X X X b
;
; 2桁目(アノードコモン駆動)
;	　　Ａ
;	　　─
;	Ｆ│Ｇ│Ｂ
;	　　─
;	Ｅ│　│Ｃ
;	　　─　	     D C - B A F G E
;	　　Ｄ		ra,# X X X X X X X X b
;
; ･表示ステップ単位は1cmH2O｡
; ･表示例 ｢01｣ ｢15｣
; ･表示範囲は0～-25cmH2Oまで｡(マイナス記号は表示しない)
; ･25を超えた場合は｢LL｣表示とする｡
; ･正圧の場合は｢HH｣表示とする｡
; ･DP(.)表示は使用しない｡
; ･電源ON時は7セグメントLEDを約1秒間全点灯表示させる｡｢88｣
; ･計測表示間隔は約0.5秒とする｡
;
; ･オシレーターは内部 RC 31.25kHzを使用する｡(1命令処理時間 0.000128秒)
;	(1番遅い設定だが､これで十分である｡消費電力が少ない｡)
;
; ･タイマー0のオーバーフローを約【0.52】秒で発生させて利用する｡
;　　1/31250x1024x16=0.524288秒 (16はプリスケーラ値)
;　　内蔵オシレーター微調整機能を使用して出来るだけ0.50秒に近づける｡
;
; ･ウォッチドックタイマーを使用する｡約【2】秒でリセットする｡
;
;[PIC選定その他仕様]
; ･PIC16F819-I/P使用｡(秋月電子通商で230円/個)
; ･MCLRは内部接続モードとする｡(RA5として使用する)
;			     ┌─┰─┐
;	7LED2_F		 RA2 ┥	     ┝ RA1	7LED2_G
;	7LED2_A		 RA3 ┥	     ┝ RA0	7LED2_E
;	7LED2_B		 RA4 ┥	     ┝ RA7	7LED2_D
;	未使用		 RA5 ┥PIC   ┝ RA6	7LED2_C
;			 Vss ┥ 16F88┝ Vdd	5.0V
;	7LED1_G		 RB0 ┥	     ┝ RB7	電圧A/D
;	7LED1_F		 RB1 ┥	     ┝ RB6	7LED1_E
;	7LED1_A		 RB2 ┥	     ┝ RB5	7LED1_D
;	7LED1_B		 RB3 ┥	     ┝ RB4	7LED1_C
;			     └───┘
;	※#04(RA5)は入力のみなのでLEDはアノードコモン接続とする｡
;
;-------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		0000----	;
;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メモリー関係設定？
;
;[凡例] (自分で分かりやすいように目印を付ける)
; mXXX:メモリー  rXXX:ラベル  sXXX:サブルーチン  vXXX:変数  ★:調整箇所など
;
; CVASM16アセンブラ用記述
;-------PICコンフィギュレーション設定---;

	include	'16f88.inc'

	fuses _intrc_io			;オシレーター設定→内蔵､ピンはra6設定
	fuses _wdt_off			;ウォッチドックタイマー→無効(初期設定)
	fuses _pwrte_on			;電源投入72ms間リセット→有効
	fuses _mclr_off			;MCLR端子(リセット)→設定しない
	fuses _boden_off		;低電圧リセット(約4V以下)→無し
	fuses _lvp_off			;低電圧プログミング(5V)→無効
	fuses _cpd_off			;eepromのコードプロテクト→無効
	fuses _wrt_enable_off		;eeconのFlashメモリ可能→しない
	fuses _debug_off		;インサーキットデバックモード→無効
	fuses _ccp1_rb2			;？
	fuses _cp_off			;コードプロテクト→無効
	fuses _fcmen_off		;フェイルセーフクロックモニター？
	fuses _ieso_off			;内部/外部スイッチオーバーモード？

	id	'0100'			;Ver1.00

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

mFREE_A	=	20h			;汎用カウンターなど
mFREE_B	=	21h			;　　〃
mFREE_C	=	22h			;　　〃

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桁目(百の位､表示せず)

m7SEG_X	=	2Ah			;7セグメントLED表示変換用


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

	clr	wdt			;ウォッチドックタイマー
	mov	ra,#11011111b		;
	clr	rb			;
	mov	adcon0,#11110001b	;ｸﾛｯｸ内蔵RC設定､ﾁｬﾝﾈﾙRB7､A/D有効

	setb	rp0			;ページ変更(Bank 1へ)
;Bank 1
	mov	option_reg,#11010011b	;TMR0プリスケール1:16他
	mov	trisa,#00100000b	;RAをすべて出力ピンに設定(RA5除く)
	mov	trisb,#10000000b	;RB出力ピン設定

	mov	ansel,#01000000b	;RB7だけをアナログピンに設定

;	mov	osccon,#-000-0--b	;内蔵オシレーター周波数設定
	mov	osctune,#  011010b	;★内蔵RCオシレーター微調整

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

	setb	rp1			;ページ変更(Bank 2へ)
;Bank 2
	mov	wdtcon,#00010110b	;1:65536(単独で約2秒)
	clrb	rp1			;ページ変更(Bank 0へ戻す)
;Bank 0


;7セグメントLED全点灯チェック(電源ON時のみ)
	mov	rb,# 1111111b		;☆8
	mov	ra,#00100000b		;☆8


;約0.5秒待つ
	clr	tmr0			;
	clrb	tmr0if			;
	jnb	tmr0if,$		;
;約0.5秒待つ
	clr	tmr0			;
	clrb	tmr0if			;
	jnb	tmr0if,$		;


;ウォッチドックタイマーが動作した場合の表示
	jb	not_to,rREPEAT		;
	mov	rb,# 1111010b		;☆U
	mov	ra,#00101010b		;☆U

	setb	rp1			;ページ変更(Bank 2へ)
;Bank 2
	clrb	swdten			;WDT停止
	clrb	rp1			;ページ変更(Bank 0へ戻す)
	jmp	$			;


;↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ;
;***[ メインループ ]********************;
rREPEAT
	clr	wdt			;ウォッチドックタイマー
;A/D電圧計測
	setb	go_done			;A/D変換開始
	jb	go_done,$		;A/D変換終了(bit0)まで待つ

;A/D電圧計測結果判定
	cjb	adresh,#060,rLOW	;★-25を越える場合は"LL"表示
	cja	adresh,#088,rHIGH	;★+ 3を越える場合は"HH"表示

;A/D電圧→cmH2O変換テーブル
	cjne	adresh,#88,$+6		;
	mov	mBINA08,#0		;0cm(+3)
	cjne	adresh,#87,$+6		;
	mov	mBINA08,#0		;0cm(+2)
	cjne	adresh,#86,$+6		;
	mov	mBINA08,#0		;0cm(+1)
	cjne	adresh,#85,$+6		;
	mov	mBINA08,#0		;0cm
	cjne	adresh,#84,$+6		;
	mov	mBINA08,#01		;1cm
	cjne	adresh,#83,$+6		;
	mov	mBINA08,#02		;2cm
	cjne	adresh,#82,$+6		;
	mov	mBINA08,#03		;3cm
	cjne	adresh,#81,$+6		;
	mov	mBINA08,#04		;
	cjne	adresh,#80,$+6		;
	mov	mBINA08,#05		;
	cjne	adresh,#79,$+6		;
	mov	mBINA08,#06		;
	cjne	adresh,#78,$+6		;
	mov	mBINA08,#07		;
	cjne	adresh,#77,$+6		;
	mov	mBINA08,#08		;
	cjne	adresh,#76,$+6		;
	mov	mBINA08,#09		;
	cjne	adresh,#75,$+6		;
	mov	mBINA08,#10		;

	cjne	adresh,#74,$+6		;
	mov	mBINA08,#11		;
	cjne	adresh,#73,$+6		;
	mov	mBINA08,#12		;
	cjne	adresh,#72,$+6		;
	mov	mBINA08,#13		;
	cjne	adresh,#71,$+6		;
	mov	mBINA08,#14		;
	cjne	adresh,#70,$+6		;
	mov	mBINA08,#15		;
	cjne	adresh,#69,$+6		;
	mov	mBINA08,#16		;
	cjne	adresh,#68,$+6		;
	mov	mBINA08,#17		;
	cjne	adresh,#67,$+6		;
	mov	mBINA08,#18		;
	cjne	adresh,#66,$+6		;
	mov	mBINA08,#19		;
	cjne	adresh,#65,$+6		;
	mov	mBINA08,#20		;

	cjne	adresh,#64,$+6		;
	mov	mBINA08,#21		;
	cjne	adresh,#63,$+6		;
	mov	mBINA08,#22		;
	cjne	adresh,#62,$+6		;
	mov	mBINA08,#23		;
	cjne	adresh,#61,$+6		;
	mov	mBINA08,#24		;
	cjne	adresh,#60,$+6		;
	mov	mBINA08,#25		;


;cmH2O変換値をBCD化
	call	sBCDCAL			;BCD計算へ

;BCD→7セグメントLED表示変換
	mov	m7SEG_X,mBCD_1		;1桁目
	call	s7SEG1			;7セグメントLEDパターン変換LED表示
	mov	m7SEG_X,mBCD_2		;2桁目
	call	s7SEG2			;7セグメントLEDパターン変換LED表示

rBACK

;約0.5秒待つ
	clr	tmr0			;
	clrb	tmr0if			;
	jnb	tmr0if,$		;

	jmp	rREPEAT			;メインループ最初へ

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



;25を超えた場合(負圧が強すぎる)は｢LL｣表示とする｡
rLOW
	mov	rb,# 1100010b		;｢L｣パターンを入れる
	mov	ra,#01011010b		;｢L｣パターンを入れる
	jmp	rBACK			;

;正圧の場合は｢HH｣表示とする｡
rHIGH
	mov	rb,# 1011011b		;｢H｣パターンを入れる
	mov	ra,#10001000b		;｢H｣パターンを入れる
	jmp	rBACK			;



;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 7セグメントLED変換 ssssssssssss;

s7SEG1
	cjne	m7SEG_X,#0,$+6		;(4Words)
	mov	m7SEG_X,# 1111110b	;☆0

	cjne	m7SEG_X,#1,$+6		;
	mov	m7SEG_X,# 0011000b	;☆1

	cjne	m7SEG_X,#2,$+6		;
	mov	m7SEG_X,# 1101101b	;☆2

	cjne	m7SEG_X,#3,$+6		;
	mov	m7SEG_X,# 0111101b	;☆3

	cjne	m7SEG_X,#4,$+6		;
	mov	m7SEG_X,# 0011011b	;☆4

	cjne	m7SEG_X,#5,$+6		;
	mov	m7SEG_X,# 0110111b	;☆5

	cjne	m7SEG_X,#6,$+6		;
	mov	m7SEG_X,# 1110111b	;☆6

	cjne	m7SEG_X,#7,$+6		;
	mov	m7SEG_X,# 0011110b	;☆7

	cjne	m7SEG_X,#8,$+6		;
	mov	m7SEG_X,# 1111111b	;☆8

	cjne	m7SEG_X,#9,$+6		;
	mov	m7SEG_X,# 0111111b	;☆9

	mov	rb,m7SEG_X		;1桁目LED点灯表示

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

s7SEG2
	cjne	m7SEG_X,#0,$+6		;(4Words)
	mov	m7SEG_X,#00100010b	;☆0

	cjne	m7SEG_X,#1,$+6		;
	mov	m7SEG_X,#10101111b	;☆1

	cjne	m7SEG_X,#2,$+6		;
	mov	m7SEG_X,#01100100b	;☆2

	cjne	m7SEG_X,#3,$+6		;
	mov	m7SEG_X,#00100101b	;☆3

	cjne	m7SEG_X,#4,$+6		;
	mov	m7SEG_X,#10101001b	;☆4

	cjne	m7SEG_X,#5,$+6		;
	mov	m7SEG_X,#00110001b	;☆5

	cjne	m7SEG_X,#6,$+6		;
	mov	m7SEG_X,#00110000b	;☆6

	cjne	m7SEG_X,#7,$+6		;
	mov	m7SEG_X,#10100011b	;☆7

	cjne	m7SEG_X,#8,$+6		;
	mov	m7SEG_X,#00100000b	;☆8

	cjne	m7SEG_X,#9,$+6		;
	mov	m7SEG_X,#00100001b	;☆9

	mov	ra,m7SEG_X		;2桁目LED点灯表示

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