打印
[应用相关]

怎么才能跳出中断

[复制链接]
670|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tian111|  楼主 | 2020-2-9 10:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求助,写了一个小程序,怎么才能跳出中断啊,求各位大佬解惑!
#include <reg52.h>
void GPIO_Init();
void P1_IODect();
void P2_IODect();
void TURN_Left();
void TURN_Right();
void TIMER_A0_1();
void TIMER_A1_1();
int main(void) {
    WDTCTL = WDTPW | WDTHOLD;
    GPIO_Init();
    TIMER_A0_1();
    TIMER_A1_1();
    _enable_interrupts();
}
void GPIO_Init(){
P1DIR |= BIT0+BIT1;
P1OUT |= BIT1;
P1OUT &= ~BIT0;
P1SEL |= BIT6;
P1DIR |= BIT6;
P2DIR |= BIT0+BIT1;
P2OUT |= BIT1;
P2OUT &= ~BIT0;
P2SEL |= BIT2;
P2DIR |= BIT2;
P1REN |= BIT3;
P1OUT |= BIT3;
P1DIR &=~ BIT3;
P1IES |= BIT3;
P1IE |= BIT3;
P2REN |= BIT3;
P2OUT |= BIT3;
P2DIR &=~ BIT3;
P2IES |= BIT3;
P2IE |= BIT3;
}
void TIMER_A0_1(){
TA0CTL=0;     //清除以前的设置
TA0CTL |= TASSEL_1+MC_1; //使用子系统时钟,帧计数模式,不倍频
TA0CTL|=ID_0;    //使用子系统时钟,帧计数模式,不倍频
    TA0CCTL1 = OUTMOD_7;
TA0CCR0 = 1000;             //时钟频率为32768HZ,100HZ
TA0CCR1 = 400;             //占空比CCR1/CCR0=1/3
TA0CTL |= TACLR;
}
void TIMER_A1_1(){
TA1CTL=0;     //清除以前的设置
TA1CTL |= TASSEL_1+MC_1; //使用子系统时钟,帧计数模式,不倍频
TA1CTL|=ID_0;    //使用子系统时钟,帧计数模式,不倍频
TA1CCTL1 = OUTMOD_7;
TA1CCR0 = 1000;             //时钟频率为32768HZ,100HZ
TA1CCR1 = 400;             //占空比CCR1/CCR0=1/3
TA1CTL |= TACLR;
}
#pragma vector = PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{
P1_IODect();
    P1IFG=0;
}
void P1_IODect()
{
unsigned int Push_Key=0;
Push_Key=P1IFG&(~P1DIR);
if((P1IN&Push_Key)==0)
   {
  switch(Push_Key){
  case BIT3:
   TURN_Right();
   P1IN ^= BIT3;
   break;
  default:       break;
  }
   }
}
#pragma vector = PORT2_VECTOR
__interrupt void PORT2_ISR(void)
{
P2_IODect();
    P2IFG=0;
}
void P2_IODect()
{
unsigned int Push_Key=0;
Push_Key=P2IFG&(~P2DIR);
if((P2IN&Push_Key)==0)
   {
  switch(Push_Key){
  case BIT3:  TURN_Left();
                 P2IN ^=BIT3;
                 break;
  default:       break;
  }
}
}
void TURN_Left(){
unsigned int MILL1=400;
unsigned int MILL2=400;
while((P2IN&0x04)==0){
  MILL1=MILL1+40;
  MILL2=MILL2-40;
  TA0CCR1=MILL1;
        TA1CCR1=MILL2;
}
}
void TURN_Right(){
unsigned int MILL1=400;
unsigned int MILL2=400;
    MILL1=MILL1-40;
    MILL2=MILL2+40;
    while((P1IN&0x04)==0){
        MILL1=MILL1-40;
        MILL2=MILL2+40;
        TA0CCR1=MILL1;
        TA1CCR1=MILL2;
     }
}

使用特权

评论回复
沙发
goodluck09876| | 2020-2-9 10:34 | 只看该作者
你这是 MCU51 内核的吧!

使用特权

评论回复
板凳
renyaq| | 2020-2-9 10:35 | 只看该作者

中断里用了太多的while,那么只要条件符合,肯定就跳不出来了

使用特权

评论回复
地板
chenjunt| | 2020-2-9 10:39 | 只看该作者
当while的条件不符合的时候,也应该能跳出来才对。

使用特权

评论回复
5
hanwe| | 2020-2-9 10:41 | 只看该作者
中断所起的作用没有说明...

使用特权

评论回复
6
langgq| | 2020-2-9 10:45 | 只看该作者

__interrupt void PORT1_ISR(void)
{
P1_IODect();
    P1IFG=0;
}

__interrupt void PORT2_ISR(void)
{
P2_IODect();
    P2IFG=0;
}

使用特权

评论回复
7
bqyj| | 2020-2-9 10:48 | 只看该作者
没有对对应中断标志位清零,要找到这两个中断源的控制寄存器,然后找到对应位,对其置1·即可跳出中断了

使用特权

评论回复
8
songqian17| | 2020-2-9 10:51 | 只看该作者

找到对应中断标志位,清除。。

使用特权

评论回复
9
songqian17| | 2020-2-9 10:54 | 只看该作者

P1_IODect();

P1IFG=0这样不行么?

使用特权

评论回复
10
houcs| | 2020-2-9 10:59 | 只看该作者
进入后先关闭中断,然后清理标志位,处理任务,处理完重启中断,退出。

使用特权

评论回复
11
zyf部长| | 2020-2-9 11:02 | 只看该作者

清除中断标志位,运行完中断处理程序之后自然就出来了啊

使用特权

评论回复
12
llia| | 2020-2-9 11:04 | 只看该作者

我没明白 难道楼主在跑程序的时候 一直在中断里边出不来吗?

使用特权

评论回复
13
zhuww| | 2020-2-9 11:09 | 只看该作者
最好别用while 很容易掉进去

使用特权

评论回复
14
huanghuac| | 2020-2-9 11:15 | 只看该作者

需要清除中断标志位的哦

使用特权

评论回复
15
bqyj| | 2020-2-9 11:20 | 只看该作者
如果用while语句的话 就要确保能跳出这种状态 否则是出不来中断的

使用特权

评论回复
16
tian111|  楼主 | 2020-2-9 11:23 | 只看该作者

好的,我明天去单位试一下,多谢各位大侠了哈        

使用特权

评论回复
17
wowu| | 2020-3-2 13:20 | 只看该作者
中断标志位是自动清除的吧

使用特权

评论回复
18
xiaoqizi| | 2020-3-2 13:32 | 只看该作者
难道楼主一直在中断里边出不来吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

797

主题

8878

帖子

7

粉丝