小程序怪现象

[复制链接]
1979|13
 楼主| caigehao112 发表于 2014-8-22 22:20 | 显示全部楼层 |阅读模式
我想写一个按键控制LED灯的程序,按一次亮再按一次灭,每按一次就翻转一次。算法就是没按一次,让一个变量累加,然后对2取余,即偶数灭,奇数亮。
程序如图2所示,但是上电后灯一直闪,按一次后灯亮,再按一次还是闪烁,不断循环....后来我调成程序如图1,结果上电灯灭,按一次灯亮,只能循环4次....
这是什么原因啊????

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
NE5532 发表于 2014-8-22 22:31 | 显示全部楼层
这哪里需要对2取余数呢?直接XOR 0x01以后看是0是1不就OK了啊?至于第二个程序,当变量的值超过4以后,没有任何一个Case条件匹配,当然就不动咯。

至于楼主说的“循环亮”,我觉得楼主的case里面是不是忘了加{ }了?
lnulibin 发表于 2014-8-22 22:49 | 显示全部楼层
主要是stat[0].bonoff这个变量,是如何随着按键按下和抬起而变化的。
是按下按键一直加,还是抬起按键才加一,还是其他的加一方式。
这个很重要。
 楼主| caigehao112 发表于 2014-8-23 00:15 | 显示全部楼层
lnulibin 发表于 2014-8-22 22:49
主要是stat[0].bonoff这个变量,是如何随着按键按下和抬起而变化的。
是按下按键一直加,还是抬起按键才加 ...

触摸按键来的,不存在消抖问题,按一次就加1,从图一的程序正常运行可以看出没问题的,关键是对2取余后判断就出错了....
 楼主| caigehao112 发表于 2014-8-23 00:19 | 显示全部楼层
NE5532 发表于 2014-8-22 22:31
这哪里需要对2取余数呢?直接XOR 0x01以后看是0是1不就OK了啊?至于第二个程序,当变量的值超过4以后,没有 ...

在C中怎么对一个变量异或运算?后面那个程序我是用来测试的,说明变量正常增加,程序正常运行,但是判断条件改成对2取余就出错了  我想知道原因...还有就是哪有什么方法实现按一次交替显示?
diweo 发表于 2014-8-23 10:09 | 显示全部楼层
caigehao112 发表于 2014-8-23 00:19
在C中怎么对一个变量异或运算?后面那个程序我是用来测试的,说明变量正常增加,程序正常运行,但是判断 ...

异或运算符^表示很受伤。。。。
其实也不用异或,直接&0x01判断最低位就可以了。
NWPU_CHEN 发表于 2014-8-23 15:51 | 显示全部楼层
如果你的按键不存在消抖和释放问题,那更简单了,每按一次改变状态即可,0和1之间改变就行,只需要判断状态即可,为什么要连续加?越做越麻烦,难道你的switch中要写几万中情况???楼上说的也可以,如果你执意用自加,取第一位判断状态也可以,至于异或也是可以的不过显得多此一举.
cjseng 发表于 2014-8-23 15:56 | 显示全部楼层
用一个位变量判断更简单。
创隆电子 发表于 2014-8-24 21:20 | 显示全部楼层
队!!用为变量更简单些

创隆电子 发表于 2014-8-24 21:22 | 显示全部楼层
简单就是标志位,用来判断是第几次按下,再到程序中判断按键与标志位,这样就行了,我就是这样用的
icecut 发表于 2014-8-25 09:22 | 显示全部楼层
你初始化了吗?状态默认值是多少?
程序结束加while(1)之类防止跑飞吗?
ayb_ice 发表于 2014-8-25 09:35 | 显示全部楼层
求余的算法是可以的,应该是变量增加不正常

可以测试每间隔一秒,变量自动加一,取代按键操作
 楼主| caigehao112 发表于 2014-8-25 15:35 | 显示全部楼层
diweo 发表于 2014-8-23 10:09
异或运算符^表示很受伤。。。。
其实也不用异或,直接&0x01判断最低位就可以了。 ...

懂了  谢谢!
 楼主| caigehao112 发表于 2014-8-25 15:36 | 显示全部楼层
NWPU_CHEN 发表于 2014-8-23 15:51
如果你的按键不存在消抖和释放问题,那更简单了,每按一次改变状态即可,0和1之间改变就行,只需要判断状态 ...

有道理!:handshake
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

49

帖子

0

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