;LCD表示TEST-02 Ver 1.00		NAO TECHUNOHUT		2004-01-12(月)
;
;[プログラム概要]
; ･LCDを8ビットモードで｢123ABCｱｲｳ｣を表示させるだけの簡単テスト｡
;
;	┌────────┐
;	│123ABCｱｲｳ_      │
;	│                │
;	└────────┘
;
;[PIC選定仕様他]
; ･PIC16F819-I/P使用｡(秋月電子通商で350円/個)
; ･オシレーターは内部RC8MHzを使用する｡(1命令≒0.0000005秒(1/8000000*4))
;	(早めの設定にて､LCDとの信号タイミングを確認しておく｡)
; ･LCDのビジー信号をチェックする｡
; ･MCLRは外配線を簡略するため内部接続モードとする｡
;
;			     ┌─┰─┐
;	LCD_E		 RA2 ┥	     ┝ RA1	LCD_R/W
;	LCD_電源	 RA3 ┥	     ┝ RA0	LCD_RS
;	未使用		(#03)┥	     ┝(#16)	未使用
;	未使用		(#04)┥PIC16F┝(#15)	未使用
;			 Vss ┥  819 ┝ Vdd	5.0V
;	LCD_DB0		 RB0 ┥	     ┝ RB7	LCD_DB7
;	LCD_DB1		 RB1 ┥	     ┝ RB6	LCD_DB6
;	LCD_DB2		 RB2 ┥	     ┝ RB5	LCD_DB5
;	LCD_DB3		 RB3 ┥	     ┝ RB4	LCD_DB4
;			     └───┘
;
;
;-------PIC初期状態確認-----------------;(▲:変更必要)
;
;Bank 0
;	tmr0		xxxxxxxx	;　タイマー0の状態
;	status		00011xxx	;　Bankセレクト設定､各旗の状態
;	porta		xxx00000	;▲RAピン出力状態(xは不定)
;	portb		xxxxxxxx	;▲RBピン出力状態(xは不定)
;	intcon		0000000x	;　割り込み他､設定
;	pir1		-0--0000	;　旗状態(A/D､タイマー､
;	pir2		---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	;　
;	adresl		xxxxxxxx	;　A/D変換値0～8bit
;	adcon1		00--0000	;▲A/Dピン設定
;Bank 2
;	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	'16f819.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			;コードプロテクト→無効

	id	'0002'			;★LCD表示TESTの№0002


;-------プログラム開始(初期設定他)------;

;Bank 0
	clr	ra			;
	clr	rb			;
	setb	rp0			;ページ変更(Bank 1へ)
;Bank 1
	mov	trisa,#11110000b	;RA0､1､2､3ピンを出力に設定
	mov	trisb,#00000000b	;RBをすべて出力に設定

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

;	mov	osccon,#01100000b	;内蔵オシレーター周波数を4MHzに設定
;	mov	osccon,#01010000b	;内蔵オシレーター周波数を2MHzに設定
;	mov	osccon,#01000000b	;内蔵オシレーター周波数を1MHzに設定
;	mov	osccon,#00110000b	;内蔵オシレーター周波数を500kHzに設定
;	mov	osccon,#00100000b	;内蔵オシレーター周波数を250kHzに設定
;	mov	osccon,#00010000b	;内蔵オシレーター周波数を125kHzに設定
;	mov	osccon,#00000000b	;内蔵オシレーター周波数を31.25kHzに設定

	mov	adcon1,#00000110b	;A/Dをすべてデジタルに設定
	clrb	rp0			;ページ変更(Bank 0へ戻す)


LCD_RS	=	ra.0			;
LCD_RW	=	ra.1			;
LCD_E	=	ra.2			;
LCD_PW	=	ra.3			;LCD電源

mCount0	=	20h			;汎用カウンター
mCount1	=	21h			;　　〃


;=======メイン==========================;

	clr	mCount0			;

;	mov	mCount1,#31		;M1632-0Aでダメだった
;	mov	mCount1,#32		;M1632-0Aで不安定だった
;	mov	mCount1,#33		;M1632-0AでOKだがSC2004Cではダメだった
;	mov	mCount1,#75		;これでもSC2004Cではダメ
;	mov	mCount1,#76		;これでやっとSC2004CでOK!

	mov	mCount1,#128		;(76の1.5～2倍で128にしておく)


	setb	LCD_PW			;LCD電源 ON

;	call	sBUSY7			;ON直後ではビジーが使えるLCDと使えない
;					;LCDがあるのでソフトウエイトにする

rWAIT00	djnz	mCount0,rWAIT00		;LCD受付OKになる頃まで待つ
	djnz	mCount1,rWAIT00		;(8MHzの場合で計算すると0.05秒くらい)


	setb	LCD_E			;
	mov	rb,#00111000b		;ファンクションセット
	clrb	LCD_E			;
;	clr	rb			;

	call	sBUSY7			;LCD受付OKになるまで待つ
	setb	LCD_E			;
	mov	rb,#00001110b		;表示オン/オフコントロール
	clrb	LCD_E			;
;	clr	rb

	call	sBUSY7			;LCD受付OKになるまで待つ
	setb	LCD_E			;
	mov	rb,#00000110b		;エントリーモードセット
	clrb	LCD_E			;
;	clr	rb


	call	sBUSY7			;LCD受付OKになるまで待つ
	setb	LCD_RS			;
	setb	LCD_E			;
	mov	rb,#00110001b		;文字｢1｣
	clrb	LCD_E			;
	clrb	LCD_RS			;
;	clr	rb			;

	call	sBUSY7			;LCD受付OKになるまで待つ
	setb	LCD_RS			;
	setb	LCD_E			;
	mov	rb,#00110010b		;文字｢2｣
	clrb	LCD_E			;
	clrb	LCD_RS			;
;	clr	rb			;

	call	sBUSY7			;LCD受付OKになるまで待つ
	setb	LCD_RS			;
	setb	LCD_E			;
	mov	rb,#'3'			;文字｢3｣
	clrb	LCD_E			;
	clrb	LCD_RS			;
;	clr	rb			;

	call	sBUSY7			;LCD受付OKになるまで待つ
	setb	LCD_RS			;
	setb	LCD_E			;
	mov	rb,#01000001b		;文字｢A｣
	clrb	LCD_E			;
	clrb	LCD_RS			;
;	clr	rb			;

	call	sBUSY7			;LCD受付OKになるまで待つ
	setb	LCD_RS			;
	setb	LCD_E			;
	mov	rb,#01000010b		;文字｢B｣
	clrb	LCD_E			;
	clrb	LCD_RS			;
;	clr	rb			;

	call	sBUSY7			;LCD受付OKになるまで待つ
	setb	LCD_RS			;
	setb	LCD_E			;
	mov	rb,#'C'			;文字｢C｣
	clrb	LCD_E			;
	clrb	LCD_RS			;
;	clr	rb			;

	call	sBUSY7			;LCD受付OKになるまで待つ
	setb	LCD_RS			;
	setb	LCD_E			;
	mov	rb,#10110001b		;文字｢ｱ｣
	clrb	LCD_E			;
	clrb	LCD_RS			;
;	clr	rb			;

	call	sBUSY7			;LCD受付OKになるまで待つ
	setb	LCD_RS			;
	setb	LCD_E			;
	mov	rb,#10110010b		;文字｢ｲ｣
	clrb	LCD_E			;
	clrb	LCD_RS			;
;	clr	rb			;

	call	sBUSY7			;LCD受付OKになるまで待つ
	setb	LCD_RS			;
	setb	LCD_E			;
	mov	rb,#'ｳ'			;文字｢ｳ｣
	clrb	LCD_E			;
	clrb	LCD_RS			;
;	clr	rb			;


	sleep				;PICをスリープにしてプログラム終了

;sssssss LCDビジーチェック sssssssssssss;

sBUSY7
	setb	rp0			;ページ変更(Bank 1へ)
;Bank 1
	mov	trisb,#10000000b	;RB7を入力に変更
	clrb	rp0			;ページ変更(Bank 0へ戻す)

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

	setb	rp0			;ページ変更(Bank 1へ)
;Bank 1
	mov	trisb,#00000000b	;RB7を出力に変更
	clrb	rp0			;ページ変更(Bank 0へ戻す)

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