CSDN博客

img peng22277

关于按钮长时间按住多次执行任务

发表于2004/10/30 10:23:00  626人阅读

设一定时/计数器D0作为计数用
按键中断后---》判断定时器D0是开或关?
1.当为关---》读键值---》查key(电平信号)为低时,则开D0。
2.当为开(说明了是换了另外一个按键,也就是再次触发按键中断)---》关D0---》读键值

D0中断,查key为低---》同样键值(等于再读一个键值)
                 查key为高---》关D0
下面是按键外部中断的代码:
#pragma interrupt_handler int1_isr:3
void int1_isr(void)

    //unsigned char temp;
   //CLI();
   EICRA=0X00;
   EIMSK=0X00;
  // delay_1ms();    //上电复位
   timer0_counter=0;
   timer0_times=0;
   if(TIMSK&0x01==1)//定时计数器开
   { 
   TIMSK&=~(1<<TOIE0);//关计数器0溢出中断
   }
   else//定时计数器关
   {
   if((PIND&0X02)==0)//且PD1为低电平
   {
   TIMSK|=(1<<TOIE0);//开计数器0溢出中断
   }
   }
   Key_number[Key_Counter]=read7279(CMD_READ);  
   Key_Counter++;
   if(Key_Counter==9)
   Key_Counter=0;
      
   EICRA=0X08;
   SEI();
   EIMSK=0X02;
   timer0_counter=0;
}

下面是D0中断的代码:
#pragma interrupt_handler timer0_isr:17      //定时计数器0溢出中断
void timer0_isr(void)

   if((PIND&0X02)!=0)//PD1=1时,KEY为高
   {
      TIMSK&=~(1<<TOIE0);//关计数器0溢出中断
   }
   else
   { 
     
   if(timer0_times==200)
   timer0_times=2;
      timer0_counter++;
      if(timer0_counter==20)
   {
   timer0_times++;
   if(timer0_times>1)
   {
   timer0_counter=0;
      Key_number[Key_Counter]=Front_Num;
      Key_Counter++;
      if(Key_Counter==9)
      Key_Counter=0;
   }
   }
   }

  //TIMSK=0;//关计数器0溢出中断
  //wink_move();
}

阅读全文
0 0

相关文章推荐

img
取 消
img