/***********************************************************************/
/*                                                                     */
/*  FILE        :test_For_Loop.c   by T.AZAMI                          */
/*  DATE        :Sun, Sep 15, 2007                                     */
/*  DESCRIPTION :Main Program                                          */
/*  CPU TYPE    :H8/3664F                                              */
/*                                                                     */
/*  For Loop の時間測定テストプログラム　                              */
/*                                                                     */
/***********************************************************************/
                  
#include "iodefine.h"			// HEW用ヘッダファイル
#include "dec_to_bin.h"			// 自作バイナリ数値の定義ファイル　ex.b00000111 = 7
#include "LCD.h"				// LCDライブラリ

#define KEY1	IO.PDR8.BIT.B0
#define KEY2	IO.PDR8.BIT.B1
#define KEY3	IO.PDR8.BIT.B2

#define LED1	IO.PDR8.BIT.B6
#define LED2	IO.PDR8.BIT.B7

#define KEY_ON	0
#define KEY_OFF	1

#define LED_ON 	0
#define LED_OFF	1

#define ON		0
#define OFF		1

volatile char Msg0[] = "For Loop Time c \0";	// 表示文字列1行目
volatile char Msg1[] = "n=1000        nS\0";	// 表示文字列2行目


//--------------------------------------------------------------
//   ウエイトサブルーチン　時間的には不正確
//--------------------------------------------------------------
void Wait_msec(int msec)
{
	int i,j;
	// return;  //デバック時使用  
	for ( i=0; i<msec; i++ ){
		for( j=0; j<2000; j++ ); 		// j=2000 で 約1ms
	}
}

//--------------------------------------------------------------
//   キー入力サブルーチン　戻り値はSW番号(1〜3)
//--------------------------------------------------------------
unsigned char KEY_input(void)
{
	unsigned int flag = 1;
	unsigned int Key_data = 0;
	
	while ( flag ){
		Delay_ms ( 100 );			// Delay_ms関数はLCD.h中のものを利用する
		if ( KEY1 == ON ){
			flag = 0;
			Key_data = 1;
		} else if ( KEY2 == ON ){
			flag = 0;
			Key_data = 2;
		} else if ( KEY3 == ON ){
			flag = 0;
			Key_data = 3;
		} else {
			flag = 1;
			Key_data = 0;
		}
	}

	return Key_data;
}

//--------------------------------------------------------------
//   数値から文字列に変換(Char型）
//--------------------------------------------------------------
void Itostring(int digit, unsigned long data, char *buffer)
{
	char i;	
	buffer += digit;						//文字列の最後
	for(i=digit; i>0; i--)					//最下位桁から上位へ
	{	
		buffer--;							//ポインター１
		*buffer = (data % 10) + '0';		//その桁数値を文字にして格納
		data = data / 10;					//桁-1
	}
}

//--------------------------------------------------------------
//   数値から文字列に変換(Char型）ゼロサプレス処理済み
//--------------------------------------------------------------
void Itostring_zs(int digit, unsigned long data, char *buffer)
{
	char i;
	char f = 0;	
	Itostring( digit, data, buffer );

	for(i=1; i<digit; i++){					//最初からの桁がゼロの場合空白に置き換える
		if ((f == 0) && (*buffer == '0')){
			*buffer = ' ';
		}else{
			f = 1;							//ゼロ以外の数値に来たらフラグを立てて処理しない
		}
		buffer++;
	}
}

//--------------------------------------------------------------
//　メインルーチン
//--------------------------------------------------------------

void main( void ) 
{ 
	unsigned char Key_flag;
	unsigned char Loop_flag;
	unsigned int  n, i, j;
	unsigned long cnt;

	LCD_init( 16 );				//　LCD初期化
	LCD_cursol( 1 );			//　カーソルモード設定
	
	IO.PCR8 = b11000000;		// P87,P86をLED出力ポートに設定
								// (dec_to_bin.h で2進表記を定義している)
	
	TW.TCRW.BYTE = b00000000;	// タイマWコントロールレジスタ　クロックΦ
	TW.TMRW.BIT.CTS = 0;		// カウンタ停止
	
	LED1 = OFF;					// 秒単位点滅用LED
	LED2 = ON;					// 設定時点灯LED
	
	LCD_lineprint( 1, 1, Msg0 );
	LCD_lineprint( 1, 2, Msg1 );
	
	Key_flag = 0;
	n=1000;	
	while (1){
		
		Key_flag = KEY_input();
		
		switch( Key_flag ){
			case 1:						// SW1で設定値n-10
				if( n>0 ){
					n = n - 10;
					Itostring_zs( 5, n, Msg1+2 );
					LCD_locate( 1, 2 );
					LCD_print( Msg1 );	
				}
				break;			
			case 2:						// SW1で設定値n+10
				if( n<0xFFFF ){
					n = n + 10;
					Itostring_zs( 5, n, Msg1+2 );
					LCD_locate( 1, 2 );
					LCD_print( Msg1 );	
				}
				break;
			case 3:
										// タイマ・スタート
				LED1 = ON;
				LED2 = OFF;
				TW.TCNT = 0;			// カウンタ 0
				TW.TMRW.BIT.CTS = 1;	// カウンタ　スタート
		
				for( i=0; i<n; i++ );
		
				TW.TMRW.BIT.CTS = 0;	// カウンタ停止
				LED1 = OFF;
				LED2 = ON;
				cnt = TW.TCNT;
				Itostring_zs( 5, cnt, Msg0+9 );
				LCD_lineprint( 1, 1, Msg0 );
				cnt = cnt * 625 / 10000;	
				Itostring_zs( 5, cnt, Msg1+9 );
				LCD_lineprint( 1, 2, Msg1 );	
				
				Key_flag = 1;			// 設定した数値の1000倍の速度でLED点滅
				while( Key_flag ){
					LED2 = ~LED2;
					for( j=0; j<1000; j++){
						for( i=0; i<n; i++ );
					}
					if( KEY1 == ON | KEY2 == ON){
						Key_flag = 0;
					}
				}
				LED2 = ON;
				break;
		}
		
		
		
	}
}
		
	
#ifdef __cplusplus
void abort(void)
{
	
}
#endif