
#include "iodefine.h"	//マイコン設定に必要な情報読み込み

//関数のプロトタイプ宣言
//こういう関数を使いますよという予告の役割
void hardware_setup(void);
void set_LED_R(int);
void set_LED_G(int);
int get_sw1(void);
int get_PortA_bit(int);
void set_PortE_bit(int,int);


//プロトタイプ宣言をしておくと関数の実体はどこに書いても良くなる。

////////////////////// ここからメイン処理 //////////////////////

main(){
	int i;
	int bit_state;
	hardware_setup();	//マイコンの端子を初期化
	set_LED_R(0);		//とりあえずLED赤消灯
	set_LED_G(0);		//とりあえずLED緑消灯
	while(1){
		if(get_sw1()){		//スイッチ1がON:下の時
			set_LED_R(1);	//LED赤点灯
			set_LED_G(0);	//LED緑消灯
			set_PortE_bit(4,0);		//PortEの4ビット目をOFF
			set_PortE_bit(5,0);		//PortEの5ビット目をOFF
			set_PortE_bit(6,0);		//PortEの6ビット目をOFF
			set_PortE_bit(7,0);		//PortEの7ビット目をOFF
		}else{				//スイッチ1がON:下じゃない時(OFF:上)
			set_LED_R(0);	//LED赤消灯
			set_LED_G(1);	//LED緑点灯
			set_PortE_bit(4,1);		//PortEの4ビット目をON
			set_PortE_bit(5,1);		//PortEの5ビット目をON
			set_PortE_bit(6,1);		//PortEの6ビット目をON
			set_PortE_bit(7,1);		//PortEの7ビット目をON
		}
	}
}

////////////////////// ここから関数の実体 //////////////////////

void hardware_setup(void){
    //ポートEの特殊機能設定
    //今回はポートEの0〜15を全て汎用IOに設定する(特殊機能不使用)
    PFC.PECRL4.WORD = 0x0000;    //PE15-12
    PFC.PECRL3.WORD = 0x0000;    //PE11-08
    PFC.PECRL2.WORD = 0x0000;    //PE07-04
    PFC.PECRL1.WORD = 0x0000;    //PE03-00

    //ポートEの入出力を設定する
    //7,6,3,2を入力それ以外は出力
    //1111 1111 1111 0011(2進数)
    //   F    F    F    3(16進数)
    PFC.PEIORL.WORD = 0xFFF3;
    // ！！！注意！！！
    //ベースボードを接続する場合PE02は出力に設定しないこと。

    //ポートAの特殊機能設定
    PFC.PACRL4.WORD = 0x0000;    //PA15-12
    PFC.PACRL3.WORD = 0x0000;    //PA11-08

    //ポートAの入出力を設定する
		PFC.PAIORL.WORD = 0x0000;	//全部入力

}

/*============= LED赤の出力関数(0:消灯、1:点灯) =============*/
void set_LED_R(int on){
	if(on==0)	//関数への入力が0の時
		PE.DRL.BIT.B0=0;	//消灯
	else		//それ以外(入力が0の時)
		PE.DRL.BIT.B0=1;	//点灯
}

/*============= LED緑の出力関数(0:消灯、1:点灯) =============*/
void set_LED_G(int on){
	if(on==0)	//関数への入力が0の時
		PE.DRL.BIT.B1=0;	//消灯
	else		//それ以外(入力が0の時)
		PE.DRL.BIT.B1=1;	//点灯
}

/*============= SW1の状態取得関数(SW1上:0、SW1下:1)=============*/
int get_sw1(void){
	return PE.DRL.BIT.B2;
}


/*============= PortA 10-15入力関数(ビット番号) =============*/
int get_PortA_bit(int bit){
	int state=0;	//変数を宣言しておく
	int outdata=0;	//変数を宣言しておく

	if( bit<10 || bit>15 )	//関係ない端子を指定した場合
		return -1;			//0,1以外の数値を返して強制終了
   
	state = PA.DRL.WORD&(0x0001<<bit);	//0または0以外の値として取得
	outdata = (state==0)? 0 : 1 ;		//0-1に変換
//	outdata = (state==0)? 1 : 0 ;		//0-1に変換(反転)
	return outdata;	//指定したポートの状態を返す
}

/*============= PortE 4-7出力関数(ビット番号、ON/OFF) =============*/
void set_PortE_bit(int bit,int on){
	int outdata=0;

	if( bit<4 || bit>7 )	//関係ない端子を指定した場合
		return;				//ここでこの関数を強制終了

	outdata=0x0001<<bit;

	if(on==0){	//OFFする場合
		PE.DRL.WORD &=~outdata;	//OFF 指定したビットのみ０にする
	}else{
		PE.DRL.WORD |= outdata;	//ON 指定したビットのみ１にする
	}
}

/*============= ここまで =============*/