Board logo

标题: xep100按键中断跳出调试 [打印本页]

作者: freewind20    时间: 2011-7-12 10:40     标题: xep100按键中断跳出调试

写了一个按键中断的程序,一按按键就退出整个程序,想在中断后继续运行整个程序。
#define led   PORTB
#define ledd  DDRB
#define key_up    PTIH_PTIH2
#define key_left  PTIH_PTIH3
#define key_right PTIH_PTIH4
#define key_down  PTIH_PTIH5
#define key_up_d    DDRH_DDRH2
#define key_left_d  DDRH_DDRH3
#define key_right_d DDRH_DDRH4
#define key_down_d  DDRH_DDRH5

#define kb_p  PTIH  //输出端口
#define kb_d  DDRH  //输出方向
#define kb_pe PERH  //上拉 下拉 电阻
#define kb_ps PPSH  //上升沿 下降沿
#define kb_ie PIEH  //中断使能
#define kb_if PIFH  //中断标志
#define uchar unsigned char
#define uint  unsigned int
uchar data=0x01;
uchar direction=1;
uchar time=5;
void delayms(uint xms);
void led_init(void);
void key_init(void);

void main(void) {
  DisableInterrupts;
  led_init();
  key_init();
EnableInterrupts;

  for(;;) {
    delayms(time);
    if(direction==1){
      data=data<<1;
      if(data==0)
        data=0x01;  
    } else{
      data=data>>1;
      if(data==0)
        data=0x80;
    }
    led=~data;
  } /* loop forever */
  /* please make sure that you never leave main */
}
/*延时函数*/
void delayms(uint xms){
  uint ii,jj;
  for(ii=xms;ii>0;ii--)
    for(jj=40000;jj>0;jj--);
}
/*点亮led*/
void led_init(void){
  ledd=0xff;
  led=~data;  
}
/*按键初始化*/
void key_init(void){
   key_up_d=0;
   key_left_d=0;
   key_right_d=0;
   key_down_d=0;
   kb_ps=0x00;  //下降沿
   kb_ie=0xff;  //中断禁止
   kb_if=0xff;  //清除中断标志
}
/*按键中断函数*/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 25 key_interrupts(void){
    //kb_if=0xff; //清除中断标志
    //kb_ie=0x00;
   
    /*if(key_up==0){
        time-=1;
        if(time==0)
          time=1;
    }
   
    if(key_down==0){
        time+=1;
        if(time>10)
          time=10;
    }*/
   
    if(key_left==0)
      direction=0;
    if(key_right==0)
      direction=1;
    //kb_ie=0xff;
    asm {
      pula;
      rti;
    }
}
#pragma CODE_SEG DEFAULT
作者: freewind20    时间: 2011-7-12 10:45

中断后应该跳回程序中断的地方继续运行,为什么上面程序中断之后跳出了整个程序。
作者: hanqi1236    时间: 2011-7-12 11:28

你是不是应该把中断标志给清了啊
作者: freewind20    时间: 2011-7-12 11:33

楼上的说的很对,把中断标志给清除了,改成这样就不跳出了
/*按键中断函数*/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 25 key_interrupts(void){
    DisableInterrupts;   
    if(key_up==0){
        time-=1;
        if(time==0)
          time=1;
    }
   
    if(key_down==0){
        time+=1;
        if(time>10)
          time=10;
    }
    if(key_left==0)
      direction=0;
    if(key_right==0)
      direction=1;
    EnableInterrupts;   
}
#pragma CODE_SEG DEFAULT
但是有一个新的问题就是中断后并没有回到原来的循环




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0