//总中断寄存器定义
#define rVIC0INTENCLEAR (*(volatile unsigned*)(0x71200014))
#define rVIC1INTENCLEAR (*(volatile unsigned*)(0x71300014))
#define rVIC0INTSELECT (*(volatile unsigned*)(0x7120000C))
#define rVIC1INTSELECT (*(volatile unsigned*)(0x7130000C))
#define rVIC0INTENABLE (*(volatile unsigned*)(0x71200010))
#define rVIC1INTENABLE (*(volatile unsigned*)(0x71300010))
#define VIC0VECTADDR0 (*(volatile unsigned*)(0x71200100))//VIC0VECTADDR0
#define VIC0VECTADDR1 (*(volatile unsigned*)(0x71200104))
#define VIC1VECTADDR (*(volatile unsigned*)(0x71300100))
#define rVIC0ADDR (*(volatile unsigned*)(0x71200f00))//current addr
#define rVIC1ADDR (*(volatile unsigned*)(0x71300f00))
//key gpio寄存器定义
#define rGPNCON (*(volatile unsigned*)(0x7f008830))
#define rGPNDAT (*(volatile unsigned*)(0x7f008834))
#define rGPNPUD (*(volatile unsigned*)(0x7f008838))
//外部中断寄存器定义
#define rEINT0CON0 (*(volatile unsigned*)(0x7f008900))
#define rEINT0MASK (*(volatile unsigned*)(0x7f008920))
#define rEINT0PEND (*(volatile unsigned*)(0x7f008924))
//LED
#define rGPMCON (*(volatile unsigned*)(0x7f008820))
#define rGPMDAT (*(volatile unsigned*)(0x7f008824))
#define rGPMPUD (*(volatile unsigned*)(0x7f008828))
//speaker
#define spk_GPFCON (*(volatile unsigned*)(0x7f0080a0))
#define spk_GPFDAT (*(volatile unsigned*)(0x7f0080a4))
#define spk_GPFPUD (*(volatile unsigned*)(0x7f0080a8))
volatile unsigned int mode;
void Key_ISR(void) __irq;
void INTC_Init(void);
void Key_IO_Init(void);
void Led_Init(void);
void spk_init(void);
void spk_on(void);
void spk_off(void);
void speaker(unsigned int t);
void delay(unsigned int time);
void led_run(unsigned int t);
void Key_Int_Config(void);
void main(void)
{
Key_IO_Init();
Led_Init();
spk_init();
spk_off();
INTC_Init();
Key_Int_Config();
while(1)
{
switch(mode)
{
case 1:
led_run(mode);
break;
case 2:
led_run(mode);
break;
case 3:
led_run(mode);
break;
case 4:
led_run(mode);
break;
case 5:
speaker(1);
break;
case 6:
speaker(5);
break;
default:
speaker(5);
break;
}
}
}
void Key_Int_Config(void)
{
// Select External Interrupt Mode IRQ
rVIC0INTSELECT = 0x0;
// Set the Entry Address of External Interrupt Group 0 ISR
VIC0VECTADDR0 = (unsigned int)Key_ISR;
VIC0VECTADDR1=(unsigned int)Key_ISR;
// Enable the External Interrupt Group 0
rVIC0INTENABLE |= 0x03;
// Configurate the EINT0 EINT1 EINT2 EINT3 EINT4 EINT5 Trigger of Flowing Type 01x
rEINT0CON0 = (rEINT0CON0 & 0xFFFFF000)|0x222;
// Enable Interrupt MASK EINT0 ENIT1 EINT2 EINT3 EINT4 EINT5
rEINT0MASK &= 0xFFFFFFC0;
//Clear EINT Flag
rEINT0PEND |= 0x0000003F;
}
void INTC_Init(void)
{
// Disable All Interrupt
rVIC0INTENCLEAR = 0xFFFFFFFF;
rVIC1INTENCLEAR = 0xFFFFFFFF;
// Clear VECT Address
rVIC0ADDR = 0x00000000;
rVIC1ADDR = 0x00000000;
}
void Key_IO_Init(void)
{
//配置GPIO
// GPN0 1 2 3 接按键K1 K2 K3 K4 配置按键为中断E_INT
// Configurate the Key I/O for Interrupt Mode 0x10
rGPNCON = (rGPNCON & 0xFFFFF000) | 0x0aaa; //set GPN0 GPN1 GPN2 GPN3 GPN4 GPN5 ext.interrupt
rGPNPUD = (rGPNPUD&0x00000000) | 0x0000aaa;
}
void Led_Init(void)
{
rGPMCON=0x11111; //输出模式
rGPMPUD=0x00;
rGPMDAT=0xff;
}
void spk_init(void)
{
spk_GPFCON = spk_GPFCON&(~(0x1<<(31)));//spk_GPFCON &=~(0x11<<30)
spk_GPFCON = spk_GPFCON|(0x1<<(30));//spk_GPFCON |= (0x01<<30) //output mode
spk_GPFDAT |= 0x8000;
spk_GPFPUD = spk_GPFPUD &(~(0x3<<(30)));
}
void spk_on(void)
{
spk_GPFDAT = spk_GPFDAT|0x8000;
}
void spk_off(void)
{
spk_GPFDAT = spk_GPFDAT & 0x7fff;
}
void speaker(unsigned int t)
{
spk_on();
delay(10*t);
spk_off();
delay(10*t);
}
void delay(unsigned int time)
{
volatile unsigned int t;
while(time)
{
for(t=0;t<20000;t++);
time--;
}
}
void led_run(unsigned int t)
{
volatile unsigned int i;
for(i=0;i<4;i++)
{
rGPMDAT = (0x01<<i);
delay(10*t);
}
}
// KEY Interrupt configuration
void __irq Key_ISR(void)
{
volatile unsigned int i;
// KEY 1
if(rEINT0PEND & 0x01)
{
mode = 1;
// Clear Interrupt Pend
rEINT0PEND |= 0x01;
}
// KEY2
if(rEINT0PEND & 0x02)
{
mode =2;
// Clear Interrupt Pend
rEINT0PEND |= 0x02;
}
// KEY3
if(rEINT0PEND & 0x04)
{
mode =3;
// Clear Interrupt Pend
rEINT0PEND |= 0x04;
}
// KEY4
if(rEINT0PEND & 0x08)
{
mode = 4;
// Clear Interrupt Pend
rEINT0PEND |= 0x08;
}
//KEY5
if(rEINT0PEND&0x10)
{
mode = 5;
rEINT0PEND |=0x10;
}
//KEY6
if(rEINT0PEND&0x20)
{
mode = 6;
rEINT0PEND |= 0x20;
}
rVIC0ADDR = 0x00000000;
}