打印

STM32用查询检测按键来控制LED亮灭

[复制链接]
4307|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shuijinliuxi|  楼主 | 2013-8-3 20:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 shuijinliuxi 于 2013-8-4 12:27 编辑

我正在学STM32,在用查询检测按键的按下来控制LED的亮灭,但是实际的现象却是有时按下按键好几下都没有反应,有时按下去后一下子就亮又灭了。完全找不到哪里的原因。这是我的工程,请各位帮忙看下哪有错。
3.按键_查询_1.zip (197.91 KB)




这是我修改后的程序,一按下去就一直在闪烁。修改了好多次都不行,应该怎么修改呢
沙发
logokfu| | 2013-8-3 20:47 | 只看该作者
代码看过了,你没有延时去除抖动,所有就会误动作了

使用特权

评论回复
板凳
outstanding| | 2013-8-3 20:57 | 只看该作者
你这个例程是按什么模板写的,看的有点不习惯。还是你自己检查一下吧。单步调试试试吧

使用特权

评论回复
地板
shuijinliuxi|  楼主 | 2013-8-4 11:15 | 只看该作者
**kfu 发表于 2013-8-3 20:47
代码看过了,你没有延时去除抖动,所有就会误动作了

/*
* 函数名:TimingDelay_Decrement
* 描述  :获取节拍程序
* 输入  :无
* 输出  :无
* 调用  :在SysTick中断函数SysTick_Handler()调用
*/  
void TimingDelay_Decrement(void)
{
        //判断是否有按键按下
        if(Key_Statu == Key_ON)
        {
                //有按键按下,延时30us去抖
                TimingDelay++;
                if(TimingDelay >= 30)
                {
                        //计数清0
                        TimingDelay = 0;
                        //再次判断是否真的有按键被按下
                        if(Key_Statu == Key_ON)
                        {
                                //清除按键状态
                                Key_Statu = Key_OFF;
                                //判断是哪一个按键被按下
                                Key_Check();
                        }
                }
        }
}

我这里有用系统滴答定时器来进行延时30us进行去抖呀

使用特权

评论回复
5
logokfu| | 2013-8-4 11:57 | 只看该作者
shuijinliuxi 发表于 2013-8-4 11:15
/*
* 函数名:TimingDelay_Decrement
* 描述  :获取节拍程序

30us太短了,用毫秒才行

使用特权

评论回复
6
shuijinliuxi|  楼主 | 2013-8-4 12:28 | 只看该作者
**kfu 发表于 2013-8-4 11:57
30us太短了,用毫秒才行

上面是我修改后的程序,一按下去就一直在闪烁。修改了好多次都不行,应该怎么修改呢

使用特权

评论回复
7
logokfu| | 2013-8-4 13:51 | 只看该作者
shuijinliuxi 发表于 2013-8-4 12:28
上面是我修改后的程序,一按下去就一直在闪烁。修改了好多次都不行,应该怎么修改呢 ...

抖动的时间不止30us,所以,你去抖动时间要加长,100毫秒就可以了。

使用特权

评论回复
8
shuijinliuxi|  楼主 | 2013-8-4 14:17 | 只看该作者
**kfu 发表于 2013-8-4 13:51
抖动的时间不止30us,所以,你去抖动时间要加长,100毫秒就可以了。

我已经改成30ms了,之前在STM8上别人说20-30ms就可以了,这样应该不是时间的问题了

使用特权

评论回复
9
logokfu| | 2013-8-4 14:53 | 只看该作者
shuijinliuxi 发表于 2013-8-4 14:17
我已经改成30ms了,之前在STM8上别人说20-30ms就可以了,这样应该不是时间的问题了 ...

是啊,这个没有严格的要求,需要根据你的按键的机械特性,一般几十毫秒100ms以内就够了,但是你用的是us级别 的显然不对了,都不是一个数量级啊。

使用特权

评论回复
10
hkcj| | 2013-8-4 19:04 | 只看该作者
还是延时的时间不对   楼主   重新计算一下时间   一定要精确

使用特权

评论回复
11
zeluo| | 2013-8-4 19:24 | 只看该作者
可能与时间的延时有关系   楼主  

使用特权

评论回复
12
shuijinliuxi|  楼主 | 2013-8-5 10:39 | 只看该作者
**kfu 发表于 2013-8-4 14:53
是啊,这个没有严格的要求,需要根据你的按键的机械特性,一般几十毫秒100ms以内就够了,但是你用的是us ...

是啊,我已经改成了30ms了,但还是有问题,按键一按下就一直闪烁,只有放开后才确定保持亮或灭

使用特权

评论回复
13
shuijinliuxi|  楼主 | 2013-8-5 10:40 | 只看该作者
hkcj 发表于 2013-8-4 19:04
还是延时的时间不对   楼主   重新计算一下时间   一定要精确

延时我是用系统滴答定时器来计时的呀,1ms进入一次中断,计数30就是延时30ms呀

使用特权

评论回复
14
shuijinliuxi|  楼主 | 2013-8-5 10:40 | 只看该作者
zeluo 发表于 2013-8-4 19:24
可能与时间的延时有关系   楼主

延时我改了好多次了,也有改成100ms,但是问题还是一样呀

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

51

帖子

0

粉丝