u8 key_return = NO_KEY;
u8 key_tmp = NO_KEY;
u8 key_lock = 0;//按键自锁标志,自己加的

if (key_val == NO_KEY || key_val != key_ctl.key_val) //按键没有按下或者本次按键与上一次按键不相同
{
if (key_ctl.key_up < KEY_UP_TIMES) //抬键防抖延时
{
key_ctl.key_up++;//抬键计数
}
else
{
if (key_ctl.key_cnt >= KEY_LONG_TIMES) { //长按抬键
key_return = key_ctl.key_val | T_KEY_LONG_UP;
} else if (key_ctl.key_cnt >= KEY_SCAN_TIMES) { //短按抬键
key_return = key_ctl.key_val | T_KEY_SHORT_UP;
}
key_tmp = key_ctl.key_val;

key_ctl.key_val = key_val; //把最后一次的按键存起来,留待下次使用
key_ctl.key_cnt = 0; //按键计时清0
key_lock = 0;
}
}
else
{
key_ctl.key_cnt++;
if (key_ctl.key_cnt == KEY_SCAN_TIMES && key_lock == 0) { //去抖
key_ctl.key_up = 0;
key_lock = 1;//自锁标志置1,防止按住按键不松手后一直触发
key_return = key_ctl.key_val | T_KEY_SHORT; //短按,暂存按键值
} else if (key_ctl.key_cnt == KEY_LONG_TIMES && key_lock == 0) { //长按
key_lock = 1;
key_return = key_ctl.key_val | T_KEY_LONG;
} else if (key_ctl.key_cnt == KEY_LONG_HOLD_TIMES && key_lock == 0) { //连按
key_lock = 1;
key_return = key_ctl.key_val | T_KEY_HOLD;
key_ctl.key_cnt = KEY_LONG_TIMES;
}
key_tmp = key_ctl.key_val;
}
if(key_tmp > 0x1f && key_return >= 0x80) //32-127这些键值不支持长按
{
key_return = NO_KEY;
}
return key_return;

posted on   残夜微殇  阅读(467)  评论(0编辑  收藏  举报
编辑推荐:
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
阅读排行:
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· Vite CVE-2025-30208 安全漏洞
· 《HelloGitHub》第 108 期
· MQ 如何保证数据一致性?
· 一个基于 .NET 开源免费的异地组网和内网穿透工具

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示