vb2002
发表于 2024-12-29 14:13:48
wnagming 发表于 2024-12-29 14:08
我感觉有点乱,你觉得呢?还是用状态机写比较好
我现在是在没弄懂和差点弄懂的中间徘徊了.
就差临门一脚了.
再琢磨两天看看
VCC
发表于 2024-12-29 14:52:46
这个程序看起来并不像你的标题说的那样“很好”
至少状态机枚举量用的都是magic number,而没有使用专业严谨的enum数据类型!
这是一个不好的编程习惯,容易导致犯错
比如几个枚举量不小心用了相同数值
vb2002
发表于 2024-12-29 15:53:45
VCC 发表于 2024-12-29 14:52
这个程序看起来并不像你的标题说的那样“很好”
至少状态机枚举量用的都是magic number,而没有使用专业严 ...
有更好的状态机按键的代码分享一下吗?
我研究下{:4_213:}
最好有短按长按双击多击
VCC
发表于 2024-12-29 16:00:26
vb2002 发表于 2024-12-29 15:53
有更好的状态机按键的代码分享一下吗?
我研究下
最好有短按长按双击多击 ...
哈哈哈哈我没写过
我只是吐槽一下
而且注意到,它的消抖写得也不健全,
只连续采样到2次按下状态就认为已经稳定了
很多机械按键的固有频率如果比较低,可能此时还在震动
应该多采几次,比如等间隔采样3~5次
vb2002
发表于 2024-12-29 16:48:51
VCC 发表于 2024-12-29 16:00
哈哈哈哈我没写过
我只是吐槽一下
难怪消抖的时候,有时候按下去消抖不是很准
是不是有误触
VCC
发表于 2024-12-29 16:59:06
vb2002 发表于 2024-12-29 16:48
难怪消抖的时候,有时候按下去消抖不是很准
是不是有误触
两次随机采样就认为按钮已经不抖动了,这个从逻辑上就是经不起推敲的
不知道第一个这么写代码的人是怎么想的
vb2002
发表于 2024-12-29 19:40:58
VCC 发表于 2024-12-29 16:59
两次随机采样就认为按钮已经不抖动了,这个从逻辑上就是经不起推敲的
不知道第一个这么写代码的人是怎么 ...
那如果我要增加消抖次数的话,应该怎么弄,
现在其他的我都弄好了.
就差您说的这个消抖了.
Lkck8210
发表于 2024-12-30 10:14:12
<p>给你一个我琢磨的代码</p>
<pre><code>u8 KeyVal = 0;//主循环判断,用完清零
void key_Proc()//单键多按,1ms中断内运行
{
static u16 Delay_Push=20; //按下消抖
static u16 Delay_Release=200; //放手消抖
static u8 KeyCnt = 0;
if(!Key_XX)
{
if(Delay_Push)
{
Delay_Push--;
if(Delay_Push==0) //消抖
{
KeyCnt++;
}
}
Delay_Release=200; //Delay_Release重装
}
else //按键抬起
{
if(Delay_Release)
{
Delay_Release--;
if(Delay_Release==0) //消抖
{
KeyVal = KeyCnt;
KeyCnt = 0;
}
}
Delay_Push=20; //Delay_Push重装
}
}
</code></pre>
vb2002
发表于 2024-12-30 18:28:31
Lkck8210 发表于 2024-12-30 10:14
给你一个我琢磨的代码
u8 KeyVal = 0;//主循环判断,用完清零
void key_Proc()//单键多按,1ms中断内运行
这个能长按,多按吗?
Lkck8210
发表于 2024-12-30 18:46:11
vb2002 发表于 2024-12-30 18:28
这个能长按,多按吗?
这个只有多按
想要长按,稍微改一下代码就行