yqfans 发表于 2015-2-22 03:38:05

小白求助~ 按键控制LED,如何按一下松开,亮;按一下松开,闪烁;再按一下松开,灭。

本帖最后由 yqfans 于 2015-2-22 03:40 编辑

我在做【按键控制LED实验】,如下:

程序如下:

int ledpin=11;//定义数字11 接口
int inpin=7;//定义数字7 接口
int val;//定义变量val

void setup()
{
pinMode(ledpin,OUTPUT);//定义小灯接口为输出接口
pinMode(inpin,INPUT);//定义按键接口为输入接口
}

void loop()
{
val=digitalRead(inpin);//读取数字7 口电平值赋给val
if(val==LOW)//    检测按键是否按下,按键按下时小灯亮起
{ digitalWrite(ledpin,LOW);}
else
{ digitalWrite(ledpin,HIGH);}
}


————————————————————————————分割线

这个实验确实很简单,按着开关按钮别松开,为高电平,LED灯亮;松开按钮,为低电平,LED灯灭。

但现在问题来了,我想如何实现,按一下开关松开后,LED灯亮了;在按一下松开后,LED灯闪烁;在按下松开,LED灯灭了。如此循环。。。

因为生活中很多控制LED灯的开关都是这样的,这样只用一个按钮就解决了LED灯的开,状态切换和关闭三种状态,很方便。

希望知道的大神们指点下 ^_^


连接图如下:

yqfans 发表于 2015-2-22 03:42:35

{:soso_e160:}{:soso_e160:}{:soso_e160:}{:soso_e160:}{:soso_e160:}{:soso_e160:}{:soso_e160:}{:soso_e160:}坐等朋友们来讨论

vblearn 发表于 2015-2-22 08:42:26

设置一个变量,记录当前的状态,例如 0灭 1亮 2闪烁。
每按一次循环换一个。0->1->2->0
程序需要的修改还有要处理键的抖动。和每次一变的处理,
需求很好,自己弄一弄。

小杰 发表于 2015-2-22 13:51:26

初学者的话简单一点可以定义一个变量 valif(inpin==HIGH){val+=50} 然后对应的 0<val<=50   这样控制 你想要的三个模式   

laofuz1024 发表于 2015-2-22 19:17:40

最简单的办法
设置一个变量,控制灯的状态是亮还是闪还是灭

先是判断status的状态
然后决定闪烁还是亮或是灭,但这样不好,在过条语句过程中按按键,可能会没反应

我觉得,能做成 中断   ,那就好了!

loop()函数先判断状态是亮还是闪还是灭,中断函数根据当前状态的来改变状态控制变量的值

smching 发表于 2015-2-22 22:48:15

本帖最后由 smching 于 2015-2-22 22:51 编辑

void loop() {
if (按开关){
    status=status+1;
}

if (status=4) {
      status =1;
   }

   switch (status) {
      case 1: 灯亮;
      case 2: 闪烁;
      case 3: 灯灭;
   }
}

yqfans 发表于 2015-2-23 01:55:32

