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

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

[复制链接]
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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版