标题: 关于C语言switch语句 [打印本页]

作者: jianuli    时间: 2020-9-3 09:49
标题: 关于C语言switch语句
大家好呀,这个程序那里有问题,如果想让S2按下时,怎样能让LED1灭呢,新手,谢谢大家啦

IMG_20200903_094833.jpg (1.45 MB, 下载次数: 105)

IMG_20200903_094833.jpg

作者: 山水间    时间: 2020-9-3 10:55
程序不完整,cnt_2是什么也不知道,无法判断呢
作者: 心有浮生    时间: 2020-9-3 11:15
调试,看看能不能运行到LED=1这句话,如果不能,则表明S2 !=0
作者: 烈火    时间: 2020-9-3 11:16
当S2按下时,让LED1=1,灯灭
作者: wps10025    时间: 2020-9-3 12:10
子函数你前面声明了,主程序之后没写吧。
作者: jianuli    时间: 2020-9-3 12:49
山水间 发表于 2020-9-3 10:55
程序不完整,cnt_2是什么也不知道,无法判断呢

cnt_2是表示按键按下的次数,按第1次时,LED1亮,按第2次时,LED灯亮
作者: jianuli    时间: 2020-9-3 12:52
心有浮生 发表于 2020-9-3 11:15
调试,看看能不能运行到LED=1这句话,如果不能,则表明S2 !=0

您好,可以运行到的,S2按下时,LED1会暗一点,松开S2后,LED1恢复正常亮度,
作者: jianuli    时间: 2020-9-3 12:53
wps10025 发表于 2020-9-3 12:10
子函数你前面声明了,主程序之后没写吧。

写啦,再下面呢,就是按键的函数
作者: jianuli    时间: 2020-9-3 12:54
烈火 发表于 2020-9-3 11:16
当S2按下时,让LED1=1,灯灭

图中就是这样写的呀,但LED不为1啊
作者: jianuli    时间: 2020-9-3 12:55
大家帮忙分析下咯,
作者: 心有浮生    时间: 2020-9-3 13:06
jianuli 发表于 2020-9-3 12:52
您好,可以运行到的,S2按下时,LED1会暗一点,松开S2后,LED1恢复正常亮度,

查下电路吧,会暗估计有用,但是哪里出问题了 不会太清楚
作者: zxc05812438    时间: 2020-9-3 13:24
用程序检测 LED 灯能否正常亮灭,能的话就是你写的程序有问题,不能就是你电路有问题
作者: 山水间    时间: 2020-9-3 14:09
cnt_2是怎么算的,按下去算一次还是按下去弹起算一次,如果按下去弹起算一次,就不可能出现S2=0的情况,键没有消抖,不知道你的按键函数中执行了没?
作者: #include51.h    时间: 2020-9-3 15:03
本帖最后由 #include51.h 于 2020-9-3 15:13 编辑

你这是逻辑上有问题,case 1:后面应用if........else来写,还有你那cnt_2值是不是不受影响的变化,这都能导致你得不到你想要的结果,可以用单步查一下你值的变化,要养成用调试查结果的习惯,你现在代码还少,到你代码多了出现错误时,别人也会看得头大!说不定就不拱理你了
作者: 奋斗的小白熊    时间: 2020-9-3 15:52
你好  你看看是不是if(S2==0){}与break之间没有加分号; 如果改良还有问题的话 那就好好看一下硬件

作者: 梁廷明    时间: 2020-9-3 16:33
程序里面怎么还扫描按键?
作者: 心有浮生    时间: 2020-9-3 16:37
梁廷明 发表于 2020-9-3 16:33
程序里面怎么还扫描按键?

他的扫描函数叫an_jian()吧
作者: jianuli    时间: 2020-9-3 18:20
山水间 发表于 2020-9-3 14:09
cnt_2是怎么算的,按下去算一次还是按下去弹起算一次,如果按下去弹起算一次,就不可能出现S2=0的情况,键 ...

您好,按键按下弹起时后算一次,也就是松开按键后算一次
作者: jianuli    时间: 2020-9-3 18:23
#include51.h 发表于 2020-9-3 15:03
你这是逻辑上有问题,case 1:后面应用if........else来写,还有你那cnt_2值是不是不受影响的变化,这都能导 ...

您好,cnt_2不受影响的了,按键都有消抖处理,我感觉是case后面的语句只受switch判断控制的了?
作者: jianuli    时间: 2020-9-3 18:25
心有浮生 发表于 2020-9-3 16:37
他的扫描函数叫an_jian()吧

是的,帮忙分析下咯,谢谢
作者: jianuli    时间: 2020-9-3 18:26
是不是case后面的所有语句只受switch判断控制?
作者: Roy-2010    时间: 2020-9-3 19:15
无需单片机,你做个非门电路就好了。LED短路了之后通过电阻防止电源短路就好了。
作者: 王朗的诱惑    时间: 2020-9-3 22:11
jianuli 发表于 2020-9-3 12:52
您好,可以运行到的,S2按下时,LED1会暗一点,松开S2后,LED1恢复正常亮度,

