新手搞了一个小LED程序让大家看看-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7412|回复: 17

新手搞了一个小LED程序让大家看看

[复制链接]
发表于 2012-11-2 20:52 | 显示全部楼层 |阅读模式
程序作用是用开关控制五个小灯,每按一次亮一个灯,每次只能亮一个,顺序循环。程序如下:
int ledPin[5]={
  5,7,9,11,13};
int current=0;
int i;

void setup()
{
  for( i=0;i<5;i++)
    pinMode(ledPin[i],OUTPUT);
  pinMode(2,INPUT);
}

void loop()
{
  if ( digitalRead(2)==HIGH) {
    while(digitalRead(2) == HIGH)
      ;
    for ( i= 0; i< 5; i++) {
      digitalWrite(ledPin[i], LOW);
    }
    digitalWrite(ledPin[current], HIGH);
    current ++;
    if ( current >= 5) current = 0;
  }
}
各位高手多多给与指导啊



发表于 2012-11-3 20:16 | 显示全部楼层
本帖最后由 onlycheat 于 2012-11-6 22:16 编辑
感觉循环太严重,不知道会不会影响效率。手里也没有arduino所以不能测试。

刚才用proteus模拟下该程序,发现许多问题,更正下。
int ledPin[5]={5,7,9,11,13};
int current=0,temp=0;
int j;
void setup()
{
  for( j=0;j<5;j++)
    pinMode(ledPin[j],OUTPUT);
  pinMode(2,INPUT);
}
void loop()
{
  if ( digitalRead(2)==HIGH) {
    while(digitalRead(2)==HIGH); //该句很重要,等待开关low   还是没有太理解这句个空循环,不知道哪位兄弟帮小弟详细解释下
    temp=current-1;
    switch(current){
    case 0:
      temp=4;
      break;
    case 5:
      current=0;
      break;
    }
    digitalWrite(ledPin[temp], LOW);
    digitalWrite(ledPin[current], HIGH);
    current++;
  }
}
未命名.jpg

点评

这个程序,语句虽少,但理解起来挺吃力。我费半天劲才弄明白。  发表于 2012-11-7 08:18
 楼主| 发表于 2012-11-4 12:49 | 显示全部楼层
onlycheat 发表于 2012-11-3 20:16
感觉循环太严重,不知道会不会影响效率。手里也没有arduino所以不能测试。
int ledPin[5]={5,7,9,11,13};
i ...

谢谢啊,有时间我去试一下,我之前也想做一个你这样的程序,只是语句运用的不太好,整了半天没整好。
发表于 2012-11-6 10:05 | 显示全部楼层
本帖最后由 炼心斋 于 2012-11-6 14:24 编辑

借鉴二位的程序,我给综合了一下。用switch语句编程。实验是成功的。谈不上创新,只是熟悉一下switch语句。效果是一样的。可能还没有楼主的简洁。onlycheat 的程序没看懂,见笑!纯新手,首发。





#define BUTTON 2//定义按键接口
int LED[5]={5,7,9,11,13};//定义LED接口
int state=0;//存放状态标志
int val = 0;//存放按键值
int i;

void setup()
{
  for( i=0;i<5;i++)
    pinMode(LED,OUTPUT);
  pinMode(BUTTON,INPUT);
}

void loop()
{
  val = digitalRead(BUTTON);
  if ( digitalRead(BUTTON)==HIGH) {
    while(digitalRead(BUTTON) == HIGH);
    for ( i= 0; i< 5; i++) {
      digitalWrite(LED, LOW);
    }
   switch(state){
        flag:
        case 0: digitalWrite(LED[state],HIGH); state++;break;
        case 1: digitalWrite(LED[state],HIGH); state++;break;
        case 2: digitalWrite(LED[state],HIGH); state++;break;
        case 3: digitalWrite(LED[state],HIGH); state++;break;
        case 4: digitalWrite(LED[state],HIGH); state++;break;
        case 5: digitalWrite(LED[state-5],HIGH); state=1;//完成case 0 的工作,并重新开始循环
      }      
  }
}

发表于 2012-11-6 14:29 | 显示全部楼层
奇怪!怎么老是斜体的。而且方括号自动被删除了。以上程序中,digitalWrite(LED,LOW)和pinMode(LED,OUTPUT)  语句是错的。LED后面应该有个 i ,并带方括号。系统问题,无法纠正。也许是网站的bug吧![]
发表于 2012-11-6 14:31 | 显示全部楼层
本帖最后由 炼心斋 于 2012-11-6 15:42 编辑

