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.

MSP430G2553 P2口多个中断的问题。



各位高手:

        本人目前做一东西,G2553单片机,P2口的2.0 2.2为按键输入,通过RC电路消除抖动,上拉47k,下拉1000pF瓷片电容,然后下降沿触发中断,P2.1配置为PWM输出,2.3 2.4 2.5配置为输出外接发光二极管,低电平点亮发光二极管,P2.6 2.7接32768kHz的手表晶体,P2.0每次按下触发中断到中断复位程序是P2IFG为0x01,正常。P2.2每次按下触发中断时,设置断点查看P2IFG的值总是在 0x24,0x34,0x0c,0x04之间变化,一直没有弄清楚怎么回事,P2.0和P2.2公用一个中断入口地址,在中断函数当中通过switch case语句去判断是哪个按键按下。但是就出现了上面提到的问题,请各位高手不吝赐教。附一段程序

初始化时的程序:P2IE |= BIT0 + BIT2; //P2.0 .2中断使能

                                P2IFG &= ~(BIT0+ BIT2); //中断标志位清零

#pragma vector=PORT2_VECTOR
__interrupt void Port_2(void)
{
       unsigned char Data_Temp;
       Data_Temp = P2IFG;
       P2IFG &= ~(BIT0 + BIT2);
       Data_Temp &= 0x05;
       switch(Data_Temp)

     {

         case 0x01:  break;

         case 0x04:break;

         default:break;

    }
}

  • 如果只判断是那个口引起的中断可以只判读那一位而不判断其他位,

    if(P2IFG&BIT2)

    {

        do some...

    }

         也可以

          uint i;
          uchar temp;
          temp = P2IFG;
          for(i=0;i<0x1fff;i++);              //按键消抖
          if((P2IN&temp)==(!temp))            //某键按下输出低电平 //P2IN寄存器是只读寄存器,只能通过读取该寄存器内容才能知道Px口的输入信号的状态。
          {
            switch(temp)
            {
                case 0x01: key0flag=1; break; //置中断标志位为1
                case 0x02: key1flag=1; break;
                case 0x04: key2flag=1; break;
                case 0x08: key3flag=1; break;
            }
          }
          P2IFG = 0x00;                       // 清除中断标志位