[程序源码] while语句嵌套if else问题

[复制链接]
 楼主| 小西瓜 发表于 2016-9-22 11:14 | 显示全部楼层 |阅读模式
程序如下,请大神们帮帮忙,C语言新手一枚。
出现问题:如果先按key1,则1、2两个灯都亮,再按key2和key3则都没反应;如果先按key2,一个灯亮,再按key3,另一个灯亮,再按key1,两灯都亮,但是再按其他的又没反映了。。。。总结一下就是:按了key1,再按其他就没反应,如果先按其他的,也只能轮回一次,不能重复按,例如按了key2.按key3,再按key2也不行了。。。不知道我表达明白没,请指教,谢谢
while(1)
{
    if(KEY1==0)
    {
        LED1=0;
        LED2=1;
     }
     else if(KEY2==0)
     {
         LED1=1;;
         LED2=0;;
      }
     else if(KEY3==0)
     {
          LED1=0;
          LED2=0;
      }
     else
     {
          LED1=1;
          LED2=1;  
     }
}
 楼主| 小西瓜 发表于 2016-9-22 11:15 | 显示全部楼层
我觉得大神们看了就会明白的,我看了半天也没觉得哪里出现问题了。。。在线等
datouyuan 发表于 2016-9-22 11:37 | 显示全部楼层
看不明白你文字的内容.

你代码的作用见下:
不按任何键 :   1灯灭,2灯灭
按住1#键    :   1灯亮,2灯灭
按住2#键    :   1灯灭,2灯亮
按住3#键    :   1灯亮,2灯亮
备注:这3个键的优先顺序是1-2-3,例如:同时按住2#3#键,算按2#键,同时按住1#2#3#键,算按1#键.
liuyu305 发表于 2016-9-22 11:46 | 显示全部楼层
==0是按下?
 楼主| 小西瓜 发表于 2016-9-22 13:03 | 显示全部楼层

对的 等于0是按下,我这段代码想实现的功能其实就是按键扫描,一个键对应一种功能,但是实现不了,请指点
 楼主| 小西瓜 发表于 2016-9-22 13:04 | 显示全部楼层
datouyuan 发表于 2016-9-22 11:37
看不明白你文字的内容.

你代码的作用见下:

不好意思,我说得不清楚。按键不是同时按下的,每次只按一个按键,就像按键扫描那种,类似按1显示1,按2显示2,但是我现在就是实现不了,不知道程序哪里出现问题了
yichunshan 发表于 2016-9-22 13:38 | 显示全部楼层
本帖最后由 yichunshan 于 2016-9-22 13:44 编辑

KEY键均有上拉电阻,KEY123均定义为IO且已经设置为输入?

icecut 发表于 2016-9-22 13:51 | 显示全部楼层
把所有 else 这个单词都删了
最后那个不要
else 就是不能连续按键.排他...
两只岸上的鱼 发表于 2016-9-22 13:51 | 显示全部楼层
else if(KEY2==0)
     {
         LED1=1;;
         LED2=0;;
      }
怎么有两个 ;


评论

米有关系  发表于 2016-9-22 14:05
创隆电子 发表于 2016-9-22 14:00 | 显示全部楼层
原因1,是否接有上拉电阻,如果没有案件不能用P0口,
创隆电子 发表于 2016-9-22 14:01 | 显示全部楼层

2暂时把最后的ELSE1=1;2=1;屏蔽或删除,试试按键能否正常
焊丝滚成球 发表于 2016-9-22 15:06 | 显示全部楼层
建议要消除抖动,while(key);  延时也要做一下几毫秒的。
whtwhtw 发表于 2016-9-22 15:25 | 显示全部楼层
while(1)里没问题,有问题的可能是别的地方
李冬发 发表于 2016-9-22 15:33 | 显示全部楼层
改成
if(key==KEY1)
{
    ...
}
else if(key==KEY2)
{
    ...
}
else if(key==KEY2)
{
    ...
}
...

吧。
linyu1983 发表于 2016-9-22 16:44 | 显示全部楼层
最后的
else
     {
          LED1=1;
          LED2=1;  
     }
去掉
datouyuan 发表于 2016-9-22 16:51 | 显示全部楼层
实在看不懂你的文字.

假如某个按键要求在这种情况下是这个功能,换一种情况,是另一个功能.推荐你用状态机的方式编写.

假如这个按键在任何情况下,只有一种功能,楼主的这种编写方式ok.
datouyuan 发表于 2016-9-22 17:13 | 显示全部楼层
本帖最后由 datouyuan 于 2016-9-22 17:21 编辑
小西瓜 发表于 2016-9-22 13:04
不好意思,我说得不清楚。按键不是同时按下的,每次只按一个按键,就像按键扫描那种,类似按1显示1,按2 ...

你的程序的作用就是我在3楼给你分析的,请注意"按住""不按任何键"这2个词,代码没问题.
假如这不是你想要的功能,你再重新按你想要的功能写(我们都不明白你的要求).

按1显示1

松手后还显示1吗?还有这个显示是要一直刷新还是显示一次后就不用管了?

一个键对应一种功能

这描述也太模糊了.

我们一般一个键可以对应多种功能.
短按住
短按松手
长按住
长按松手
还有这个键和别的键组合,对应的功能实在太多了.
xinzha 发表于 2016-9-22 18:34 | 显示全部楼层
KEY1,KEY2,KEY3是怎么判断的,上下拉如何处理,都对这个程序有影响。
另外一个大问题是,点灯程序里没有延时,那么如果你的程序和硬件都没错误,那么你应该看不到灯亮才对,因为没有任何按键按下才是在绝大多数时间内发生的事情。
ningling_21 发表于 2016-9-22 18:52 | 显示全部楼层
小西瓜 发表于 2016-9-22 13:04
不好意思,我说得不清楚。按键不是同时按下的,每次只按一个按键,就像按键扫描那种,类似按1显示1,按2 ...

按键没有消抖
datouyuan 发表于 2016-9-22 19:26 | 显示全部楼层
xinzha 发表于 2016-9-22 18:34
KEY1,KEY2,KEY3是怎么判断的,上下拉如何处理,都对这个程序有影响。
另外一个大问题是,点灯程序里没有 ...

不对."按住"时灯会亮,松手后所有灯才不亮,说不定这就是楼主想要的功能.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

43

帖子

0

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

6

主题

43

帖子

0

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