找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3422|回复: 15
收起左侧

请教单片机循环程序中加中断

[复制链接]
ID:405193 发表于 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;
             }
}               

回复

使用道具 举报

ID:396960 发表于 2018-11-14 18:01 | 显示全部楼层
你的输出的功能,不用在中断函数里执行的,可以在main函数里执行,中断里加个标志就好了,main检测到这个标志,然后就输出,就不用在中断里占用时间了。

评分

参与人数 1黑币 +10 收起 理由
yong761228 + 10 很给力!

查看全部评分

回复

使用道具 举报

ID:404160 发表于 2018-11-14 18:18 | 显示全部楼层
中断是可以发生在任何时候的(位置的)。非多任务系统,只能等output()返回。
回复

使用道具 举报

ID:155507 发表于 2018-11-14 21:03 | 显示全部楼层
中断子程序也不要写得过长,处理过多的任务,要尽快处理后及时返回,如果中断一次有很多任务需要执行完全,可以在中断子程序中设置一个标志位,在主程序中查这个标志位,当标志为1时,就在主程序中完成这些任务,这样就不会影响其它中断源的中断,也不会使中断产生混乱。

评分

参与人数 1黑币 +10 收起 理由
yong761228 + 10 很给力!

查看全部评分

回复

使用道具 举报

ID:405193 发表于 2018-11-14 21:38 | 显示全部楼层
非常感谢各位师傅!
回复

使用道具 举报

ID:405193 发表于 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;}           
     
        


}
回复

使用道具 举报

ID:405193 发表于 2018-11-18 09:37 | 显示全部楼层
我想把子程序的中断调到主程序中用,结果中断2不工作了,我是在子程序中设置一个标记k=1,在主程序中去检测 if(k==1)让定时器2开启{Timer2Init();} 结果中断2不工作,在主程序的子函数中开启定时器2,中断是工作的,只是上面的循环,我想10次停止,实现不了。
回复

使用道具 举报

ID:405193 发表于 2018-11-18 11:20 | 显示全部楼层
我已经解决了,是在中断里设置标记,让主程序去检测标记就可以达到要求了,谢谢。
回复

使用道具 举报

ID:428593 发表于 2018-11-18 11:38 | 显示全部楼层
简单的办法,就是通过全局变量,在中断服务程序中修改该变量,然后在main-loop中查询该变量的状态
回复

使用道具 举报

ID:405193 发表于 2018-11-18 15:00 | 显示全部楼层
mumu_tou 发表于 2018-11-18 11:38
简单的办法,就是通过全局变量,在中断服务程序中修改该变量,然后在main-loop中查询该变量的状态

我就是这样做的,解决问题了,谢谢。
回复

使用道具 举报

ID:428716 发表于 2018-11-18 15:35 | 显示全部楼层
中断子程序也不要写得过长,处理过多的任务,要尽快处理后及时返回,如果中断一次有很多任务需要执行完全,可以在中断子程序中设置一个标志位,在主程序中查这个标志位,当标志为1时,就在主程序中完成这些任务,这样就不会影响其它中断源的中断,也不会使中断产生混乱。
回复

使用道具 举报

ID:428756 发表于 2018-11-18 16:36 | 显示全部楼层
非常感谢各位师傅!
回复

使用道具 举报

ID:405193 发表于 2018-11-18 19:58 | 显示全部楼层
橙橙橙io 发表于 2018-11-18 15:35
中断子程序也不要写得过长,处理过多的任务,要尽快处理后及时返回,如果中断一次有很多任务需要执行完全, ...

我四十多岁了,学单片机才2个月,非常感谢师傅。
回复

使用道具 举报

ID:382550 发表于 2018-11-18 20:41 | 显示全部楼层
输出的功能不用在中断函数里执行,可以在main函数里执行,中断里加个标志就好了
回复

使用道具 举报

ID:429089 发表于 2018-11-19 11:39 | 显示全部楼层
按键处理程序?不用一直等待,可以在主循环里调用这个程序,每次调用先读键值,有变化再处理
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表