- 打卡等级:偶尔看看III
- 打卡总天数:34
- 最近打卡:2025-03-16 18:14:50
中级会员
- 积分
- 228
|
unsigned char key_multi(void)
{
static unsigned char key_state; //按键状态变量
static unsigned int key_time; //按键计时变量
static unsigned char key_press_nums; //按键次数变量
static unsigned int key_time_double; //按键双击时间
static unsigned char keynum; //键值
static unsigned char new_keynum; //新的键值
unsigned char key_press, key_return; //键值和返回值
key_return = None_click; //清除返回按键值
key_delayms(10);
switch(keyscan())
{
case 1:key_press = KEY1;new_keynum = 1;break; //!!!修改此处,可以增加/减少按键数量
case 2:key_press = KEY2;new_keynum = 2;break; //!!!修改此处,可以增加/减少按键数量
case 3:key_press = KEY3;new_keynum = 3;break; //!!!修改此处,可以增加/减少按键数量
case 4:key_press = KEY4;new_keynum = 4;break; //!!!修改此处,可以增加/减少按键数量
default:key_press = 1;break;
}
if(key_press_nums > 0) //按键次数大于0,说明有按键
{
key_time_double++; //双击计时
if(key_time_double >= DOUBLE_KEY_TIME && key_time_double < LONG_KEY_TIME) key_state = KEY_STATE_2;//在长按时间和双击时间设定范围内,到状态2
}
switch (key_state)
{
case KEY_STATE_0: //按键状态0:判断有无按键按下
{
if (!key_press) //有按键按下
{
key_time = 0; //清零时间间隔计数
key_state = KEY_STATE_1; //然后进入 按键状态1
}
}break;
case KEY_STATE_1: //按键状态1:软件消抖(确定按键是否有效,而不是误触)。按键有效的定义:按键持续按下超过设定的消抖时间。
{
if (!key_press)
{
key_time++; //一次10ms
if(key_time>=SINGLE_KEY_TIME) //消抖时间为:SINGLE_KEY_TIME*10ms = 10ms;
{
key_state = KEY_STATE_2; //如果按键时间超过 消抖时间,即判定为按下的按键有效。进入按键状态2,继续判定到底是单击、双击还是长按
key_press_nums++; //按键次数+1
}
}
else key_state = KEY_STATE_0; //如果按键时间没有超过,判定为误触,按键无效,返回 按键状态0,继续等待按键
}break;
case KEY_STATE_2: //按键状态2:判定按键有效的种类:是单击,双击,还是长按
{
if(key_press) //如果按键在 设定的双击时间内释放,则判定为单击/双击
{
if(key_time_double < DOUBLE_KEY_TIME ) key_state = KEY_STATE_0; //双击时间达到前,再次扫描按键
if(key_time_double >= DOUBLE_KEY_TIME && key_time_double < LONG_KEY_TIME) //达到双击设定时间后
{
if(key_press_nums == 1) key_return = Single_click + new_keynum*10; //返回有效按键值:单击
else if(key_press_nums ==2 && new_keynum == keynum) key_return = Double_click + new_keynum*10; //返回有效按键值:双击
key_state = KEY_STATE_0; //返回 按键状态0,继续等待按键
key_press_nums = 0; //清空按键次数
key_time_double = 0; //清空双击计时
}
}
else
{
key_time++; //按键一直按着的话,长按计时
if(key_time >= LONG_KEY_TIME) //如果按键时间超过 设定的长按时间(LONG_KEY_TIME*10ms=80*10ms=800ms), 则判定为 长按
{
key_return = Long_click + new_keynum*10; //返回有效键值值:长按
key_state = KEY_STATE_3; //去状态3,等待按键释放
}
}
}break;
case KEY_STATE_3: //等待按键释放
{
if (key_press)
{
key_state = KEY_STATE_0; //按键释放后,进入 按键状态0 ,进行下一次按键的判定
key_press_nums = 0; //清空按键次数
key_time_double = 0; //清空双击计时
}
}break;
default:key_state = KEY_STATE_0;break; //特殊情况:key_state是其他值得情况,清零key_state。这种情况一般出现在 没有初始化key_state,第一次执行这个函数的时候
}
keynum = new_keynum; //将新获取的键值赋值给键值
return key_return; //返回 按键值
}
void key_delayms(unsigned int ms) //简单延时函数,自适应主频,1毫秒*ms
{
unsigned int i;
do{
i = MAIN_Fosc / 6000;
while(--i);
}while(--ms);
}
这几个是什么时间赋值的看不懂
static unsigned char key_state; //按键状态变量
static unsigned int key_time; //按键计时变量
static unsigned char key_press_nums; //按键次数变量
static unsigned int key_time_double; //按键双击时间
static unsigned char keynum; //键值
|
-
|