/****************************************************************************
	CQBB-EL プッシュスイッチ割り込みテストプログラム
****************************************************************************/

#include <intrinsics.h>

/* システムコントローラ */
#define SYS_SCS			((volatile unsigned int *)(0xE01FC1A0))

/* FGPIOコントローラ */
#define FGPIO_FIO0DIR	((volatile unsigned int *)(0x3FFFC000))
#define FGPIO_FIO0MASK	((volatile unsigned int *)(0x3FFFC010))
#define FGPIO_FIO0PIN	((volatile unsigned int *)(0x3FFFC014))
#define FGPIO_FIO0SET	((volatile unsigned int *)(0x3FFFC018))
#define FGPIO_FIO0CLR	((volatile unsigned int *)(0x3FFFC01C))

#define FGPIO_FIO1DIR	((volatile unsigned int *)(0x3FFFC020))
#define FGPIO_FIO1MASK	((volatile unsigned int *)(0x3FFFC030))
#define FGPIO_FIO1PIN	((volatile unsigned int *)(0x3FFFC034))
#define FGPIO_FIO1SET	((volatile unsigned int *)(0x3FFFC038))
#define FGPIO_FIO1CLR	((volatile unsigned int *)(0x3FFFC03C))

#define FGPIO_FIO2DIR	((volatile unsigned int *)(0x3FFFC040))
#define FGPIO_FIO2MASK	((volatile unsigned int *)(0x3FFFC050))
#define FGPIO_FIO2PIN	((volatile unsigned int *)(0x3FFFC054))
#define FGPIO_FIO2SET	((volatile unsigned int *)(0x3FFFC058))
#define FGPIO_FIO2CLR	((volatile unsigned int *)(0x3FFFC05C))

#define FGPIO_FIO3DIR	((volatile unsigned int *)(0x3FFFC060))
#define FGPIO_FIO3MASK	((volatile unsigned int *)(0x3FFFC070))
#define FGPIO_FIO3PIN	((volatile unsigned int *)(0x3FFFC074))
#define FGPIO_FIO3SET	((volatile unsigned int *)(0x3FFFC078))
#define FGPIO_FIO3CLR	((volatile unsigned int *)(0x3FFFC07C))

#define FGPIO_FIO4DIR	((volatile unsigned int *)(0x3FFFC080))
#define FGPIO_FIO4MASK	((volatile unsigned int *)(0x3FFFC090))
#define FGPIO_FIO4PIN	((volatile unsigned int *)(0x3FFFC094))
#define FGPIO_FIO4SET	((volatile unsigned int *)(0x3FFFC098))
#define FGPIO_FIO4CLR	((volatile unsigned int *)(0x3FFFC09C))

/* GPIO割り込みコントローラ */
#define GPIO_IO0IntStat  ((volatile unsigned int *)(0xE0028080))
#define GPIO_IO0IntStatR ((volatile unsigned int *)(0xE0028084))
#define GPIO_IO0IntStatF ((volatile unsigned int *)(0xE0028088))
#define GPIO_IO0IntClr	 ((volatile unsigned int *)(0xE002808C))
#define GPIO_IO0IntEnR	 ((volatile unsigned int *)(0xE0028090))
#define GPIO_IO0IntEnF	 ((volatile unsigned int *)(0xE0028094))

/* 割り込みコントローラ(VIC) */
#define VIC_IntEnable   ((volatile unsigned int *)(0xFFFFF010))
#define VIC_IntSelect   ((volatile unsigned int *)(0xFFFFF00C))


/* 割り込みカウンタ */
volatile int Int_Count;

/* 7セグメントLED点灯パターン定義 */
unsigned char BIN2LED7[] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0x83, 0xA1, 0x86, 0x8E };


/* タクトスイッチ初期化 */
void PushSW_Initialize(void)
{
	/* タクトスイッチ入力 P0[7~4] */
	*FGPIO_FIO0DIR = 0x00000000;	/* ポート0 入力 */
	*GPIO_IO0IntClr= 0xF0;	/* P0[7~4]割り込みクリア */
	*GPIO_IO0IntEnF= 0x30;	/* P0[5~4]立ち下りエッジイネーブル */
	*GPIO_IO0IntEnR= 0xC0;	/* P0[7~6]立ち上りエッジイネーブル */
}

