原创  关于按钮长时间按住多次执行任务 收藏

设一定时/计数器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();
}

发表于 @ 2004年10月30日 10:23:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:浅谈职业生涯规划 | 新一篇:程序人生:大学十年——林锐

  • 发表评论
  • 评论内容:
  •  
Copyright © peng22277
Powered by CSDN Blog