打印
[STM32F1]

两个键同时按下如何判断

[复制链接]
2893|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 | 只看该作者
你把所有的换成我那种形式就可以了,不用重复调用

使用特权

评论回复
5
caijie001| | 2017-12-14 19:10 | 只看该作者
什么叫同时啊?你能做到真的同时吗?其实你可以在按下一个的基础上检测另一个是否按下,比如我在一个循环里,检测按键按下的情况,给个标志位,假如两个都满足,就可以视为按键按下啊,
只要在极短的时间检测到两个按键按下即可啊,就判断(key1)&&(key2)按下的情况即可吧

使用特权

评论回复
6
小明的同学| | 2017-12-14 19:14 | 只看该作者
caijie001 发表于 2017-12-14 19:10
什么叫同时啊?你能做到真的同时吗?其实你可以在按下一个的基础上检测另一个是否按下,比如我在一个循环里 ...


你说对了,其实他检测任何一个就行了,检测完了,进去后检测第二个也可以。。他现在做的重复使用库函数不说,这个降低了灵敏度。

使用特权

评论回复
7
xyz549040622| | 2017-12-15 08:37 | 只看该作者
             for(i=0;i<10000;i++);
两次检测之间这个时间有点长,还有就像楼上几位说的,分别单个检测就好了。去抖动的时间太长了。

使用特权

评论回复
8
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 ...

这样写有错误



使用特权

评论回复
9
戈卫东| | 2017-12-15 08:46 | 只看该作者
还是用状态机简单些。。。。

使用特权

评论回复
10
Cjy_JDxy|  楼主 | 2017-12-15 09:00 | 只看该作者
戈卫东 发表于 2017-12-15 08:46
还是用状态机简单些。。。。

状态机怎么写啊

使用特权

评论回复
11
憨厚诚实大叔| | 2017-12-15 09:38 | 只看该作者

每10ms扫描一次,记录下扫描的结果,然后弄一个函数专门判断扫描结果就好了。另外,这个是个坑,转IT行业吧

使用特权

评论回复
12
xyz549040622| | 2017-12-17 11:04 | 只看该作者

搜索菜农的零耗时按键。我上传过得。

使用特权

评论回复
13
一路向北lm| | 2017-12-17 14:40 | 只看该作者
不可能做到同时吧

使用特权

评论回复
14
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了啊。

使用特权

评论回复
评论
xutong1 2020-5-28 16:19 回复TA
你还用汇报啊,用ARM汇编吧,那个无限可能呢 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

553

主题

3530

帖子

19

粉丝