[STM32F1] 两个键同时按下如何判断

[复制链接]
3293|14
 楼主| Cjy_JDxy 发表于 2017-12-14 18:03 | 显示全部楼层 |阅读模式
pi, gp, GPIO, IO, abi
if((GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_5)==0)&&(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_6)==0))                                                //ÉèÖüü
        {
                for(i=0;i<10000;i++);
                if((GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_5)==0)&&(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_6)==0))
                {
                        while((GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_5)==0)&&(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_6)==0));
                        LcdCommand(0x0f);              //ÏÔʾ»­ÃæÉèÖÃ
                        DisplayDS13021();
                        ScreenNumber=0;
                        LcdCommand(0x85);
                        SetAddress=0X85;
                       
                       
                       
                       
                       
                        SetFlag=1;
                       
                }
        }
我是这样写的,不过不太灵敏。我不太会用什么状态机,高手支招,谢谢!

小明的同学 发表于 2017-12-14 18:58 | 显示全部楼层
这样当然不灵敏了,本来一个就行的,你进入了两次。

if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_5|GPIOD,GPIO_Pin_6)==0))        
就可以了。。           
小明的同学 发表于 2017-12-14 18:58 | 显示全部楼层
这是ST库函数应用的问题,库函数本来就慢,考虑很多问题呢。你这么重复套,内部好多东西重复了。。
小明的同学 发表于 2017-12-14 18:59 | 显示全部楼层
你把所有的换成我那种形式就可以了,不用重复调用
caijie001 发表于 2017-12-14 19:10 | 显示全部楼层
什么叫同时啊?你能做到真的同时吗?其实你可以在按下一个的基础上检测另一个是否按下,比如我在一个循环里,检测按键按下的情况,给个标志位,假如两个都满足,就可以视为按键按下啊,
只要在极短的时间检测到两个按键按下即可啊,就判断(key1)&&(key2)按下的情况即可吧
小明的同学 发表于 2017-12-14 19:14 | 显示全部楼层
caijie001 发表于 2017-12-14 19:10
什么叫同时啊?你能做到真的同时吗?其实你可以在按下一个的基础上检测另一个是否按下,比如我在一个循环里 ...


你说对了,其实他检测任何一个就行了,检测完了,进去后检测第二个也可以。。他现在做的重复使用库函数不说,这个降低了灵敏度。
xyz549040622 发表于 2017-12-15 08:37 | 显示全部楼层
             for(i=0;i<10000;i++);
两次检测之间这个时间有点长,还有就像楼上几位说的,分别单个检测就好了。去抖动的时间太长了。
 楼主| Cjy_JDxy 发表于 2017-12-15 08:38 | 显示全部楼层
本帖最后由 Cjy_JDxy 于 2017-12-15 08:40 编辑
小明的同学 发表于 2017-12-14 18:58
这样当然不灵敏了,本来一个就行的,你进入了两次。

if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_5|GPIOD,GP ...

这样写有错误
1.png


戈卫东 发表于 2017-12-15 08:46 | 显示全部楼层
还是用状态机简单些。。。。
 楼主| Cjy_JDxy 发表于 2017-12-15 09:00 | 显示全部楼层
戈卫东 发表于 2017-12-15 08:46
还是用状态机简单些。。。。

状态机怎么写啊
憨厚诚实大叔 发表于 2017-12-15 09:38 | 显示全部楼层

每10ms扫描一次,记录下扫描的结果,然后弄一个函数专门判断扫描结果就好了。另外,这个是个坑,转IT行业吧
xyz549040622 发表于 2017-12-17 11:04 | 显示全部楼层

搜索菜农的零耗时按键。我上传过得。
一路向北lm 发表于 2017-12-17 14:40 来自手机 | 显示全部楼层
不可能做到同时吧
vhdlcpld 发表于 2017-12-17 23:23 | 显示全部楼层
本帖最后由 vhdlcpld 于 2017-12-17 23:39 编辑

这要是用51单片机就好编了,就5行JB P1.0,EXIT;JB P1.1,EXIT;LCALL DELAY;JB P1.0,EXIT;JB P1.1,EXIT;就行了,去抖抗干扰都有了,现在C语言怎么也都调用API了啊。

评论

你还用汇报啊,用ARM汇编吧,那个无限可能呢  发表于 2020-5-28 16:19
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

553

主题

3530

帖子

20

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