/***********************************************************************/
/*                                                                     */
/*  FILE        :SCI_lib.h                               　            */
/*  DATE        :Thu, Jun 12, 2008                                     */
/*  DESCRIPTION :RS232Cによるシリアル通信用　　　　　　　              */
/*  CPU TYPE    :H8/3664F  by T.AZAMI                                  */
/*  This file is generated by Renesas Project Generator (Ver.4.8).     */
/*                                                                     */
/***********************************************************************/
                  
/*  このプログラムでは、割り込みを使っていません。

void          SCI_init( void )						シリアル通信初期化ルーチン
unsigned char SCI_rx( void )						シリアル１文字受信ルーチン
unsigned char SCI_tx( char data )					シリアル１文字送信ルーチン  0xFF=送信成功、0=失敗
unsigned char SCI_print( char *str )				シリアル文字列送信ルーチン　文字列の最後は'\0'
void          SCI_crlf( void )								シリアル CR/LFを送信
unsigned char SCI_print_hex(int digit, unsigned long data)	数値を指定した桁数で　16進文字列として送信
unsigned char SCI_print_dec( unsigned long data )			数値を10進文字列として送信

　　8bit、パリティなし、STOP１ビット　9600bps　　　　*/

//--------------------------------------------------------------
//   ウエイトサブルーチン
//--------------------------------------------------------------
void SCI_wait_msec(int msec)
{
	int i,j;
	for ( i=0; i<msec; i++ ){
		for( j=0; j<2000; j++ ); 		// j=2000 で 約1ms
	}
}

//-------------------------------------------------------------------
//　　シリアル通信初期化ルーチン
//-------------------------------------------------------------------
void SCI_init( void ){
	SCI3.SCR3.BYTE = 0x00;			//全ての送受動作と割り込みを禁止
	SCI3.SMR.BYTE  = 0x00;			//調歩同期、データ8bit、パリティなし、STOP１ビット
	SCI3.BRR =51;					//ボーレート 9600bps
	SCI_wait_msec(1);
	SCI3.SCR3.BYTE = 0x30;			//b00110000;		//TX,RX有効
	SCI3.SSR.BYTE  = 0x80;			//b10000000;		//ステータスビットのクリア
	IO.PMR1.BIT.TXD = 1;			//PMR1.bit TXD を1にすることでTXD出力端子が使用可能になる
}

//-------------------------------------------------------------------
//　　シリアル１文字受信ルーチン
//-------------------------------------------------------------------
unsigned char SCI_rx(void){
	char data;
	while ((SCI3.SSR.BYTE & 0x78) == 0 );		//b01111000 データ受信フラグまたは受信エラーフラグが立つまで待つ
	if (SCI3.SSR.BIT.RDRF == 1){				//受信データが正常にRDRレジスタに転送された時
		data = SCI3.RDR;
		SCI3.SSR.BIT.RDRF = 0;					//フラグのクリア
		return(data);
	}else{										//エラー時の処理
		SCI3.SSR.BYTE &= 0xC7;					//b11000111 エラーフラグをクリア
		return(0xff);							//エラー時は0xFFを返す
	}
}

//-------------------------------------------------------------------
//　　シリアル１文字送信ルーチン
//-------------------------------------------------------------------
unsigned char SCI_tx( char data ){
	unsigned int i;
	unsigned char flag=0;
	while ( i<20000 ){
		if( SCI3.SSR.BIT.TDRE ){	 		//TDREが0の場合はTDRに未送信のデータがあるため待つ
			flag = 0xFF;
			SCI3.TDR = data;				//TDRに送信データを入れる
			break;
		}
		i++;
	}
	while (i<20000)
	{
		if( flag == 0 ){
			break;
		}
		if( SCI3.SSR.BIT.TEND == 0 ){	//データ送信を確認
			flag = 0xFF;
			break;
		}
		i++;
	}
	return flag;						//0xFF=送信成功、0=失敗
}

//-------------------------------------------------------------------
//　　シリアル文字列送信ルーチン　文字列の最後は'\0'
//-------------------------------------------------------------------
unsigned char SCI_print( char *str ){
	unsigned char flag=0xFF;
	while ( *str != '\0' ){
		flag = SCI_tx( *str ); 
		if( flag = 0 ){
			break;
		}
		str++;
		SCI_wait_msec(1);
	}
	return flag;						//0xFF=送信成功、0=失敗
}

//-------------------------------------------------------------------
//　　シリアル CR/LFを送信
//-------------------------------------------------------------------
unsigned char SCI_crlf( void ){
		SCI_tx('\r');
		SCI_tx('\n');
}

//-------------------------------------------------------------------
//　　数値を指定した桁数で　16進文字列として送信
//-------------------------------------------------------------------
unsigned char SCI_print_hex(int digit, unsigned long data)
{
	unsigned char i,j,flag,hex;
	//char d_char[5] = "     ";
	
	i = digit-1;
	do{
		j = digit * i;
		hex = ( (data>>j) & 0x0f ) + 0x30;
		if( hex >0x39 ){
		 	hex += 0x07;
		}
		//d_char[i] = hex;
		flag = SCI_tx( hex );
		i = i-1;
	}while( j>0 );
	return flag;
}

//-------------------------------------------------------------------
//　　数値を10進文字列として送信
//-------------------------------------------------------------------
unsigned char SCI_print_dec( unsigned long data )
{
	unsigned char i,temp;
    unsigned char strtemp[10]="          ";

	i=0;	
	do {
        temp = data % 10;
        strtemp[i++] = temp + '0';
    } while (( data /= 10 ) != 0);
    do{
		i--;
		SCI_tx( strtemp[i] );
	}while( i>0 );
}
