怎么去通过一个IO口中断函数去操作每个P1口中断

zhanghua1209   2012-8-14 15:43 楼主
前一段时间想过msp430的io口中断的问题
例如p1的8个io口进中断的话写的都是一个中断矢量那么 如果同时想用多个io口的话就会 造成混乱 因为他们进去的都是一个中断函数;
最后终于想出来了他们进的虽然是一个中断函数 但是他们的中断标志位是不同的 分布于P1IFG的不同的位 所以在函数里面再进行判断就行了
下面是我让p1至p4在接受到高电平后进入中断的一个历程


#include"msp430g2553.h"
#define uint unsigned int
uint chh=0;
void main(void)
{  
    WDTCTL = WDTPW + WDTHOLD;                  // 关闭看门狗
    P1OUT&=~BIT0;                                 // io初始化              
    P1DIR &= ~BIT3;                        
    P1DIR &= ~BIT1;
    P1DIR &= ~BIT2;
    P1DIR &= ~BIT4;
   P1IE |= BIT3+BIT1+BIT2+BIT4;                           
   P1IES |= BIT3+BIT1+BIT2+BIT4;
   P1REN |= BIT3+BIT1+BIT2+BIT4;                        
   P1IFG &= ~BIT3;                          
   P1IFG &= ~BIT1;
   P1IFG &= ~BIT2;
   P1IFG &= ~BIT4;
   _EINT(); //打开全局中断
while(1)
   {
    if(chh==4)
      {              
       chh=0;
      }
  }
}
#pragma vector=PORT1_VECTOR        //中断函数
__interrupt void Port_1(void)
{
switch(P1IFG)
   {
   case  2:   P1OUT=BIT0;
                 chh=chh+1;
                 break;
   case  4 :  P1OUT&=~BIT0;
               chh=chh+1;
                break;
   case  8 :   P1OUT=BIT0;
               chh=chh+1;
                 break;
   case  16 : P1OUT&=~BIT0;
               chh=chh+1;
              break;
   }

其实就是通过switch函数对P1IFG的值进行判断 并及时清零P1IFG就可以了
以上就是我的一些想法 希望对某些人能有些启发

回复评论 (2)

自己占个沙发。。。。。。。。。。。。。。。。。。。
点赞  2012-8-14 19:50
点赞  2012-8-20 09:29
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复