这回又能打方括号了。真晕。那就试着重发一下吧!

#define BUTTON 2//定义按键接口
int LED[5]={5,7,9,11,13};//定义LED接口
int state=0;//存放状态标志
int val = 0;//存放按键值
int i;

void setup()
{
  for( i=0;i<5;i++)
    pinMode(LED,OUTPUT);
  pinMode(BUTTON,INPUT);
}

void loop()
{
  val = digitalRead(BUTTON);
  if ( val == HIGH) {
    while(val == HIGH);
    for ( i= 0; i< 5; i++) {
      digitalWrite(LED, LOW);
    }
   switch(state){

        case 0: digitalWrite(LED[state],HIGH); state++;break;
        case 1: digitalWrite(LED[state],HIGH); state++;break;
        case 2: digitalWrite(LED[state],HIGH); state++;break;
        case 3: digitalWrite(LED[state],HIGH); state++;break;
        case 4: digitalWrite(LED[state],HIGH); state++;break;
        case 5: digitalWrite(LED[state-5],HIGH); state=1;//完成case 0 的工作,并重新开始循环
      }      
  }
}






发表于 2012-11-6 15:43 | 显示全部楼层
还是不行。一编辑就出错。
发表于 2012-11-7 08:16 | 显示全部楼层
来个改进版的。


#define BUTTON 2//定义按键接口
int LED[5]={5,7,9,11,13};//定义LED接口
int state=0;//存放状态标志
int val = 0;//存放按键值
int old_val = 0;//存放之前的状态
int i =0;

void setup()
{
  for( i=0;i<5;i++)
    pinMode(LED[i],OUTPUT);
  pinMode(BUTTON,INPUT);
}

void loop()
{
    for ( i= 0; i< 5; i++) {
      digitalWrite(LED[i], LOW);
    }
      switch(state){
        case 0: digitalWrite(LED[state],HIGH); break;
        case 1: digitalWrite(LED[state],HIGH); break;
        case 2: digitalWrite(LED[state],HIGH); break;
        case 3: digitalWrite(LED[state],HIGH); break;
        case 4: digitalWrite(LED[state],HIGH); break;
      }
     if ( state >= 5) state = 0;
     val = digitalRead(BUTTON);
     if ( val ==HIGH && old_val == LOW) {
     state++;
     delay(10);
     }
    old_val = val;


}
发表于 2012-11-7 08:34 | 显示全部楼层
onlycheat 发表于 2012-11-3 20:16
刚才用proteus模拟下该程序,发现许多问题,更正下。
int ledPin[5]={5,7,9,11,13};
int current=0,temp=0 ...

我来解释一下空循环语句。
在按键按下后、未松开之前,cpu执行空循环语句,不执行后续的语句。只有在按键松开后,高电平变为低电平时,cpu才退出空循环,继续执行后续的语句。由于按键按下后经过了一个机器周期才继续判断电平高低,可躲过因按键抖动产生的瞬时电平波动,客观上能起到防止按键抖动的作用。
这种方法,对于有些单片机是没有效果的,如STC(可能是由于制造工艺的问题)。不信可以试一试。
这是我自己的理解,不妥之处,请方家指正。
发表于 2012-11-7 14:29 | 显示全部楼层
本帖最后由 长长牙齿 于 2012-11-7 14:39 编辑

凑个热闹,简洁版:

int ledPin[5]={5,7,9,11,13};
int p=0;

void setup()
{
  while ( p++ < 5 )
     pinMode(ledPin[p-1],OUTPUT);
  pinMode(2,INPUT);
}

void loop()
{
  if ( digitalRead(2)==HIGH) {
    digitalWrite(ledPin[p], LOW);
    p = ++p % 5;
    digitalWrite(ledPin[p], HIGH);
    while(digitalRead(2) == HIGH)
      ;
  }
}

点评

while ( p++ < 5 ) pinMode(ledPin[p-1],OUTPUT); 上面这个while语句换成下面的 do while 语句,易读性也许会更好。 do pinMode(ledPin[p],OUTPUT); while ( p++ < 5 );   发表于 2012-11-7 19:47
p = ++p % 5; 这条除余语句用得很巧妙。学习了!  发表于 2012-11-7 16:37
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-27 07:56 , Processed in 0.136120 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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