/***********************************************************************/
/*                                                                     */
/*  FILE        :test_TimerA.c   by T.AZAMI                            */
/*  DATE        :Sun, Sep 02, 2007                                     */
/*  DESCRIPTION :Main Program                                          */
/*  CPU TYPE    :H8/3664F                                              */
/*                                                                     */
/*  This file is generated by Renesas Project Generator (Ver.4.8).     */
/*                                                                     */
/***********************************************************************/
                  

#ifdef __cplusplus
extern "C" {
void abort(void);
#endif
void main(void);
#ifdef __cplusplus
}
#endif


// −−−−−−−−−−  ここから −−−−−−−−−−

#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 unsigned int Total_count;				// タイマカウント用変数
volatile unsigned int Tma_count;				// タイマカウント用変数
volatile unsigned char Hour,Second,Minute;		// 時間表示用変数
volatile char Msg1[] = "Watch   :  :    \0";	// 表示文字列


//--------------------------------------------------------------
//   キー入力サブルーチン　戻り値はSW番号(1〜3)
//--------------------------------------------------------------
unsigned char KEY_input(void)
{
	unsigned int flag = 1;
	unsigned int Key_data = 0;
	
	while ( flag ){
		Delay_ms ( 100 );
		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
	}
}

//--------------------------------------------------------------
//　時刻の表示ルーチン
//--------------------------------------------------------------
void Time_disp(void)
{
	Itostring( 2, Hour, Msg1+6 );
	Itostring( 2, Minute, Msg1+9 );
	Itostring( 2, Second, Msg1+12 );
	LCD_locate( 1, 1 );
	LCD_print( Msg1 );	
}

void Time_update(void)
{
	Second++;
	if(Second == 60){					// 60秒か？
		Second = 0;	
		Minute++;						// 分カウントアップ
		if(Minute == 60){				// 60分か？
			Minute = 0;
			Hour++;						// 時カウントアップ
			if(Hour == 24){				// 24時か？
				Hour = 0;
			}
		}
	}
	
	Time_disp();	
}

//--------------------------------------------------------------
//　時刻設定時の変数繰上げ、繰り下げ処理
//--------------------------------------------------------------
void Time_set_up(void)
{
	Second = 0;
	Minute++;						// 分カウントアップ
	if(Minute == 60){				// 60分か？
		Minute = 0;
		Hour++;						// 時カウントアップ
		if(Hour == 24){				// 24時か？
			Hour = 0;
		}
	}
	Time_disp();	
}

void Time_set_down(void)
{
	Second = 0;
	Minute--;						// 分カウントダウン
	if(Minute == 0xff){				// 0分か？
		Minute = 59;
		Hour--;						// 時カウントアップ
		if(Hour == 0xff){			// 24時か？
			Hour = 23;
		}
	}
	Time_disp();
}


//--------------------------------------------------------------
//　Timer A 割込み時の処理ルーチン intprg.c-vect19からここへ飛ぶ
//--------------------------------------------------------------
void Subroutine_TimerA(void)
{
	IRR1.BIT.IRRTA = 0;			// Timer A 割込みフラグのリセット

	LED1 = ~LED1;				// LEDポート反転
	
	Time_update();				// 時刻の表示

}

//--------------------------------------------------------------
//　メインルーチン
//--------------------------------------------------------------

void main( void ) 
{ 
	unsigned char Key_flag;
	unsigned char Loop_flag;

	LCD_init( 16 );				//　LCD初期化
	LCD_cursol( 1 );			//　カーソルモード設定
	
	IO.PCR8 = b11000000;		// P87,P86をLED出力ポートに設定
								// (dec_to_bin.h で2進表記を定義している)
	LED1 = ON;					// 秒単位点滅用LED
	LED2 = OFF;					// 時刻設定時点灯LED
	
	LCD_lineprint( 1, 1, Msg1 );
	LCD_lineprint( 1, 2, "SW3->Time Set   " );
	
	TA.TMA.BYTE = b00001000;	// 1ms 毎にTimer A が割込みをかけるよう設定 
	IRR1.BIT.IRRTA = 0;			// Timer A 割込みフラグのリセット
	IENR1.BIT.IENTA = 1;		// 割込み許可
	Key_flag = 0;
	
	while (1){
		
		Key_flag = KEY_input();			// 割込み時以外はキー入力ルーチンでループしている
		
		if ( Key_flag == 3 ){			// SW3が押されたら時刻設定処理
			IENR1.BIT.IENTA = 0;		// 割込み停止
			LED1 = OFF;					// 秒表示LED消灯
			LED2 = ON;					// 時刻設定LED点灯
			LCD_lineprint( 1, 2, "1:Up 2:Dwn 3:End" );
			Delay_ms ( 800 );			
			
			Loop_flag = 1;
			while( Loop_flag ){
				
				Key_flag = KEY_input();
				switch( Key_flag ){
					case 1:
						Time_set_up();
						break;
					case 2:
						Time_set_down();
						break;
					case 3:							// 時刻設定終了
						LED2 = OFF;
						Delay_ms ( 500 );
						IENR1.BIT.IENTA = 1;		// 割込み許可
						LCD_lineprint( 1, 2, "SW3->Time Set   " );
						Loop_flag = 0;
						break;
				}	
			}	
		}
	}
}
		
	
#ifdef __cplusplus
void abort(void)
{
	
}
#endif
