各位大神,想实现按键中断使LED点亮,MDK平台,但是硬件仿真时总是什么效果都没有,没有进入中断,急求指点,谢谢啦!
程序如下:
/************利用中断方式,设计按键key1-4,分别使led1-4点亮**************/
#include "2440addr.h"
//LED低电平有效,依次为GPB5-GPB8
#define LED1_ON ~(1<<5) //灯1亮,PB5置0
#define LED2_ON ~(1<<6) //灯2亮,PB6置0
#define LED3_ON ~(1<<7) //灯3亮,PB7置0
#define LED4_ON ~(1<<8) //灯4亮,PB8置0
#define LED1_OFF (1<<5) //灯1灭,PB5置1
#define LED2_OFF (1<<6) //灯2灭,PB6置1
#define LED3_OFF (1<<7) //灯3灭,PB7置1
#define LED4_OFF (1<<8) //灯4灭,PB8置1
//按键有效时,对应的GPGIO口为0
#define KEY1 ~(1<<0) //按键1有效 ,按下键为低电平
#define KEY2 ~(1<<3) //按键2有效
#define KEY3 ~(1<<5) //按键3有效
#define KEY4 ~(1<<6) //按键4有效
/******************外部中断服务函数*************************/
void __irq IRQ_KEY(void)
{
if(rINTPND&BIT_EINT8_23)//一级中断源判断
{
ClearPending(BIT_EINT8_23);//中断清空,以进行下一次中断判断
if(rEINTPEND&(1<<8)) //EINT8中断有效
{
rGPBDAT&=LED1_ON;
rEINTPEND|=1<<8; //清外部中断
}
if(rEINTPEND&(1<<11)) //EINT11中断有效
{
rGPBDAT&=LED2_ON;
rEINTPEND|=1<<11; //清外部中断
}
if(rEINTPEND&(1<<13)) //EINT13中断有效
{
rGPBDAT&=LED3_ON;
rEINTPEND|=1<<13; //清外部中断
}
if(rEINTPEND&(1<<14)) //EINT14中断有效
{
rGPBDAT&=LED4_ON;
rEINTPEND|=1<<14; //清外部中断
}
}
//为下一次中断触发作准备
rEINTPEND = 0xFFFFFF; //清空 EINTPEND中断请求
rEINTMASK&=~((1<<8)|(1<<11)|(1<<13)|(1<<14)); //外部中断允许,置0
rINTMSK&=~(1<<5);//一级中断源允许EINT8_23
}
/*********************外部中断初始化函数************************/
void EINT_init(void)
{
rGPGCON&=~((3<<0)|(3<<6)|(3<<10)|(3<<12)); //控制位置0
rGPGCON|=(2<<0)|(2<<6)|(2<<10)|(2<<12); //控制位置10,作为中断引脚模式
//外部中断寄存器初始化
rEXTINT1&=~((7<<0)|(7<<12)|(7<<20)|(7<<24));//EINT8、EINT11、EINT13、EINT14的控制位先置0
rEXTINT1|=(2<<0)|(2<<12)|(2<<20)|(2<<24); //三个外部中断设置为下降沿中断方式
//外部中断入口地址
pISR_EINT8_23=(unsigned int)IRQ_KEY;
rINTMSK&=~(1<<5);//一级中断源允许EINT8_23
rEINTMASK&=~((1<<8)|(1<<11)|(1<<13)|(1<<14)); //外部中断允许,置0
rEINTPEND=0xffffffff; //清空外部中断
//源中断寄存器初始地化
rSRCPND=rSRCPND; //清空所有中断
rINTPND=rINTPND; //清空所有中断
rINTMOD=0x0; //IRQ中断
rPRIORITY=0x0; //使用默认的中断优先级
}
int main(void)
{
/**************GPB控制寄存器初始化***********************************/
rGPBCON&=~((3<<10)|(3<<12)|(3<<14)|(3<<16));//GPB5-GPB6的控制位为[10:17],全部置为0
rGPBCON|=(1<<10)|(1<<12)|(1<<14)|(1<<16);// [10:17]每两位控制一个GPB口为输出,设置为01
/**************GPB数据寄存器初始**********************************/
rGPBDAT|=LED1_OFF|LED2_OFF|LED3_OFF|LED4_OFF;//初始化使每一个灯关闭
EINT_init();
while(1);
}
这是为什么呢?为什么呢?谢谢大家了! |