当前位置: 代码迷 >> 单片机 >> 外部中断延时有关问题
  详细解决方案

外部中断延时有关问题

热度:319   发布时间:2016-04-28 14:41:21.0
外部中断延时问题
引用了网上的多外部中断代码,想实现中断程序延时,现在的效果是while中加了delay(800)导致现象极不稳定,不知道错哪了
#include "MSP430G2452.h"
int i=0,j=0;
void delay(int ms)
{
  int i;
  while(ms--)
    for(i=0;i<120;i++);
}

void P2_IODect();                      //时间检测函数
void P24_Onclick();                    //中断函数1
void P23_Onclick();                    //中断函数2
void GPIO_init();                      //端口初始化函数

void main(void)

{
  WDTCTL = WDTPW + WDTHOLD;
  GPIO_init();  //IO初始化
  P2IFG&=~(BIT4+BIT3);
  _EINT();  //使能总中断
  //LPM3;//休眠
  while(1)
  {
    if(i==1&&j==0)
    {
      P1OUT ^= BIT1;
      P1OUT &= ~BIT0;
      delay(800);
      P1OUT &= ~BIT1;
     
    }
    if(i==0&&j==1)
    {
      P1OUT ^= BIT0;
      P1OUT &= ~BIT1;
      delay(800);
      P1OUT &= ~BIT0;
    }

    i=0;
    j=0;
    
  }    
}

void GPIO_init()
{
  //设定P1.0和P1.1的输出初始值
  P1DIR |= (BIT0+BIT1);  
  P1OUT &= ~(BIT0+BIT1);
  
  //配合机械按键,启用内部上拉电阻
  P2REN |= (BIT4+BIT3);  //启用P2.4 3内部上下拉电阻
  P2OUT |= (BIT4+BIT3);  //将电阻设置为上拉
  //配置P1.3中断参数
  
  P2DIR &= ~(BIT4+BIT3); // P2.4 3设为输入(可省略)
  P2IES |= (BIT4+BIT3);    // P2.4 3设为下降沿中断
  P2IE  |= (BIT4+BIT3);    // 允许P2.4 3中断
}

#pragma vector = PORT2_VECTOR                      
__interrupt void PORT2_ISR(void)
{
  P2_IODect();   
  P2IFG&=~(BIT4+BIT3); 
  
  //LPM3_EXIT;
}


void P2_IODect()
{
  unsigned int Push_Key=0,temp;
  temp=~P2DIR;
  Push_Key=P2IFG&temp;
  //延时一段时间,避开机械抖动区域
  //__delay_cycles(1000);  //消抖延时
  if((P2IN&Push_Key)==0)         
  {
    //判断具体哪个IO被按下,调用该IO的事件处理函数
    switch(Push_Key){ 
    case BIT3:  P23_Onclick();  break;
    case BIT4:  P24_Onclick();  break;
    default:                            break;
    }
  }
}

void P23_Onclick()                               
{
  i=1;
  j=0;
  //P1OUT ^= BIT1;
  //P1OUT &= ~BIT0;
  //delay(800);
  //P1OUT &= ~BIT1;
}
void P24_Onclick()                               
{
  i=0;
  j=1;
  //P1OUT ^= BIT0; 
  //P1OUT &= ~BIT1;
  //delay(800);
  //P1OUT &= ~BIT0; 
}
更多 0
------解决思路----------------------
中断里不应该加任何延时代码,你可以在中断里设置标志位,然后在main loop中延时判断去抖。
------解决思路----------------------
引用:
void P23_Onclick()                               
{
  i=1;
  j=0;
  //P1OUT ^= BIT1;
  //P1OUT &= ~BIT0;
  //delay(800);    //中断里的延时我注释掉了
  //P1OUT &= ~BIT1;
}
main loop里是这么写的:
while(1)
  {
    if(i==1&&j==0)
    {
      P1OUT ^= BIT1;
      P1OUT &= ~BIT0;
      delay(800);
      P1OUT &= ~BIT1;
     
    }
    if(i==0&&j==1)
    {
      P1OUT ^= BIT0;
      P1OUT &= ~BIT1;
      delay(800);
      P1OUT &= ~BIT0;
    }
<<<<<A
    i=0;
    j=0; 
  }   
但结果是时好时坏,我用了一个三脚开关,中间一脚接地,旁边两脚分别接P2.3 P2.4,拨动开关不能准确控制灯的延时亮灭 

你这个本来就有逻辑错误,假如运行到<<<<<A处,你按下触发中断,退出中断后i和j马上被设置为0,灯自然不会亮了。
  相关解决方案