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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值