实践:
按动K1按键,LED1亮,
按动K1按键,LED1亮,
按动K1按键,LED1亮,
按动K1按键,LED1亮,
按动K1按键,LED1亮,
#include
#include
#include "def.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
#include "def.h"
#include "Option.h"
void delay(unsigned long dly)
{
for(; dly > 0; dly--);
}
void __irq IRQ_KEY()
{
if(rINTPND==BIT_EINT8_23)
{
ClearPending(BIT_EINT8_23);//清除中断标志
if(rEINTPEND&(1<<8))
{
rGPBDAT = ~(1<<5);//点亮led1,其他灯灭
}
else
if(rEINTPEND&(1<<11))
{
rGPBDAT = ~(1<<6);//点亮led2
}
else
if(rEINTPEND&(1<<13))
{
rGPBDAT = ~(1<<7);//点亮led3
}
else
if(rEINTPEND&(1<<14))
{
rGPBDAT = ~(1<<8);//点亮led4
}
else
if(rEINTPEND&(1<<15))
{
rGPBDAT =
~(0xf<<5);//设置GPB5.GPB6.GPB7.GPB8引脚输出设置成0,则CPU输出电压为3.3V,GPB5.GPB6.GPB7.GPB8引脚对应的LED灯亮
}
else
if(rEINTPEND&(1<<19))
{
rGPBDAT =
~(0xf<<5)|(0xf<<5);//设置GPB5.GPB6.GPB7.GPB8引脚输出设置成1,则CPU输出电压为3.3V,GPB5.GPB6.GPB7.GPB8引脚对应的LED灯灭
}
}
rGPGCON =rGPGCON &
(~((3<<0)|(3<<6)|(3<<10)|(3<<12)|(3<<14)|(3<<22)))
|
((2<<0)|(2<<6)|(2<<10)|(2<<12)|(2<<14)|(2<<22));
rEINTPEND
|=((1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19));//外部中断悬挂寄存器,清0无请求,1时有中断请求
rSRCPND |= (1<<5);//EINT8_23
指示中断源状态,0无中断源请求,1时有中断源请求
rINTPND |=(1<<5);//EINT8_23
指示中断状态,0无中断请求,1时有中断请求
}
void EINT_Init()
{
//设置GPGCON中GPG0为10,为外部中断EINT[8],对应K1按键
rGPGCON =rGPGCON &
(~((3<<0)|(3<<6)|(3<<10)|(3<<12)|(3<<14)|(3<<22)))
|
((2<<0)|(2<<6)|(2<<10)|(2<<12)|(2<<14)|(2<<22));
rEXTINT0=0x2;//设置为下降沿触发
pISR_EINT8_23=(unsigned int)IRQ_KEY;
rINTMOD=0;//所用中断都是IRQ
rINTMSK=0xffffffdf;//开EINT0中断,响应中断
rEINTMASK
&=(~((1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19)));//使能各个所需要的具体中断
}
void Main(void)
{
MMU_Init(); //mmu.c中函数
rGPBCON =0x55555554; 将LED1-4对应的GPB5/6/7/8四个引脚设为输出
rGPBUP|=0x1e0;//将GPB5-8的上拉电阻设为使用,000111100000,其对应bit位设为1
delay(40000000);
EINT_Init();
while(1)
{
}
}