我献丑来个程序吧,供楼主参考,这个设计应该还是比较简单的.
void scan_key(void)
{
switch(Keystate)
{
case KEY_IDEL :
Key_v=PIND&0x0f;
if(Key_v!=NONE_KEY_DOWN)
{
Keystate=KEY_DELAY;
KeyDelaytime=0;
}
break;
case KEY_DELAY :
if(KeyDelaytime>=KEY_DELAY_TIME)
{
Key_v=PIND&0x0f;
if(Key_v!=NONE_KEY_DOWN)
{
if(Keylock==1)
{
if(Key_v==KEY_ENTER)
{
Key_lock_2s=0;
}
else if(Key_v==KEY_RESET)
{
if(Unstable_bit==0)
{
PORTB&=0xf9;
Led_state&=0xf9;
CH452_Write(CH452_NO_BCD);
CH452_Write(CH452_DIG0|Led_state);
Delay_timer=0;
}
}
}
else
{
Key_pro(Key_v);
}
KeySound();
Keystate=WAIT_KEY_OPEN;
}
else
{
Keystate=KEY_IDEL;
}
}
break;
case WAIT_KEY_OPEN :
Key_v=PIND&0x0f;
if(Key_v==NONE_KEY_DOWN)
{
Keystate=KEY_IDEL;
Key_lock_2min=0;
return_disp=0;
}
else if(Key_v==KEY_ENTER)
{
if(Key_lock_2s>=2000)
{
Machine_state=DISP_UNLOCK;//DISP_Unlock();
Key_lock_disp_time=0;
Key_lock_2s=0;
Keylock=0;
}
}
break;
}
}
看着有点乱,主要看一下结构吧,一共三个状态KEY_IDEL,KEY_DELAY,WAIT_KEY_OPEN,通过一个变量转换三个状态,在KEY_IDEL判断是否有按键按下,如果有,就进入KEY_DELAY,然后在定时器里置一个变量,等待延时,在等待延时的时候并不会影响单片机工作,当延时到了在判断是否有键按下,如果有就进入到按键处理,然后状态转换为等待按键放开状态,如果没有按键按下,就反回KEY_IDEL状态.不知道说清楚没有
|