//LCD用制御関数
//作成日：2011/03/19
//作成者：KK
#include<p18f4620.h>
#include<delays.h>		//遅延関数ヘッダ
#include"lcd_c18.h"		//LCD用ヘッダファイル

/*=====LCDデータ送信=====*/
void lcd_out(char d,char flag) {
	LCD_RW = 0;
	LCD_DATA = (LCD_DATA & 0x0F) | (d & 0xF0); //上位ビットを出力
	if(flag == 0){
		LCD_RS = 1;
	}
	else{
		LCD_RS = 0;
	}		
	Delay10TCYx(1);
	LCD_E = 1;
	Delay10TCYx(1);
	LCD_E = 0;
}

/*=====LCDコマンド出力=====*/
void lcd_cmd(char cmd){
	LCD_RW = 0;
	//上位４ビット書き込み
	lcd_out(cmd,1);
	//下位４ビット書き込み
	lcd_out(cmd << 4,1);

	if((cmd & 0x03) != 0){	// Clear homeの場合
		Delay10KTCYx(2);	// 2msec待ち
	}	
	else{
		Delay10TCYx(50);	// 50usec待ち
	}	
}

/*=====LCD１文字出力=====*/
void lcd_data(char asci){
	LCD_RW = 0;
	//上位４ビット書き込み
	lcd_out(asci,0);
	//下位４ビット書き込み
	lcd_out(asci << 4,0);
	
	Delay10TCYx(50);	//50us wait
}

/*=====LCD文字列出力=====*/
void lcd_str(char *str){
	//文字列から１文字ずつ出力。0x00で終了
	unsigned char w,q;
	for(q=0;;q++){
		w = str[q];
		if(w == 0x00){
			break;
		}
		lcd_data(w);
	}
}

/*=====LCD数値出力=====*/
//未完成
void lcd_num(char digit,unsigned int lcd_dat){
	char w;
	char *buff;
	for(w=digit ; w>0 ; w--){
		buff--;
		*buff = (lcd_dat % 10) + '0';
		lcd_dat = lcd_dat / 10;
	}
	lcd_str(buff);
}

/*=====LCD数値文字列追加=====*/
/*
digit・・・・・挿入する数値の桁
lcd_dat・・・数値
*buff・・・・・挿入する文字列の場所（後方に ＋数値 で位置移動）
*/
void lcd_put_num(char digit,unsigned int lcd_dat,char *buff){
	char w;
	buff += digit;						//最後の数字位置指定
	for(w=digit ; w>0 ; w--){			//下位から上位へ変換
		buff--;							//デクリメント
		*buff = (lcd_dat % 10) + '0';	//ASCII変換
		lcd_dat = lcd_dat / 10;			//次の桁へ
	}
}

/*lcdに指定した値を指定したアドレスに10進数に変換して表示*/
void lcd_put10(char c)
// <---unsigned int c
{
	while(c > 0){
		if(c < 10){
			lcd_data((c%15)+0x30);
		}
		else{	
			lcd_data(((c%15)-10)+0x41);
		}	
		c = c/15;
	}
}
		
/*=====LCD全消去=====*/
void lcd_clear(void){
	char clr[]="                ";
//	lcd_cmd(0x01);		//Clear コマンド
//	Delay10KTCYx(15);	//15ms wait
	lcd_cmd(0x80);
	lcd_str(clr);
	lcd_cmd(0xc0);
	lcd_str(clr);
}

/*=====LCD初期位置=====*/
void lcd_home(void){
	lcd_cmd(0x02);		//Home コマンド
}
	
/*=====LCD初期設定=====*/
void lcd_init(void){
	LCD_RW = 0;
	Delay10KTCYx(30);	//15ms wait
	lcd_out(0x03,1);	//8bit mode set
	Delay10KTCYx(5);	//5ms wait
	lcd_out(0x03,1);	//8bit mode set
	Delay10KTCYx(1);	//1ms wait
	lcd_out(0x03,1);	//8bit mode set
	Delay10KTCYx(1);	//1ms wait
	lcd_out(0x02,1);	//4bit mode set
	Delay10KTCYx(1);	//1ms wait
	
	lcd_cmd(0x2E);		//DL=0 4bit mode
	lcd_cmd(0x08);		//Display OFF
	lcd_cmd(0x0D);		//Display ON
	lcd_cmd(0x06);		//Entry mode set
	lcd_cmd(0x02);		//Cursor Home
}
