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

  • Post author:
  • Post category:其他


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

}



版权声明:本文为peng22277原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。