/* タクトスイッチ状態取得 */
int PushSW_GetSW(void)
{
	/* タクトスイッチ入力 P0[7~4] */
	return (((*FGPIO_FIO0PIN) >> 4) & 0xF);
}

/* ディップスイッチ初期化 */
void DipSW_Initialize(void)
{
	/* ディップスイッチ入力 P4[7~0] */
	*FGPIO_FIO4DIR =0x00000000;	/* ポート4 入力方向 */
}

/* ディップスイッチ状態取得 */
int DipSW_GetSW(void)
{
	/* ディップスイッチ入力 P4[7~0] */
	return (*FGPIO_FIO4PIN & 0xFF);
}

/* 7セグメントLED初期化 */
void LED7_Initialize(void)
{
	/* 7セグメントLED 下位桁 P3[7~0] */
	*FGPIO_FIO3DIR = 0x000000FF;	/* ポート3 ビット7~0出力 */
	*FGPIO_FIO3MASK= 0x00000000;	/* ポート3 Non Mask */
	*FGPIO_FIO3PIN = 0x00000000;	/* ポート3 出力'L' */
	/* 7セグメントLED 上位桁 P2[7~0] */
	*FGPIO_FIO2DIR = 0x000000FF;	/* ポート2 ビット7~0出力 */
	*FGPIO_FIO2MASK= 0x00000000;	/* ポート2 Non Mask */
	*FGPIO_FIO2PIN = 0x00000000;	/* ポート2 出力'L' */
}

/* 7セグメントLED下位桁 点灯出力 */
void LED7_SetLEDa(int i)
{
	/* 7セグメントLED 下位桁 P3[7~0] */
	*FGPIO_FIO3PIN = i;
}

/* 7セグメントLED上位桁 点灯出力 */
void LED7_SetLEDb(int i)
{
	/* 7セグメントLED 上位桁 P2[7~0] */
	*FGPIO_FIO2PIN = i;
}

/* CPU割り込み処理 */
__irq __arm void IRQ_Handler()
{
	int stat;
	stat=*GPIO_IO0IntStatR;
	if (stat & 0x80) {	/* SW5が押されている */
		Int_Count = 0;
	}
	if (stat & 0x40) {	/* SW4が押されている */
		Int_Count = Int_Count + 10;
	}
	stat=*GPIO_IO0IntStatF;
	if (stat & 0x20) {	/* SW3が押されている */
		Int_Count = Int_Count + 2;
	}
	if (stat & 0x10) {	/* SW2が押されている */
		Int_Count++;
	}
	if (Int_Count >= 100) Int_Count=0;
	/* 7セグメントLED点灯 */
	LED7_SetLEDa( BIN2LED7[ (Int_Count % 10) ]);	/* 下位桁 */
	LED7_SetLEDb( BIN2LED7[ (Int_Count / 10) ]);	/* 上位桁 */
	/* GPIO割り込みクリア */
	*GPIO_IO0IntClr= 0xF0;
}

/* CQBB-ELテストプログラム */
int main(void)
{
	*SYS_SCS = *SYS_SCS | 1;	/* FGPIO Select */

	/* タクトスイッチ初期化 */
	PushSW_Initialize();
	/* 7セグメントLED初期化 */
	LED7_Initialize();
	/* ディップスイッチ初期化 */
	DipSW_Initialize();

	/* 割り込みカウント初期化 */
	Int_Count = DipSW_GetSW() & 0x7F;
	if (Int_Count >= 100 ) Int_Count = 99;
	LED7_SetLEDa( BIN2LED7[ (Int_Count % 10) ]);	/* 下位桁 */
	LED7_SetLEDb( BIN2LED7[ (Int_Count / 10) ]);	/* 上位桁 */

	/* 割り込みコントローラ設定 */
	*VIC_IntSelect = *VIC_IntSelect & (~0x20000);	/* IRQ選択 */
	*VIC_IntEnable = *VIC_IntEnable |   0x20000;	/* EINT3(GPIO)選択 */

	/* 割り込み許可 */
	__enable_interrupt();

	while(1){}

}
