MSP430单片机无法进入外部中断!紧急求助!
#include"MSP430x14x.h"voiddelay(void);voidmain(){P1DIR&=~BIT0;P1IE|=BIT0;P1IES&=~BIT0...
#include"MSP430x14x.h"
void delay(void);
void main(){
P1DIR &=~BIT0;
P1IE |= BIT0;
P1IES &=~ BIT0; //将中断设置为上升中断
P2DIR = 0xff; //P2端口设置为输出
P2OUT = 0xff; //初始状态,全灭
P3DIR = 0xff;
P3OUT = 0Xff;
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
_EINT(); //中断使能
while(1){
P2OUT&=~BIT6;
unsigned int i;
i=4000;
do{
i--;
delay();
}
while(i!=0);
}
}
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{
P2OUT|=BIT6; //LED灯进行指示
if(P1IFG&BIT0){
P1IFG&=~0XFF;
unsigned int i;
i=4000; // 延时8s
do{
i--;
delay();
}
while(i!=0);
}
}
//延时程序,延时十毫秒
void delay(){
unsigned int a ;
a= 4000;
do(a--);
while(a!=0);
}
用P1.0作为中断输入源,P2.6作为LED指示,如果进入中断,P2.6应该灭掉。。
但是在实验过程中,P1.0无论怎么变,P2.6的LED灯始终亮着。。
已经换过多个板子都是一样的结果。。应该是代码问题!!!
求助 展开
void delay(void);
void main(){
P1DIR &=~BIT0;
P1IE |= BIT0;
P1IES &=~ BIT0; //将中断设置为上升中断
P2DIR = 0xff; //P2端口设置为输出
P2OUT = 0xff; //初始状态,全灭
P3DIR = 0xff;
P3OUT = 0Xff;
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
_EINT(); //中断使能
while(1){
P2OUT&=~BIT6;
unsigned int i;
i=4000;
do{
i--;
delay();
}
while(i!=0);
}
}
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{
P2OUT|=BIT6; //LED灯进行指示
if(P1IFG&BIT0){
P1IFG&=~0XFF;
unsigned int i;
i=4000; // 延时8s
do{
i--;
delay();
}
while(i!=0);
}
}
//延时程序,延时十毫秒
void delay(){
unsigned int a ;
a= 4000;
do(a--);
while(a!=0);
}
用P1.0作为中断输入源,P2.6作为LED指示,如果进入中断,P2.6应该灭掉。。
但是在实验过程中,P1.0无论怎么变,P2.6的LED灯始终亮着。。
已经换过多个板子都是一样的结果。。应该是代码问题!!!
求助 展开
2个回答
2013-03-31
展开全部
不知道你能不能仿真,要是能仿真其实很简单就解决了啊。(我用的不是149,不是很确定是不是一样的)
放个断点在进中断第一句话,如果能进,说明初始化没问题,如果不能进,说明初始化有问题(大概看了下你程序,初始化加一句P1IFG &= ~BIT0;吧,也不一定是这个问题)。
上一步没问题了,再放个断点在标志位判断那个括弧里,就是if(P1IFG & BIT0)这句后边。如果进不了,那就是这里的问题,我一般是这样写的(芯片不一样哦):
//*****************************************************************************
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_RST(void)
{
__delay_cycles(2000);
switch(__even_in_range(P1IV, 16))
{
case 0: break;
case 2:// P1.0 IFG
{
…………刚删除掉的
}
break;
…………刚删除掉的
case 12: break; // P1.5 IFG
case 14: break; // P1.6 IFG
case 16: break; // P1.7 IFG
default: break;
}
P1IFG = 0x00;
}
另外while(1)里边那个延时还是去掉吧,你这样问题很大,按键按快了的话一直都执行不到P2OUT&=~BIT6;吧,执行到的话灯也亮了8至16秒的任一时间了。
放个断点在进中断第一句话,如果能进,说明初始化没问题,如果不能进,说明初始化有问题(大概看了下你程序,初始化加一句P1IFG &= ~BIT0;吧,也不一定是这个问题)。
上一步没问题了,再放个断点在标志位判断那个括弧里,就是if(P1IFG & BIT0)这句后边。如果进不了,那就是这里的问题,我一般是这样写的(芯片不一样哦):
//*****************************************************************************
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_RST(void)
{
__delay_cycles(2000);
switch(__even_in_range(P1IV, 16))
{
case 0: break;
case 2:// P1.0 IFG
{
…………刚删除掉的
}
break;
…………刚删除掉的
case 12: break; // P1.5 IFG
case 14: break; // P1.6 IFG
case 16: break; // P1.7 IFG
default: break;
}
P1IFG = 0x00;
}
另外while(1)里边那个延时还是去掉吧,你这样问题很大,按键按快了的话一直都执行不到P2OUT&=~BIT6;吧,执行到的话灯也亮了8至16秒的任一时间了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询