smching 发表于 2015-2-22 22:48 static/image/common/back.gif
void loop() {
if (按开关){
    status=status+1;



int ledpin=11;//定义数字11 接口
int inpin=7;//定义数字7 接口
int val;//定义变量val

void setup()
{
pinMode(ledpin,OUTPUT);//定义小灯接口为输出接口
pinMode(inpin,INPUT);//定义按键接口为输入接口
}

void loop()
{
val=digitalRead(inpin);//读取数字7 口电平值赋给val
if(val==HIGH)   {//检测按键是否按下,
   
    status=status+1;
    }
   
if(status=4) {
      status =1;
    }
switch (status) {
   case 1:{digitalWrite(ledpin,HIGH);}
               
   case 2:{digitalWrite(ledPin, HIGH); //点亮小灯
                  delay(1000); //延时1 秒
                  digitalWrite(ledPin, LOW); //熄灭小灯
                  delay(1000); // 延时1 秒
                  }   
   
      case 3: {digitalWrite(ledpin,LOW);}
   }
}

——————————————————————————分割线

按你的方法修改了之前的程序,但就是通不过!
我对这个status 也不明白怎么用,也不知道哪里的格式什么的写错了,发上报错图看看:

yqfans 发表于 2015-2-23 02:06:30

laofuz1024 发表于 2015-2-22 19:17 static/image/common/back.gif
最简单的办法
设置一个变量,控制灯的状态是亮还是闪还是灭




int ledpin=11;//定义数字11 接口
int inpin=7;//定义数字7 接口
int val;//定义变量val
void setup()
{
pinMode(ledpin,OUTPUT);//定义小灯接口为输出接口
pinMode(inpin,INPUT);//定义按键接口为输入接口
}
void loop()
{
val=digitalRead(inpin);//读取数字7 口电平值赋给val
if(val==HIGH)   {//检测按键是否按下
   
   int a=a+1;
   }
   
    if(a=4) { a=1;}

    if ( a=1 ) {digitalWrite(ledpin,HIGH);}

    if ( a=2 ) {
               digitalWrite(ledPin, HIGH); //点亮小灯
               delay(1000); //延时1 秒
               digitalWrite(ledPin, LOW); //熄灭小灯
               delay(1000); // 延时1 秒
               }

    if ( a=3 ) {digitalWrite(ledpin,LOW);}
   
}

————————————————————————————————
自己写的上面程序,但也无法通过,不知道错在哪了,改半天,检查了半天也无果,之前也基本没有C语言的底子,无奈发上报错图。。。

smching 发表于 2015-2-23 09:26:49

本帖最后由 smching 于 2015-2-23 09:34 编辑

yqfans 发表于 2015-2-23 02:06 static/image/common/back.gif
int ledpin=11;//定义数字11 接口
int inpin=7;//定义数字7 接口
int val;//定义变量val

a还没定义。必须定义int a
ledpin和ledPin是有区别的。
if(a=4)必须更改为 if(a==4)

smching 发表于 2015-2-23 09:32:39

yqfans 发表于 2015-2-23 02:06 static/image/common/back.gif
int ledpin=11;//定义数字11 接口
int inpin=7;//定义数字7 接口
int val;//定义变量val


问题解决后,记得使用debounce,不然按键一下将会触发几次事件。

yqfans 发表于 2015-2-23 15:51:20

smching 发表于 2015-2-23 09:26 static/image/common/back.gif
a还没定义。必须定义int a
ledpin和ledPin是有区别的。
if(a=4)必须更改为 if(a==4)


int ledpin=11;//定义数字11 接口
int inpin=7;//定义数字7 接口
int val;//定义变量val
int a;

void setup()
{
pinMode(ledpin,OUTPUT);//定义小灯接口为输出接口
pinMode(inpin,INPUT);//定义按键接口为输入接口
}
void loop()
{
val=digitalRead(inpin);//读取数字7 口电平值赋给val
if(val==HIGH)   {//检测按键是否按下,按键按下时小灯亮起
               a=a+1;
                }
   
if(a==4){
            a=1;
         }

    if ( a==1 ) {
               digitalWrite(ledpin,HIGH);
                }
    if ( a==2 ) {
               digitalWrite(ledpin, HIGH); //点亮小灯
               delay(1000); //延时1 秒
               digitalWrite(ledpin, LOW); //熄灭小灯
               delay(1000); // 延时1 秒
               }
    if ( a==3 ) {
               digitalWrite(ledpin,LOW);
                }
   
}

——————————————————————————————
改后的程序,还是无法通过,int a 我放在前面了,(这个不能在后面直接用成 int a=a+1 么?我之前就是这用的)。 大小写的问题我改了,都改成小写了,谢谢比我细心啊。a=4改成了a==4了,这个我看了我们网站上关于 if 条件判断语句的知识,知道用“==”才能表示判断,而用“=”就成了赋值。
但是还是无法通过,看报错去查了好像是格式的问题,但我看了格式也没检查去问题,报错图如下:

laofuz1024 发表于 2015-2-23 23:52:19

yqfans 发表于 2015-2-23 02:06 static/image/common/back.gif
int ledpin=11;//定义数字11 接口
int inpin=7;//定义数字7 接口
int val;//定义变量val


语法上的问题,就如楼上所说

但是这样写的话,当闪烁的时候,闪烁的那两秒钟按开关,不知道能不能接收得到

所以我觉得还是用中断最好

yqfans 发表于 2015-2-24 00:00:58

本帖最后由 yqfans 于 2015-2-24 00:02 编辑

laofuz1024 发表于 2015-2-23 23:52 static/image/common/back.gif
语法上的问题,就如楼上所说

但是这样写的话,当闪烁的时候,闪烁的那两秒钟按开关,不知道能不能接收 ...

中断?。。。不会写啊,能举例说明不?我没有C语言基础:L,还有重要的一点就是上面的程序还没有通过,一直卡在那里

laofuz1024 发表于 2015-2-24 00:09:41

本帖最后由 laofuz1024 于 2015-2-24 00:11 编辑

yqfans 发表于 2015-2-24 00:00 static/image/common/back.gif
中断?。。。不会写啊,能举例说明不?我没有C语言基础,还有重要的一点就是上面的程序还没有通过,一 ...

中断的知识,论坛里有好教程

http://www.geek-workshop.com/thread-1983-1-1.html

至于 你的代码,是不是你用别的软件写的,复制进编译器的,里面有些字符有问题,

你删了那行再重新输入试试

是 if 语句那个括号,用的不是英文半角输入下的括号,是用到中文输入状态下的括号了吧

yqfans 发表于 2015-2-24 00:55:45

laofuz1024 发表于 2015-2-24 00:09 static/image/common/back.gif
中断的知识,论坛里有好教程

http://www.geek-workshop.com/thread-1983-1-1.html


对!程序通过了!太谢谢了,是括号的问题,那句应该是我不知道从那里复制的括号。
程序写入了,但是效果没出现,一开始灯是灭的,然后我按了一次按钮,灯一直在闪烁。。。。。然后再怎么按都没反应了,应该是你说的没有中断的问题吧,我去研究研究,完了再修改下我的程序。
页: [1] 2 3 4
查看完整版本: 小白求助~ 按键控制LED,如何按一下松开,亮;按一下松开,闪烁;再按一下松开,灭。