你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

奇葩问题,来围观,帮我找错....

[复制链接]
wofei1314 提问时间:2015-10-27 18:10 /
#define ExButton1()     GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_14)
#define ExButton2()     GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_12)
程序这样写就会出错,PE12的值读上来一直是1!
        if(ExButton1()==0)   //启动紧急开门1,并记录日志
        {
            q_doorcmd = DOOR_STATE_OPEN;
            trig_openstyle = R_TRIG_EXBTN1OPEN;
            RecordDoorState(trig_openstyle,DOOR_STATE_OPEN);//表示应急开门1
        }
        if(ExButton2()==0)   //启动应急开门2,并记录日志
        {
            q_doorcmd = DOOR_STATE_OPEN;
            trig_openstyle = R_TRIG_EXBTN2OPEN;
            RecordDoorState(trig_openstyle,DOOR_STATE_OPEN);//52='4',表示应急开门2
        }
程序这样写,读PE12的值就是0
        if((ExButton1()==0) || (ExButton2()==0))
        {
            Door1Open(1);

        }

郁闷了.....不知道怎么回事,有人遇到类似的问题吗?我上面是通用的硬件,其它程序都没有占用IO,正确的是PE12读上来为0 !

收藏 1 评论39 发布时间:2015-10-27 18:10

举报

39个回答
windsky-2021230 回答时间:2015-10-30 14:23:17
或者这样写试下:

        if(ExButton1())   
        {}
        else
        {
            q_doorcmd = DOOR_STATE_OPEN;
            trig_openstyle = R_TRIG_EXBTN1OPEN;
            RecordDoorState(trig_openstyle,DOOR_STATE_OPEN);//表示应急开门1
        }
        if(ExButton2())
        {}
        else
        {
            q_doorcmd = DOOR_STATE_OPEN;
            trig_openstyle = R_TRIG_EXBTN2OPEN;
            RecordDoorState(trig_openstyle,DOOR_STATE_OPEN);//52='4',表示应急开门2
        }
wofei1314 回答时间:2015-11-4 09:44:19
本帖最后由 wofei1314 于 2015-11-4 09:46 编辑
hjl2832 发表于 2015-11-3 16:27
楼主还没明白意思,大伙说的是你第二种写法里,如果第一个条件(PE14)成立,就没有检测第2个条件了,因为 ...

首先感谢你的回答,其次可能是我表达方式不好....

if(条件1或者条件2)这种,实际运行的时候,不管是条件1触发还是条件2触发,都能通过寄存器看出来!!!另外,条件2就是PE12这个IO口,你的意思是PE12接地后,PE12读回的还是高电平,是PE14变低了所以这个判断才成立,门开了??
PE14和PE12都是有上拉的,不需要调,读回的就应该是高电平,只有按键按下了,读回的才是低电平好吗,PE14和PE12是两个独立的IO,硬件上接的是两个独立按键的,这样的表述是不是就明白了?
wofei1314 回答时间:2015-10-29 08:29:26
chifen 发表于 2015-10-29 08:16
if((ExButton1()==0) || (ExButton2()==0)) 这是一个 或条件成立语句,你怎么知道 是 2的有问题,如果1读 ...

以前是这样写的
if((ExButton1()==0) || (ExButton2()==0)) 这两个按钮用于触发开门操作,不管是那个按下,都可以控制开门,没有任何问题

但是我现在
ifi((ExButton1()==0)
{
    开门
    记录按钮1触发开门!
}

ifi((ExButton2()==0)
{
    开门
    记录按钮2触发开门!
}
这样就不行了,按钮2读到的电平时钟为高电平!!!
moyanming2013 回答时间:2015-10-27 18:51:46
看你的编译器对于||是从左往右还是从右往左,然后如果一旦第一个判断正确,就不做第二个判断了。
  1. if((ExButton1()==0) || (ExButton2()==0))
复制代码
你好我好大家好! 回答时间:2015-10-27 18:57:51
这个真不知道
wofei1314 回答时间:2015-10-27 19:56:22
moyanming2013 发表于 2015-10-27 18:51
看你的编译器对于||是从左往右还是从右往左,然后如果一旦第一个判断正确,就不做第二个判断了。
...

第二个是正确相应的,主要是第一个出错
chifen 回答时间:2015-10-27 21:13:14
你要把PE12设置成输入 带上位的
yanhaijian 回答时间:2015-10-28 09:27:29
moyanming2013 发表于 2015-10-27 18:51
看你的编译器对于||是从左往右还是从右往左,然后如果一旦第一个判断正确,就不做第二个判断了。
...

正解啊。
wofei1314 回答时间:2015-10-28 18:20:14

看来我表述的不好,if(||)这种是没问题的,有问题的是if()。。。if()。。。
wofei1314 回答时间:2015-10-28 18:21:29
chifen 发表于 2015-10-27 21:13
你要把PE12设置成输入 带上位的

上拉下拉都试过了,就是读回来的是1.。。。
chifen 回答时间:2015-10-28 19:03:18
状态输入 ,上位模式,  IO时钟一定要开启,正常是为1的,对短路 会变成0
wofei1314 回答时间:2015-10-28 21:48:55
chifen 发表于 2015-10-28 19:03
状态输入 ,上位模式,  IO时钟一定要开启,正常是为1的,对短路 会变成0

谢谢,同样的程序配置,自然都使能 了时钟,配置了输入模式。。。。。

差别只是用两个if判断还是if(条件1 || 条件2),同样的板子。。。怀疑是keil的问题或者单片机的bug。。。
chifen 回答时间:2015-10-29 08:16:34
if((ExButton1()==0) || (ExButton2()==0)) 这是一个 或条件成立语句,你怎么知道 是 2的有问题,如果1读到的为0时也会进入的
aabird 回答时间:2015-10-29 08:36:36
你这两个if是并列关系,
你想用的是if....else吧?
wofei1314 回答时间:2015-10-29 08:54:43
aabird 发表于 2015-10-29 08:36
你这两个if是并列关系,
你想用的是if....else吧?

....谢谢关心,可是似乎大家都没仔细看我的问题。。。。。
chifen 回答时间:2015-10-29 11:42:06
   (GPIOE>IDR & GPIO_Pin_12 )  
   (GPIOE>IDR & GPIO_Pin_14)
这样试试,我读都是这样的 ,好像没有出现过问题
123下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版