[STM32F0] 按键的问题

[复制链接]
1536|16
 楼主| Cjy_JDxy 发表于 2017-11-23 18:10 | 显示全部楼层 |阅读模式
原理图: 2.png



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



1223657347 发表于 2017-11-23 18:19 | 显示全部楼层
循环里3000怎么得来的,你如何保证这段循环的时长?另外i这一变量在死循环里无限自增,你按键触发的i%2判断,并不能准确控制置位或清零,这就导致了你所讲的按键反应不灵。
另外你这主循环里就干查键置位/清零这件事了,何不用按键中断。
另外你硬件已有上拉,软件配置的时候完全可以浮空输入。
ipman 发表于 2017-11-23 20:23 | 显示全部楼层
按键不用状态机?差评
干掉9527 发表于 2017-11-23 20:45 | 显示全部楼层
直接外部中断做按键得了
 楼主| Cjy_JDxy 发表于 2017-11-24 09:27 | 显示全部楼层
1223657347 发表于 2017-11-23 18:19
循环里3000怎么得来的,你如何保证这段循环的时长?另外i这一变量在死循环里无限自增,你按键触发的i%2判断 ...

两个变量,j是延时消抖,i是为了指示灯翻转
 楼主| Cjy_JDxy 发表于 2017-11-24 09:28 | 显示全部楼层
1223657347 发表于 2017-11-23 18:19
循环里3000怎么得来的,你如何保证这段循环的时长?另外i这一变量在死循环里无限自增,你按键触发的i%2判断 ...

两个变量,j是延时消抖,i是为了指示灯翻转
kingkits 发表于 2017-11-24 09:33 | 显示全部楼层
一般都用4ms左右的中断处理按键,有很多状态机的例子。
比如连续两次端口电平一致才会确认按键的状态。
用按键状态的改变确定按键
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类型,在中断里置位,在应用里清零。
wanduzi 发表于 2017-11-24 14:17 | 显示全部楼层
二极管和电容。
wanduzi 发表于 2017-11-24 14:18 | 显示全部楼层
去掉二极管和电容试试看。
 楼主| Cjy_JDxy 发表于 2017-11-24 14:58 | 显示全部楼层
搞好了,i的位置错误
caijie001 发表于 2017-11-26 13:10 | 显示全部楼层
按键延时那么长???
座机呀 发表于 2017-11-27 21:27 | 显示全部楼层
火候不够,这样写代码会有很大问题的,就算像你说的是i的位置错误,最好还是改变一下思维方式吧,这种代码还是停留在学校阶段
拉克丝 发表于 2017-11-28 10:02 | 显示全部楼层
按键处理都是用状态机
CaLipton 发表于 2017-11-28 10:37 | 显示全部楼层
考没考虑过按键自身质量问题
Richardd 发表于 2017-11-28 11:23 | 显示全部楼层
给出5ms左右的时间处理按键
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

553

主题

3530

帖子

20

粉丝
快速回复 在线客服 返回列表 返回顶部