打印
[应用相关]

关于中断问题

[复制链接]
608|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
feiqi1|  楼主 | 2018-7-10 21:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求助,写了一个小程序,怎么才能跳出中断啊,求各位大佬解惑!
#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;
     }
}
沙发
androidbus| | 2018-7-10 21:37 | 只看该作者
中断里用了太多的while,那么只要条件符合,肯定就跳不出来了

使用特权

评论回复
板凳
litengg| | 2018-7-10 21:42 | 只看该作者
当while的条件不符合的时候,也应该能跳出来才对。

使用特权

评论回复
地板
qiangweii| | 2018-7-10 21:44 | 只看该作者
中断所起的作用没有说明...

使用特权

评论回复
5
shashaa| | 2018-7-10 21:47 | 只看该作者


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

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

使用特权

评论回复
6
xia00| | 2018-7-10 21:49 | 只看该作者
shashaa 发表于 2018-7-10 21:47
__interrupt void PORT1_ISR(void)
{
P1_IODect();

没有对对应中断标志位清零,要找到这两个中断源的控制寄存器,然后找到对应位,对其置1·即可跳出中断了

使用特权

评论回复
7
hfdy01| | 2018-7-10 21:52 | 只看该作者
找到对应中断标志位,清除。。

使用特权

评论回复
8
CallReceiver| | 2018-7-10 21:54 | 只看该作者

P1_IODect();

P1IFG=0这样不行么?

使用特权

评论回复
9
huangcunxiake| | 2018-7-11 17:11 | 只看该作者
进入后先关闭中断,然后清理标志位,处理任务,处理完重启中断,退出。

使用特权

评论回复
10
xiaoqizi| | 2018-7-19 13:42 | 只看该作者
清除中断标志位,运行完中断处理程序之后自然就出来了啊

使用特权

评论回复
11
paotangsan| | 2018-7-20 08:15 | 只看该作者
我没明白 难道楼主在跑程序的时候 一直在中断里边出不来吗?

使用特权

评论回复
12
labasi| | 2018-7-23 11:52 | 只看该作者
最好别用while 很容易掉进去

使用特权

评论回复
13
Lewisnx| | 2018-7-23 17:57 | 只看该作者
需要清除中断标志位的哦

使用特权

评论回复
14
晓伍| | 2018-7-24 08:27 | 只看该作者
如果用while语句的话 就要确保能跳出这种状态 否则是出不来中断的

使用特权

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

本版积分规则

424

主题

1616

帖子

1

粉丝