This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

430 F5529 双按键中断只能触发一个中断的求助!!!!!

Other Parts Discussed in Thread: MSP430F5529

初学MSP430,写了个程序想控制5529上的两个独立按键S1和S2分别对应Port1和Port2的中断来实现按键次数计数,但是现在程序跑出来只有中断Port1能进入中断,请各位大神帮忙看下问题,小弟感激不尽~~

程序如下: 

#include<msp430f5529.h>

void delay_Nms(unsigned int n)

{

        volatile int a=0;

    unsigned int i;

    unsigned int j;

    for(i = n;i > 0;i--)

for(j = 100;j > 0;j--)

          _NOP();

}

extern volatile int a=0;

extern volatile int b=0;

void main()

{

    WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗

    P2DIR =0x00;

    P2IFG=0x00;

    P4DIR |= BIT7;

    P2REN |= BIT1;

    P2IE = 0x02;

    P2IES = 0x02;

    P2IN = BIT1;

    P1DIR &= ~BIT1;

    P1DIR |= BIT0; // 设置P1.1 为输入,P1.0为输出

    P1REN |= BIT1;//打开上拉,触发边沿是从高电平到低电平

    P1IE = 0x02; // 设置P1.1 可以中断

    P1IES = 0x02; // 设置P1.1 为下降沿中断

    P1IFG=0;

    _EINT();

    _BIS_SR(LPM0_bits + GIE); // 进入低功耗睡眠,打开总总断开关

}

unsigned char p1keyj(void) // 判键子程序

{

  unsigned char x;

  x=(P1IN&0X02); // P1.1 接有按键

  return(x); // 有按键返回非全 0

}

unsigned char p2keyj(void) // 判键子程序

{

  unsigned char y;

  y=(P2IN&0X02); // P2.1 接有按键

  return(y); // 有按键返回非全 0

}

#pragma vector=PORT1_VECTOR   //中断服务程序:

__interrupt void p1int(void)

{

    P1OUT ^=BIT0;

    while(p1keyj());

    delay_Nms(2);

    P1IFG=0x00;

    a++;

}



#pragma vector=PORT2_VECTOR   //中断服务程序:

__interrupt void p2int(void)

{

    P4OUT ^=BIT7;

    while(p2keyj());

    delay_Nms(2);

    P2IFG=0x00;

    b++;

}

上拉电阻之类的都设置了,个人感觉端口初始化没问题,可能是vector=PORT2_VECTOR 的问题,因为vector=PORT1_VECTOR能触发P1.1的中断,但是同样就不能触发P2.1的中断,求各位大神指点,谢过~~
  • 看你的中断服务程序,第二个按键用的p4的端口,这个端口没有io中断的
  • 为啥会在PORT2的中断里异或PORT4啊。看Datasheet,不是每个口都会触发中断的

    #pragma vector=PORT2_VECTOR   //中断服务程序:

    __interrupt void p2int(void)

    {

        P4OUT ^=BIT7;

        while(p2keyj());

        delay_Nms(2);

        P2IFG=0x00;

        b++;

    }

  • 是这样的P4.7是板子自带的LED2,异或是想通过看LED灯的亮灭看是否进入到中断里面,现在程序可以按不同的S1,S2触发相应的中断了,但是有一个问题就是每次我都必须跑一遍下面这个程序,其中的if(P1IN&BIT1)语句里面必须跑一次才能触发按键触发P1的中断,同样,必须跑一次if(P2IN&BIT1)才能触发P2口的中断,程序如下,下面的程序就是为了按下按键控制亮灭,管脚定义比较乱,不好意思,谢谢解答。


    #include <msp430f5529.h> //声明库
    void delay()
    {
    int i;
    for(i=0;i<50;i++);
    }
    void main(void) //主函数
    {
    volatile int a=0;
    WDTCTL=WDTPW+WDTHOLD; //关掉看门狗
    P1DIR = BIT0;
    P4DIR = BIT7;
    P1OUT = BIT0;
    P4OUT = BIT7;
    P1OUT = BIT1;
    P1REN =BIT1;
    while(1)
    {
    if(P1IN&BIT1)
    {
    P1OUT =BIT1;
    P1OUT &=~BIT0;
    P4OUT &=~BIT7;
    a++;
    }
    else
    {
    P1OUT = BIT1;
    P4OUT = BIT7;
    P1OUT = BIT0;
    }
    }
    }

  • 是这样的P4.7是板子自带的LED2,异或是想通过看LED灯的亮灭看是否进入到中断里面,现在程序可以按不同的S1,S2触发相应的中断了,但是有一个问题就是每次我都必须跑一遍下面这个程序,其中的if(P1IN&BIT1)语句里面必须跑一次才能触发按键触发P1的中断,同样,必须跑一次if(P2IN&BIT1)才能触发P2口的中断,程序如下,下面的程序就是为了按下按键控制亮灭,管脚定义比较乱,不好意思,谢谢解答。


    #include <msp430f5529.h> //声明库
    void delay()
    {
    int i;
    for(i=0;i<50;i++);
    }
    void main(void) //主函数
    {
    volatile int a=0;
    WDTCTL=WDTPW+WDTHOLD; //关掉看门狗
    P1DIR = BIT0;
    P4DIR = BIT7;
    P1OUT = BIT0;
    P4OUT = BIT7;
    P1OUT = BIT1;
    P1REN =BIT1;
    while(1)
    {
    if(P1IN&BIT1)
    {
    P1OUT =BIT1;
    P1OUT &=~BIT0;
    P4OUT &=~BIT7;
    a++;
    }
    else
    {
    P1OUT = BIT1;
    P4OUT = BIT7;
    P1OUT = BIT0;
    }
    }
    }

  • 用的是P1,P2口的中断,P4.7是板子自带的LED2,通过看LED的亮灭来判断是否进入中断。谢谢回答