- 打卡等级:初来乍到
- 打卡总天数:6
- 最近打卡:2026-01-15 08:00:16
已绑定手机
注册会员
- 积分
- 53
|
发表于 2026-1-15 08:15:56
|
显示全部楼层
第19集
本集实现了多功能按键(单击,双击,长安),程序采用了模块化设计,需要新建C文件及相应的H文件,主函数中,需要增加调用新建的H头文件。
unsigned char key_multi(void); //带有char型返回函数的格式。
static //为静态变量,只运行一次。
if与else ifd的用法
swith case 用法中,记得一定要加break,不然会一直执行
return //返回关键字
以下为多功能按键的扫描函数
unsigned char key_multi(void) //key_return
{
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)
{
key_time_double++;
if(key_time_double >= DOUBLE_KEY_TIME && key_time_double < LONG_KEY_TIME) key_state = KEY_STATE_2;
witch (key_state)
{
case KEY_STATE_0:
{
if (!key_press)
{
key_time = 0;
key_state = KEY_STATE_1;
}
}break;
case KEY_STATE_1:
{
if (!key_press)
{
key_time++;
if(key_time>=SINGLE_KEY_TIME)
{
key_state = KEY_STATE_2;
key_press_nums++;
}
}
else key_state = KEY_STATE_0;
}break;
case KEY_STATE_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;
key_press_nums = 0;
key_time_double = 0;
}
}
else
{
key_time++;
if(key_time >= LONG_KEY_TIME)
{
key_return = Long_click + new_keynum*10;
key_state = KEY_STATE_3;
}
}
}break;
case KEY_STATE_3:
{
if (key_press)
{
key_state = KEY_STATE_0;
key_press_nums = 0;
key_time_double = 0;
}
}break;
default:key_state = KEY_STATE_0;break;
}
keynum = new_keynum;
return key_return;
}
|
|