找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3774|回复: 44
收起左侧

关于C语言switch语句

  [复制链接]
ID:777834 发表于 2020-9-3 09:49 来自手机 | 显示全部楼层 |阅读模式
大家好呀,这个程序那里有问题,如果想让S2按下时,怎样能让LED1灭呢,新手,谢谢大家啦
IMG_20200903_094833.jpg
回复

使用道具 举报

ID:540927 发表于 2020-9-3 10:55 | 显示全部楼层
程序不完整,cnt_2是什么也不知道,无法判断呢
回复

使用道具 举报

ID:654028 发表于 2020-9-3 11:15 | 显示全部楼层
调试,看看能不能运行到LED=1这句话,如果不能,则表明S2 !=0
回复

使用道具 举报

ID:744327 发表于 2020-9-3 11:16 | 显示全部楼层
当S2按下时,让LED1=1,灯灭
回复

使用道具 举报

ID:578842 发表于 2020-9-3 12:10 | 显示全部楼层
子函数你前面声明了,主程序之后没写吧。
回复

使用道具 举报

ID:777834 发表于 2020-9-3 12:49 来自手机 | 显示全部楼层
山水间 发表于 2020-9-3 10:55
程序不完整,cnt_2是什么也不知道,无法判断呢

cnt_2是表示按键按下的次数,按第1次时,LED1亮,按第2次时,LED灯亮
回复

使用道具 举报

ID:777834 发表于 2020-9-3 12:52 来自手机 | 显示全部楼层
心有浮生 发表于 2020-9-3 11:15
调试,看看能不能运行到LED=1这句话,如果不能,则表明S2 !=0

您好,可以运行到的,S2按下时,LED1会暗一点,松开S2后,LED1恢复正常亮度,
回复

使用道具 举报

ID:777834 发表于 2020-9-3 12:53 来自手机 | 显示全部楼层
wps10025 发表于 2020-9-3 12:10
子函数你前面声明了,主程序之后没写吧。

写啦,再下面呢,就是按键的函数
回复

使用道具 举报

ID:777834 发表于 2020-9-3 12:54 来自手机 | 显示全部楼层
烈火 发表于 2020-9-3 11:16
当S2按下时,让LED1=1,灯灭

图中就是这样写的呀,但LED不为1啊
回复

使用道具 举报

ID:777834 发表于 2020-9-3 12:55 来自手机 | 显示全部楼层
大家帮忙分析下咯,
回复

使用道具 举报

ID:654028 发表于 2020-9-3 13:06 | 显示全部楼层
jianuli 发表于 2020-9-3 12:52
您好,可以运行到的,S2按下时,LED1会暗一点,松开S2后,LED1恢复正常亮度,

查下电路吧,会暗估计有用,但是哪里出问题了 不会太清楚
回复

使用道具 举报

ID:412523 发表于 2020-9-3 13:24 | 显示全部楼层
用程序检测 LED 灯能否正常亮灭,能的话就是你写的程序有问题,不能就是你电路有问题
回复

使用道具 举报

ID:540927 发表于 2020-9-3 14:09 | 显示全部楼层
cnt_2是怎么算的,按下去算一次还是按下去弹起算一次,如果按下去弹起算一次,就不可能出现S2=0的情况,键没有消抖,不知道你的按键函数中执行了没?
回复

使用道具 举报

ID:471066 发表于 2020-9-3 15:03 | 显示全部楼层
本帖最后由 #include51.h 于 2020-9-3 15:13 编辑

你这是逻辑上有问题,case 1:后面应用if........else来写,还有你那cnt_2值是不是不受影响的变化,这都能导致你得不到你想要的结果,可以用单步查一下你值的变化,要养成用调试查结果的习惯,你现在代码还少,到你代码多了出现错误时,别人也会看得头大!说不定就不拱理你了
回复

使用道具 举报

ID:416287 发表于 2020-9-3 15:52 | 显示全部楼层
你好  你看看是不是if(S2==0){}与break之间没有加分号; 如果改良还有问题的话 那就好好看一下硬件
回复

使用道具 举报

ID:235954 发表于 2020-9-3 16:33 | 显示全部楼层
程序里面怎么还扫描按键?
回复

使用道具 举报

ID:654028 发表于 2020-9-3 16:37 | 显示全部楼层
梁廷明 发表于 2020-9-3 16:33
程序里面怎么还扫描按键?

他的扫描函数叫an_jian()吧
回复

使用道具 举报

ID:777834 发表于 2020-9-3 18:20 来自手机 | 显示全部楼层
山水间 发表于 2020-9-3 14:09
cnt_2是怎么算的,按下去算一次还是按下去弹起算一次,如果按下去弹起算一次,就不可能出现S2=0的情况,键 ...

