
/*	ＡＤコンバータと１６文字＊２行ＬＣＤの接続 	*/
/* 							*/
/*	概要						*/
/*	ＡＤコンバータの電圧入力（０〜５Ｖ）を		*/
/*	１６×２行液晶に0000mV〜5000mVで表示する。	*/
/*	表示後はふたたびＡＤ入力を繰り返す。		*/
/* 							*/
/*	ＡＤコンバータ入力（単一モード）		*/
/*		AN0(ポート７　0ＣＨ）			*/
/* 							*/
/*	液晶接続					*/
/*		データ＝ポート１			*/
/*		Ｅ　　＝ポート２のビット０		*/
/*		ＲＳ　＝ポート２のビット１		*/
/* 							*/
/*	液晶接続					*/
/*	Ｈ８マイコン	ＬＣＤ				*/
/*	Ｐ１−０	Ｄ０				*/
/*	Ｐ１−１	Ｄ１				*/
/*	Ｐ１−２	Ｄ２				*/
/*	Ｐ１−３	Ｄ３				*/
/*	Ｐ１−４	Ｄ４				*/
/*	Ｐ１−５	Ｄ５				*/
/*	Ｐ１−６	Ｄ６				*/
/*	Ｐ１−７	Ｄ７				*/
/*	Ｐ２−０	Ｅ				*/
/*	Ｐ２−１	ＲＳ				*/
/*	ＧＮＤ		Ｒ／Ｗ				*/
/*	ＧＮＤ		Ｖｓｓ				*/
/*	Ｖｓｓ(5V)	Ｖｄｄ				*/




#define	tris1	(volatile unsigned char *)0xffffc0
#define	tris2	(volatile unsigned char *)0xffffc1
#define	p1	(volatile unsigned char *)0xffffc2
#define	p2	(volatile unsigned char *)0xffffc3
#define	adcsr	(volatile unsigned char *)0xffffe8
#define	addrah	(volatile unsigned char *)0xffffe0
#define	addral	(volatile unsigned char *)0xffffe1


int	buff[1024];


int	wait_ad()		/* 変換終了＝０、変換中＝１を返す */
{
	return (*adcsr & 0x80) ? 0 : 1;
}


int	getad()
{
	*adcsr |= 32;		/* AD変換開始！ */
	
	while(wait_ad()){};	/*変換終了を待つ*/
	
	return (int)(*addrah<<2) + (int)(*addral>>6);
}



int	wait2(int t)
{
	return t;
}



void	wait(int times)				/* 少し待つ */
{
	if(times<0)	return;
	wait2(times);
	wait2(times);
	wait2(times);
	wait2(times);
	wait2(times);
	wait(times-1);
}


void	write_lcd(int code, int rs)	/* 液晶出力 */
{
	volatile int	i;
	
	*p1 = code;			/* D0-D7 に設定 */
	if(rs)
		*p2 |= 2;		/* RSを設定 */
	else	*p2 &= 0xfd;
	
	wait(100);
	*p2 |= 1;			/* E = 'H' */
	wait(100);
	*p2 &= 0xfe;			/* E = 'L' */
	wait(100);
}


void	locate(int x, int y)		/* 液晶のカーソル位置を設定 */
{
	write_lcd(0x80+x+y*0x40, 0);
}

void	write_char(char c)		/* 液晶に１文字送る */
{
	write_lcd(c, 1);
}

void	write_str(char *s)		/* 液晶に文字列を送る */
{
	while(*s){
		write_lcd(*s, 1);
		s++;
	}
}

void	write_unit(long d)		/* 液晶に電圧を表示する */
{
	char	s[8];
	int	i;
	
	for(i=0;i<8;i++){
		s[i] = d % 10L;
		d/=10L;
	}
	
	i=8;
	write_char(s[--i]+'0');
	write_char(s[--i]+'0');
	write_char(s[--i]+'0');
	write_char(s[--i]+'0');
	write_char(s[--i]+'0');
	write_char('.');
	write_char(s[--i]+'0');
	write_char(s[--i]+'0');
	write_char(s[--i]+'0');
	write_char('V');
}




main()
{
	int	i,k,l;
	int	d;

	*tris1 = 0xff;		/* PD1 を出力 */
	*tris2 = 0xff;		/* PD2 を出力 */
	*adcsr = 0x08;		/*ＡＤ設定単一モード、ＡＮ０のみ使用*/
	
	*p1 = *p2 = 0;
	
	wait(100);
	write_lcd(0x30, 0);	/* 液晶初期化 */
	wait(100);
	write_lcd(0x30, 0);
	write_lcd(0x30, 0);
	write_lcd(0x38, 0);
	write_lcd(0x0e, 0);
	write_lcd(0x06, 0);
	
	locate(0,0);
	write_str("H8/3048FADsample");	/* タイトル表示 */
	
	for(d=0;d<1024;d++)
		buff[d] = 0;	/* バッファのクリア（参考） */
	while(1){
		d = getad();
		d = (int)(((double)d * (5.0 / 1023.0) * 1000.0 ) + 0.5);
		
		locate(0,1);
		write_str("VOLT:");
		write_unit((long)d);
	}
}

