按你的逻辑,不是靠一个BREAK就能解决的,你上面的代码只实现了,你的第一个功能,S1接通后LED灯只亮一次,后面的东西,你都用了多少个判断语句,那么在编程逻辑上,肯定不是靠一句代码就能实现的,你可以加编制为也行,或者就在后面写一个循环也行,等S1打开后跳出,如:while(1){} |
if(s1==1) |
加一个标志位即可 |
如果你只想 按键开灯关灯的话 if(S1==0) //判断按键是否按下 { delay(50);//按键消抖延时 if(S1==0)//如果真的按下 { led=~led; 按一下开 再按一下关 反复操作 } while(!S1);//判断按键是否松开 } 按键的俩个引脚 一头接单片机 还有一头接负GND 即可 |
S1==1 写不写都没意义 因为除P0外所以IO口默认都是等于1的 应该写if(S1==0) |
chinarenxx 发表于 2020-3-27 21:53 while(1)程序就循环了,你还想干嘛 |
我也有类似的问题,比如用了while(1)给了一个LED灯做循环,后就不能用while(1)给另一个LED灯做循环了。 |
S1未置0状态,单片机上电或者复位应该都是高电平状态1,另外if()后需要加{} |
余生不负 发表于 2020-3-6 14:56 這個方法 第一次見,學習了。 謝謝 |
謝謝大家的指點.有好多沒學過的方法.我會一一實驗消化. 感激!! |
在最后的LED=0下面加一个松手检测 |
基于状态控制的编程,添加标志位这是走向高阶的路, 也有简单的办法 在led=0;}后面增加一句while(s==1);即可实现。但是这种办法会阻塞CPU一只在这看你松手没有。 ![]() |
让程序只运行一次,就停下。最简单的是//while(1)。或者把while删除就行了,只是程序没有实用意义的。 另一方法: delay(50); LED=0; delay(5000); //加上一个锁定时间 |
只运行一次停下的话,在主函数末尾加个while(1);,然后再 delay(50);led=0; (这里加个break;)。 |
你可以采用中断,s1接通一次led闪烁一次 |
本帖最后由 余生不负 于 2020-3-6 18:25 编辑 用标志位就可以了,或者声名一个寄存器比如 char a; //全局的 void main() { while(1) { if(s1==0) a = 1; else a = 0; if(a==1) { led点亮 delay(50); led息灭 a = 0; } } } 按一下放开也是是就亮一会就灭,一直按着也是亮一会就灭 |
用标志位就可以了 |
要增加松手识别才能做到只运行一次就停下。 |
if(!s1) { delay(5); if(s1==1) { led=1; delay(50) led=0; } } //不知道你的电路是怎么样的,点亮灯应该是=0的, |