看样子是 cnt_2 一直是 1 或者变成 2 的时间不够, cnt_2 相关的逻辑问题。
作者: jianuli    时间: 2020-9-3 23:28
Roy-2010 发表于 2020-9-3 19:15
无需单片机,你做个非门电路就好了。LED短路了之后通过电阻防止电源短路就好了。

想知道什么原因
作者: jianuli    时间: 2020-9-3 23:29
大家帮忙分析下咯
作者: 山水间    时间: 2020-9-4 08:17
jianuli 发表于 2020-9-3 18:20
您好,按键按下弹起时后算一次,也就是松开按键后算一次

你的按键弹起算一次与按键按下去的时候LED1点亮矛盾了,你必须把按键弹起算一次改为按键按下去算一次才行
作者: TTQ001    时间: 2020-9-4 08:34
您可以根据测试结果更改代码。 这是一个简单的代码,应该很容易调试。
作者: 心有浮生    时间: 2020-9-4 09:22
while里面清空,就留一个灭灯函数,看看能不能灭
作者: jianuli    时间: 2020-9-4 10:58
我感觉和case后面的语句矛盾了,因为case让LED1=0,而下面我又让LED1=1,
作者: jianuli    时间: 2020-9-7 21:35
没有人说说了吗,还没有解开我心里的疑团呢呢
作者: ty417502873    时间: 2020-9-8 03:05
上全代码别人才好分析
作者: 权威人物    时间: 2020-9-8 09:26
我猜是他逻辑有问题,S2按键按下会不会改变cnt_2的值?
作者: wlefa    时间: 2020-9-8 10:27
本帖最后由 wlefa 于 2020-9-8 13:11 编辑

恐怕cnt_2值都是1吧,所以程序重复运行在在case 1;当S2按下时,程序循环点亮熄灭(S2按下)LED1,单片机频率高,所以看到的是LED1会暗一点;松开S2后,程序进不了if(s2==0),不能熄灭,所以LED1常亮;在if(S2==)中加个延时,LED1灭的时间长点,人眼容易分别。在case 1中开头点亮LED1,紧接着用按键熄灭LED1,松开按键后第二次循环运行,进入程序就又把LED1点亮了,应该把LED1初始化移出循环,再在循环中改变LED状态
作者: qq1182560902    时间: 2020-9-8 11:45
不给延时怎么看的出来
作者: jianuli    时间: 2020-9-9 08:45
wlefa 发表于 2020-9-8 10:27
恐怕cnt_2值都是1吧,所以程序重复运行在在case 1;当S2按下时,程序循环点亮熄灭(S2按下)LED1,单片机频 ...

您好,首先谢谢你的回复,我刚才按你的方法加了延时,真的可以了耶,真是像你说的这样,反复循环点亮与关断LED1了,还有个最后问题,哈哈,就是case1:在执行后面语句的时候,是不是类似有{}加在LED1与LED8之间呢,像这样case1:{LED1=0;LED2=1;LED3=1;LED4=1;LED=1;LED6=1;LED7=1;LE D8=1;}break;
作者: lucasa    时间: 2020-9-11 10:56
连个防抖设计都没有,直接判断s2==0??!!
作者: wangyuejia2015    时间: 2020-9-11 11:44
只测led1看能亮灭吗,因该是硬件问题或者io选择的问题
作者: w568243975    时间: 2020-9-11 15:44
把if(S2==0){}这段话写到按键函数里面去处理
作者: gfshao    时间: 2020-9-15 14:00
cnt_2是怎么算的,按下去算一次还是按下去弹起算一次,如果按下去弹起算一次,就不可能出现S2=0的情况;前面的条件不满足,下面的程序是不可能执行的
作者: cdiyy    时间: 2020-9-26 08:47
条件不对啊,尝试声明一个全局变量,用变量来记录按键
作者: JXP0716    时间: 2020-9-26 15:46
学到了
作者: 长风007    时间: 2020-9-26 15:52
贴一个相对完整的上来,要不你就看清楚定义,分析一下是否能执行到LED=1;这里。
作者: xiong2018    时间: 2020-9-29 08:40
你的switch语句缺default: breaks;而且编程风格不是很好,一行应该就一个;语句的;
作者: i_could_have    时间: 2020-10-22 18:26
本帖最后由 i_could_have 于 2020-10-22 18:41 编辑
jianuli 发表于 2020-9-3 12:54
图中就是这样写的呀,但LED不为1啊

按下会暗是因为程序一直在获取按键输入,开始时灯亮,你按下S2灯灭,之后再次获取按键信息,case1还是先亮,之后检测到S2按下,又灭。这样闪烁,但是闪的频率很快,所以看到的就是变暗。你可以在if里加个延时,那样就会看到闪烁了
作者: univers    时间: 2020-10-26 14:03
看这序好象是乱套的。还不如先写一个小函数,先在软件里,自己调试一下。这样才能学会。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1