本帖最后由 poplaji 于 2013-4-27 20:38 编辑
#define KEY1 (1<<1)
#define KEY2 (1<<4)
#define KEY3 (1<<2)
#define KEY4 (1<<0)
#define LED1 (1<<5)
#define LED2 (1<<6)
#define LED3 (1<<7)
#define LED4 (1<<8)
#define EINT0 (1<<0)
#define EINT1 (1<<1)
#define EINT2 (1<<2)
#define EINT4_7 (1<<4)
void init_port(void);
void EINT_init(void);
/*******************************************************
函数原型:void _irq IRQ_KEY(void)
功能描述:输入引脚设置成外部中断输入功能.
********************************************************/
void __irq IRQ_KEY(void)
{
//清除中断标志位
rSRCPND |=EINT0|EINT1|EINT2|EINT4_7;
rINTPND|=EINT0|EINT1|EINT2|EINT4_7;
rEINTPEND=0xffffff;
//设置中断引脚输入状态
rGPFCON&=(~((3<<0)|(3<<2)|(3<<4)|(3<<8)));
//判断按键响应
if(rGPFDAT&KEY1)
rGPBDAT|=LED1;
else
rGPBDAT&=~LED1;
if(rGPFDAT&KEY2)
rGPBDAT|=LED2;
else
rGPBDAT&=~LED2;
if(rGPFDAT&KEY3)
rGPBDAT|=LED3;
else
rGPBDAT&=~LED3;
if(rGPFDAT&KEY4)
rGPBDAT|=LED4;
else
rGPBDAT&=~LED4;
//设置中断引脚输入状态
rGPFCON|=((2<<0)|(2<<2)|(2<<4)|(2<<8)); //不是输入状态,是中断状态。。。。。。。。。。
}
void Main(void)
{
init_port();
EINT_init();
while(1);
}
/*****************************************************
函数原型:void EINT_init(void)
功能描述:中断寄存器设置,外部中断,IRQ
模式.
*****************************************************/
void EINT_init(void)
{
//init_port();
//下降沿儿触发中断
rEXTINT0=rEXTINT0&(~((7<<0)|(7<<4)|(7<<8)|(7<<16)))|((4<<0)|(4<<4)|(4<<8)|(4<<16)); //这个EXTINT寄存器手册上给的真的好坑人。。。这里一定是双边沿触发!!
//中断函数地址设置
pISR_EINT0=(unsigned int)IRQ_KEY;
pISR_EINT1=(unsigned int)IRQ_KEY;
pISR_EINT2=(unsigned int)IRQ_KEY;
pISR_EINT4_7=(unsigned int)IRQ_KEY;//设置中断优先级固定不变
rPRIORITY=0;
//清除中断标志位
rSRCPND|=EINT0|EINT1|EINT2|EINT4_7;
rINTPND|=EINT0|EINT1|EINT2|EINT4_7;
rEINTPEND=0xffffff;
//设置中断类型IRQ
rINTMOD=0;
//中断使能
rINTMSK&=(~(EINT0|EINT1|EINT2|EINT4_7));
rEINTMASK&=(~(EINT0|EINT1|EINT2|EINT4_7));
}
/*******************************************************
函数原型:void init_port(void)
功能描述:输入引脚设置成外部中断输入功能.
********************************************************/
void init_port(void)
{
rGPBCON=0x00015400; //LED引脚设置为输出模式
rGPBDAT=0xffffffff; //LED设置成全灭
rGPFCON&=(~((3<<0)|(3<<2)|(3<<4)|(3<<8))); //不是输入状态,是中断状态。。。。。。。。。。
rGPFCON|=((2<<0)|(2<<2)|(2<<4)|(2<<8));
}
不知道出了什么问题 按键中断这个程序不好使。。。 我不用中断来做按键实验是可以的。我的中断引脚是EINT0,EINT1,EINT2,EINT4。 |