/* main.c */

/* 特殊機能レジスタ（SFR）へのアクセス記述を使用する */
#include "iodefine.h"

/* 12ビット・インターバル・タイマ割込み処理割付 */
#pragma interrupt it_interrupt(vect = INTIT)

#define ONOFF_TIME_05S 100U					/* LED点滅時間：ONとOFF各0.5 秒 */

static unsigned char flag_5ms = 0U;				/* 5 ms経過フラグ */
void main(void);						/* 関数プロトタイプ宣言 */

void main(void){
	__DI();							/* 割込みを禁止する */

	/* ポートの設定(P121:入力(スイッチ)、P14:出力(LED)) */
	P1_bit.no4 = 1U;					/* ポート14の出力をHigh(1)に設定 */
	PMC1_bit.no4 = 0U;					/* ポート14をデジタル入出力に設定 */
	PM1_bit.no4 = 0U;					/* ポート14を出力に設定 */

	/* インターバル・タイマの設定（5 ms周期） */
	TMKAEN = 1U;						/* クロック供給 */
	OSMC = 0x10U;						/* 低速オンチップ・オシレータ・クロック（fIL）供給 */
	ITMC = 0x004AU;						/* 割込み周期 5 ms = [1/15kHz]×(74 + 1) */
	TMKAMK = 1U;						/* INTIT 割込みの禁止 */
	TMKAIF = 0U;						/* INTIT 割込み要求フラグのクリア */
	TMKAPR0 = 1U;						/* INTIT の割込み優先順位をレベル3（最低優先順位）に設定 */
	TMKAPR1 = 1U;

	/* インターバル・タイマ開始 */
	TMKAIF = 0U;						/* INTIT 割り込み要求フラグのクリア */
	TMKAMK = 0U;						/* INTIT 割り込みの許可 */
	ITMC |= 0x8000U;					/* カウンタ動作開始 */

	__EI();							/* 割込みを許可する */

	while(1){						/* メインループ */
		static unsigned char switch_tmp = 1U;		/* スイッチ入力の一次記憶値 */
		static unsigned char switch_level = 1U;		/* スイッチ入力の確定値 */
		static unsigned char f_led_blink = 0U;		/* 点滅状態フラグ */
		static unsigned int counter_5ms = 0U;		/* 点滅用カウンタ(5 ms単位) */


		/* 5 ms周期となるように待つ */
		while(flag_5ms == 0U){				/* 5 ms経過していなければループ */
		}
		flag_5ms = 0U;					/* フラグをクリア */
		switch_tmp = (switch_tmp << 1) + P12_bit.no1;	/* スイッチ入力の取り込み */
		if(switch_tmp == 0xFFU){			/* スイッチ入力8回連続1の場合 */
			switch_level = 1U;			/* スイッチレベル1の確定 */
		}else if(switch_tmp == 0x00U){			/* スイッチ入力8回連続0の場合 */
			if(switch_level == 1U){			/* スイッチ押下（前回OFF） */
				if(f_led_blink == 1U){		/* LED点滅の場合は消灯にする */
					f_led_blink = 0U;	/* LED点滅フラグOFF */
					P1_bit.no4 = 1U;
				}else if(P1_bit.no4 == 1U){	/* LED消灯の場合は点灯にする */
					f_led_blink = 0U;	/* LED点滅フラグOFF */
					P1_bit.no4 = 0U;
				}else{				/* LED点灯の場合は点滅にする */
					f_led_blink = 1U;	/* LED点滅フラグON */
					counter_5ms = 0U;	/* 点滅用カウンタをクリア */
				}
			}
			switch_level = 0U;			/* スイッチレベル0の確定 */
		}
		if(f_led_blink == 1U){				/* 点滅の実行 */
			if(counter_5ms > 0U){			/* カウンタが0より大きければ */
				counter_5ms = counter_5ms - 1U;	/* カウンタをカウントダウン */
			}else{					/* カウンタが0になったら */
				P1_bit.no4 = ~P1_bit.no4;	/* ＬＥＤ出力を反転（消灯⇔点灯） */
				counter_5ms = ONOFF_TIME_05S;	/* カウンタを0.5 秒に設定 */
			}
		}

	}
}

/* インターバル・タイマ割込み処理（5 ms周期） */
static void it_interrupt(void){
	flag_5ms = 1U;						/* 5 ms経過毎にフラグを立てる */
}