您好,按键按下弹起时后算一次,也就是松开按键后算一次
回复

使用道具 举报

ID:777834 发表于 2020-9-3 18:23 来自手机 | 显示全部楼层
#include51.h 发表于 2020-9-3 15:03
你这是逻辑上有问题,case 1:后面应用if........else来写,还有你那cnt_2值是不是不受影响的变化,这都能导 ...

您好,cnt_2不受影响的了,按键都有消抖处理,我感觉是case后面的语句只受switch判断控制的了?
回复

使用道具 举报

ID:777834 发表于 2020-9-3 18:25 来自手机 | 显示全部楼层
心有浮生 发表于 2020-9-3 16:37
他的扫描函数叫an_jian()吧

是的,帮忙分析下咯,谢谢
回复

使用道具 举报

ID:777834 发表于 2020-9-3 18:26 来自手机 | 显示全部楼层
是不是case后面的所有语句只受switch判断控制?
回复

使用道具 举报

ID:809311 发表于 2020-9-3 19:15 | 显示全部楼层
无需单片机,你做个非门电路就好了。LED短路了之后通过电阻防止电源短路就好了。
回复

使用道具 举报

ID:84652 发表于 2020-9-3 22:11 | 显示全部楼层
jianuli 发表于 2020-9-3 12:52
您好,可以运行到的,S2按下时,LED1会暗一点,松开S2后,LED1恢复正常亮度,

看样子是 cnt_2 一直是 1 或者变成 2 的时间不够, cnt_2 相关的逻辑问题。
回复

使用道具 举报

ID:777834 发表于 2020-9-3 23:28 来自手机 | 显示全部楼层
Roy-2010 发表于 2020-9-3 19:15
无需单片机,你做个非门电路就好了。LED短路了之后通过电阻防止电源短路就好了。

想知道什么原因
回复

使用道具 举报

ID:777834 发表于 2020-9-3 23:29 来自手机 | 显示全部楼层
大家帮忙分析下咯
回复

使用道具 举报

ID:540927 发表于 2020-9-4 08:17 | 显示全部楼层
jianuli 发表于 2020-9-3 18:20
您好,按键按下弹起时后算一次,也就是松开按键后算一次

你的按键弹起算一次与按键按下去的时候LED1点亮矛盾了,你必须把按键弹起算一次改为按键按下去算一次才行
回复

使用道具 举报

ID:420836 发表于 2020-9-4 08:34 | 显示全部楼层
您可以根据测试结果更改代码。 这是一个简单的代码,应该很容易调试。
回复

使用道具 举报

ID:654028 发表于 2020-9-4 09:22 | 显示全部楼层
while里面清空,就留一个灭灯函数,看看能不能灭
回复

使用道具 举报

ID:777834 发表于 2020-9-4 10:58 来自手机 | 显示全部楼层
我感觉和case后面的语句矛盾了,因为case让LED1=0,而下面我又让LED1=1,
回复

使用道具 举报

ID:777834 发表于 2020-9-7 21:35 来自手机 | 显示全部楼层
没有人说说了吗,还没有解开我心里的疑团呢呢
回复

使用道具 举报

ID:378732 发表于 2020-9-8 03:05 | 显示全部楼层
上全代码别人才好分析
回复

使用道具 举报

ID:311846 发表于 2020-9-8 09:26 | 显示全部楼层
我猜是他逻辑有问题,S2按键按下会不会改变cnt_2的值?
回复

使用道具 举报

ID:380037 发表于 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状态
回复

使用道具 举报

ID:613800 发表于 2020-9-8 11:45 | 显示全部楼层
不给延时怎么看的出来
回复

使用道具 举报

ID:777834 发表于 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;
回复

使用道具 举报

ID:817836 发表于 2020-9-11 10:56 | 显示全部楼层
连个防抖设计都没有,直接判断s2==0??!!
回复

使用道具 举报

ID:775776 发表于 2020-9-11 11:44 | 显示全部楼层
只测led1看能亮灭吗,因该是硬件问题或者io选择的问题
回复

使用道具 举报

ID:817933 发表于 2020-9-11 15:44 | 显示全部楼层
把if(S2==0){}这段话写到按键函数里面去处理
回复

使用道具 举报

ID:106821 发表于 2020-9-15 14:00 | 显示全部楼层
cnt_2是怎么算的,按下去算一次还是按下去弹起算一次,如果按下去弹起算一次,就不可能出现S2=0的情况;前面的条件不满足,下面的程序是不可能执行的
回复

使用道具 举报

ID:607312 发表于 2020-9-26 08:47 | 显示全部楼层
条件不对啊,尝试声明一个全局变量,用变量来记录按键
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表