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
这个能长按,多按吗?

这个只有多按
想要长按,稍微改一下代码就行
页: 1 [2] 3
查看完整版本: 找到个很好的状态机按键程序.想添加3击,4击,怎么弄哦求大神