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