打印
[STM32F0]

按键的问题

[复制链接]
1314|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Cjy_JDxy|  楼主 | 2017-11-23 18:10 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
原理图:



我用STM32F107VCT6做个项目。就一个按键程序都写不好。
程序如下:
按键接在PD3上。可是按键反应有点不灵敏。
请问高手问题出在哪?谢谢!



沙发
1223657347| | 2017-11-23 18:19 | 只看该作者
循环里3000怎么得来的,你如何保证这段循环的时长?另外i这一变量在死循环里无限自增,你按键触发的i%2判断,并不能准确控制置位或清零,这就导致了你所讲的按键反应不灵。
另外你这主循环里就干查键置位/清零这件事了,何不用按键中断。
另外你硬件已有上拉,软件配置的时候完全可以浮空输入。

使用特权

评论回复
板凳
ipman| | 2017-11-23 20:23 | 只看该作者
按键不用状态机?差评

使用特权

评论回复
地板
干掉9527| | 2017-11-23 20:45 | 只看该作者
直接外部中断做按键得了

使用特权

评论回复
5
Cjy_JDxy|  楼主 | 2017-11-24 09:27 | 只看该作者
1223657347 发表于 2017-11-23 18:19
循环里3000怎么得来的,你如何保证这段循环的时长?另外i这一变量在死循环里无限自增,你按键触发的i%2判断 ...

两个变量,j是延时消抖,i是为了指示灯翻转

使用特权

评论回复
6
Cjy_JDxy|  楼主 | 2017-11-24 09:28 | 只看该作者
1223657347 发表于 2017-11-23 18:19
循环里3000怎么得来的,你如何保证这段循环的时长?另外i这一变量在死循环里无限自增,你按键触发的i%2判断 ...

两个变量,j是延时消抖,i是为了指示灯翻转

使用特权

评论回复
7
kingkits| | 2017-11-24 09:33 | 只看该作者
一般都用4ms左右的中断处理按键,有很多状态机的例子。
比如连续两次端口电平一致才会确认按键的状态。
用按键状态的改变确定按键

使用特权

评论回复
8
springvirus| | 2017-11-24 09:42 | 只看该作者
较为科学合理的按键处理都是用状态机,不然有些实时性要求高的场合,延时无处应对
定时器设置为1ms,一般采用10ms的间隔检查IO口电平,例如

u8 bcu_key_cc_state_machine(void)
//should be called every 10ms
{
               
        static unsigned char key_state = key_state_0;
       
        unsigned char key_press, key_return = PRESS_NO;
       
        key_press = GPIO_ReadInputDataBit(PORT_KEY_CC, BIT_KEY_CC);
       
        switch(key_state)
        {
                case key_state_0:

                        if(key_press == PORT_LOW)
                        //key is pressed
                        {
                                key_state = key_state_1;
                        }
                       
                        break;
                case key_state_1:

                        if(key_press == PORT_LOW)
                        //key is pressed
                        {
                                key_return = PRESS_YES;

                                key_state = key_state_2;
                        }
                        else
                        {
                                key_state = key_state_0;
                        }

                        break;
                case key_state_2:

                        if(key_press == PORT_HIGH)
                        //key is released
                        {
                                key_state = key_state_0;
                        }

                        break;
                       
        }
       

        return key_return;

}

u8 bcu_key_cc_check(void)
{
        u8 keyvalue = PRESS_NO;
       
        if(delay10msok_key_cc == 1)
        {
                delay10msok_key_cc = 0;
               
                keyvalue = bcu_key_cc_state_machine();
               
                if(keyvalue == PRESS_YES)
                {
                        return TRUE;
                }
                else
                {
                        return FALSE;
                }
               
        }

       
}

delay10msok_key_cc定义成volatile类型,在中断里置位,在应用里清零。

使用特权

评论回复
9
wanduzi| | 2017-11-24 14:17 | 只看该作者
二极管和电容。

使用特权

评论回复
10
wanduzi| | 2017-11-24 14:18 | 只看该作者
去掉二极管和电容试试看。

使用特权

评论回复
11
Cjy_JDxy|  楼主 | 2017-11-24 14:58 | 只看该作者
搞好了,i的位置错误

使用特权

评论回复
12
caijie001| | 2017-11-26 13:10 | 只看该作者
按键延时那么长???

使用特权

评论回复
13
座机呀| | 2017-11-27 21:27 | 只看该作者
火候不够,这样写代码会有很大问题的,就算像你说的是i的位置错误,最好还是改变一下思维方式吧,这种代码还是停留在学校阶段

使用特权

评论回复
14
拉克丝| | 2017-11-28 10:02 | 只看该作者
按键处理都是用状态机

使用特权

评论回复
15
CaLipton| | 2017-11-28 10:37 | 只看该作者
考没考虑过按键自身质量问题

使用特权

评论回复
16
Richardd| | 2017-11-28 11:23 | 只看该作者
给出5ms左右的时间处理按键

使用特权

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

本版积分规则

个人签名:绿水本无忧因风皱面,青山原不老为雪白头。

553

主题

3530

帖子

19

粉丝