引用了网上的多外部中断代码,想实现中断程序延时,现在的效果是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中延时判断去抖。
------解决思路----------------------
你这个本来就有逻辑错误,假如运行到<<<<<A处,你按下触发中断,退出中断后i和j马上被设置为0,灯自然不会亮了。