标题: 请教单片机循环程序中加中断 [打印本页]

作者: yong761228    时间: 2018-11-14 16:02
标题: 请教单片机循环程序中加中断
各位师傅,您们好,下面程序在执行 if(key == 0x04)   {  output();  } 时间比较长,一直退不出来。现在当KEY等于别的值的时候,对应的的不输出了,是不是要在 if(key == 0x04)   {  output();  } 这里面加入中断程序,怎么加入,谢谢大家了。
if (!set)        
{            k=0;
        for(x=0;x<60;x++)
          if(K1==0)
          {    if(key == 0x08){D3=1;}
                   if(key == 0x04)
                    {  output();  }
                 if(key == 0x02){D1=1;}
                 if(key == 0x01){D0=1;}                                                                                       
                break;
             }
}               


作者: phang    时间: 2018-11-14 18:01
你的输出的功能,不用在中断函数里执行的,可以在main函数里执行,中断里加个标志就好了,main检测到这个标志,然后就输出,就不用在中断里占用时间了。
作者: 飞云居士    时间: 2018-11-14 18:18
中断是可以发生在任何时候的(位置的)。非多任务系统,只能等output()返回。
作者: angmall    时间: 2018-11-14 21:03
中断子程序也不要写得过长,处理过多的任务,要尽快处理后及时返回,如果中断一次有很多任务需要执行完全,可以在中断子程序中设置一个标志位,在主程序中查这个标志位,当标志为1时,就在主程序中完成这些任务,这样就不会影响其它中断源的中断,也不会使中断产生混乱。

作者: yong761228    时间: 2018-11-14 21:38
非常感谢各位师傅!
作者: yong761228    时间: 2018-11-18 09:30
各位师傅,您好,我在主程序的一个函数里开启了定时器2中断,现在一直循环退不出来,我想D2=~D2 10次退出来,如何实现,我在中断里加k++, 在主程序里检测k==10,这样也不行,因为这个中断是在主程序里的一个子程序里实现的,该如何修改,谢谢大家。
void ISR_INT2(void) interrupt 12        
{                 
          static ulong nn;
          
       T2L = 0x20;                //设置定时初值
           T2H = 0xD1;                //设置定时初值
              nn++;
        if (nn==6000)
              { D2 = ~D2;}      
        if (nn==7000)
            { D2 = ~D2;  nn=0;}           
     
        


}
作者: yong761228    时间: 2018-11-18 09:37
我想把子程序的中断调到主程序中用,结果中断2不工作了,我是在子程序中设置一个标记k=1,在主程序中去检测 if(k==1)让定时器2开启{Timer2Init();} 结果中断2不工作,在主程序的子函数中开启定时器2,中断是工作的,只是上面的循环,我想10次停止,实现不了。
作者: yong761228    时间: 2018-11-18 11:20
我已经解决了,是在中断里设置标记,让主程序去检测标记就可以达到要求了,谢谢。
作者: mumu_tou    时间: 2018-11-18 11:38
简单的办法,就是通过全局变量,在中断服务程序中修改该变量,然后在main-loop中查询该变量的状态
作者: yong761228    时间: 2018-11-18 15:00
mumu_tou 发表于 2018-11-18 11:38
简单的办法,就是通过全局变量,在中断服务程序中修改该变量,然后在main-loop中查询该变量的状态

我就是这样做的,解决问题了,谢谢。
作者: 橙橙橙io    时间: 2018-11-18 15:35
中断子程序也不要写得过长,处理过多的任务,要尽快处理后及时返回,如果中断一次有很多任务需要执行完全,可以在中断子程序中设置一个标志位,在主程序中查这个标志位,当标志为1时,就在主程序中完成这些任务,这样就不会影响其它中断源的中断,也不会使中断产生混乱。
作者: chlol    时间: 2018-11-18 16:36
非常感谢各位师傅!
作者: yong761228    时间: 2018-11-18 19:58
橙橙橙io 发表于 2018-11-18 15:35
中断子程序也不要写得过长,处理过多的任务,要尽快处理后及时返回,如果中断一次有很多任务需要执行完全, ...

我四十多岁了,学单片机才2个月,非常感谢师傅。
作者: 大鹏很正常    时间: 2018-11-18 20:41
输出的功能不用在中断函数里执行,可以在main函数里执行,中断里加个标志就好了
作者: zhangzeak    时间: 2018-11-19 11:39
按键处理程序?不用一直等待,可以在主循环里调用这个程序,每次调用先读键值,有变化再处理




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1