外部中断延时问题

YIAH123_ 2015-08-05 04:43:14
引用了网上的多外部中断代码,想实现中断程序延时,现在的效果是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
...全文
448 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
pathletboy 2015-08-06
  • 打赏
  • 举报
回复
引用 2 楼 YIAH123_ 的回复:
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,灯自然不会亮了。
YIAH123_ 2015-08-06
  • 打赏
  • 举报
回复
有道理,问题已解决,谢谢大家
YIAH123_ 2015-08-05
  • 打赏
  • 举报
回复
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; } i=0; j=0; } 但结果是时好时坏,我用了一个三脚开关,中间一脚接地,旁边两脚分别接P2.3 P2.4,拨动开关不能准确控制灯的延时亮灭
pathletboy 2015-08-05
  • 打赏
  • 举报
回复
中断里不应该加任何延时代码,你可以在中断里设置标志位,然后在main loop中延时判断去抖。

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