可能是我说的太片面了,大家看不懂,我说的详细点。。
程序的功能很简单,就是外部中断0的两个引脚P0.1和P0.16我同时使用,之后我想判断是哪一个引脚触发了中断,,,,设置的是高电平触发,,,,但是怪事就是,一个引脚为高电平的时候,中断不触发,必须是有两个引脚同时为高电平,它才触发!!!这是怎么回事呢??按书上说的,多个引脚触发中断时,是相或的,所以一个引脚接高,另一个就肯定输出高电平了,为什么两个要同时接高电平呢???
还有一点就是,我在中断函数中,判断是哪个引脚触发的时候,使用的方法是将P0.1和P0.16引脚转换为GPIO模式,之后再进行读取,因为看书上说,IOPIN这个寄存器是GPIO功能时才能有效使用的,所以,我就转换为GPIO了,之后在中断程序的结尾,我又将这两个引脚转回了外部中断,大家有没有什么好的判断方法呢???我的方法有问题吗???即使没问题也过于繁琐了吧??!!!
程序如下:
#include "lpc21xx.h"
#define uint8 unsigned char
#define uint16 unsigned int
#define uint32 unsigned long
void IRQ_eint0() __irq
{
PINSEL0=PINSEL0&0xFFFFFFF3; //设置为 GPIO功能
PINSEL1=PINSEL1&0xFFFFFFFC; //设置为 GPIO功能
IODIR0=IODIR0&0xFFFEFFFD; //检测IO口的电平值,从而判断哪一个引脚触发了中断
if(IOPIN0&2)//判断P0.1是否按下
{
if(IOPIN0&1) //对LED灯取反
{
IOCLR0=1;
}
else
{
IOSET0=1;
}
}
if(IOPIN0&65536)//判断P0.16是否按下
{
if(IOPIN0&4)
{
IOCLR0=4; //对LED灯取反
}
else
{
IOSET0=4;
}
}
PINSEL0=PINSEL0|3<<2; //恢复到第一个中断触发引脚P0.1
PINSEL1=(PINSEL1|1)&0xFFFFFFFD;//恢复到第二个中断触发引脚P0.16
while( (EXTINT&1)!=0 )
{
EXTINT = 0x0F; // 清除EINT0中断标志
}
VICVectAddr=0;
}
void main()
{
PINSEL0=(PINSEL0&0x0FFFFFFFC)&0x0FFFFFFCF; //P0.0=GPIO P0.2=GPIO
IODIR0=IODIR0|5;//设置P0.0 和 P0.2 方向输出
IOSET0=5; //输出给LED灯
PINSEL0=PINSEL0|3<<2; //第一个中断触发引脚P0.1
PINSEL1=(PINSEL1|1)&0xFFFFFFFD;//第二个中断触发引脚P0.16
EXTMODE=EXTMODE&0x0FE; //外部中断0 电平触发
EXTPOLAR=EXTPOLAR|1; //外部中断0 高电平触发
VICIntSelect=VICIntSelect&0xFFFFBFFF;//ENT0 是IRQ
VICVectCntl0=0x2E; //ENTO 分配 最高优先级
VICVectAddr0=(uint32)IRQ_eint0; //ENT0 的中断函数地址
EXTINT=0x0F; //清0 外部中断标志位
VICIntEnable=1<<14; //ENT0 中断使能
while(1);
}
|