📄 key.c
字号:
#include "inc/config.h"
#define KEY_C 1
u08 KeyRead(void)
{
u08 keyval=0;
if(KEY_ADD==0) keyval=2;
if(KEY_DEC==0) keyval=3;
if(KEY_SET==0) keyval=4;//20070715此种算法仅支持单个按键,且set优先
return ( keyval);
}
struct KEY key =
{
NOKEY, //无键按下
NON,
YES
};
void KeyScan(void)
{
static uint8 key_val_pre =0; //上次扫描键值
static uint8 key_val_now =0; //当前扫描键值
static uint16 key_down_cnt =0; //按键down计数
static uint8 key_status =0; //按键所处状态
if(f_15ms==TRUE)
{
f_15ms=false; //扫描间隔为15ms
}
else
{
return;
}
key_val_now =KeyRead();
if(key.fkeydone ==NO) return; //按键未处理完毕 则不扫描
if( key_val_now) //有键按下
{
switch (key_status)
{
case 0: //first down
key_status=key_status + 1;
key_val_pre =key_val_now;
break;
//down filter. make sure that key is down!
case 1: if( key_val_now == key_val_pre ) //delay for noise
{
key_status =2; //trans to state 2,
key_val_pre =key_val_now;
}
else //just the random noise
{
key_status =0; //reset the state record
}
break;
//BUTTON was down .Judge it long or short!
case 2: if( key_val_now == key_val_pre ) //delay for noise,judge key really down
{
key_down_cnt++ ;
if( key_down_cnt < KEYLONGTICKS) //juded as the short push button
{
key_status =2; //keep state 2, wait for bounce
key_val_pre =key_val_now; //fresh the key value!
}
else // >200, judged as long button
{
key_down_cnt=0;
key.val = key_val_pre;//send key val
key.type = PRESS_LONG_1ST; //key type is long first
key.fkeydone= NO; //key has not been processed!
key_status = 3 ; //reset the state counter!
}
}
else //maybe key up,send message to keyprocess
{
key.val = key_val_pre;//send key val
key.type = PRESS_ONCE; //key type is short
key.fkeydone= NO; //key has not been processed!
key_status = 0 ; //reset the state counter!
key_val_pre = key_val_now=0;
}
break;
//------------------------------------------------------------------------------------------------
//button was long pressed
case 3: if( key_val_now == key_val_pre ) //key still down
{
key_down_cnt++;
if ( key_down_cnt > KEYLONGFREQUENCY) //controll the long press frequency
{
key_down_cnt=1; //reset for new long press loop
key.val = key_val_pre;//send key val
key.type = PRESS_LONG; //key type is long
key.fkeydone= NO; //key has not been processed!
key_status = 3 ; //keep the state counter!
}
}
else //key up and long press end
{
key_down_cnt= 0; //reset for new key down
key.val = 0; //send NO key
key.type = NON; //key type is NON
key.fkeydone= NO; //key has not been processed!
key_status = 0 ; //reset the state counter!
key_val_pre = key_val_now=0;
}
break;
default:break;
}
} //end if( key_val_now ) 有键按下
else //无任何键按下.或者所有按键已经弹起
{
switch (key_status)
{
case 2:
{
key.val = key_val_pre;//send key val
key.type = PRESS_ONCE; //key type is short
key.fkeydone= NO; //key has not been processed!
key_status = 0 ; //reset the state counter!
key_down_cnt= 0;
}
break;
case 3: {
key_down_cnt= 0; //reset for new key down
key.val = 0; //send NO key
key.type = NON; //key type is NON
key.fkeydone= NO; //key has not been processed!
key_status = 0 ; //reset the state counter!
}
break;
default: break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -