极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 29345|回复: 6

Arduino控制六位流水灯,采用两种方式让发光二极管循环显示

[复制链接]
发表于 2014-5-25 17:08:26 | 显示全部楼层 |阅读模式
本帖最后由 930417801 于 2014-5-25 17:57 编辑

//第一种方式,采用顺序模式,先让六个发光二极管依次点亮然后在依次熄灭
void setup() {               
  // 初始化数字引脚,使其为输出状态。
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(8, HIGH);   // 使Led亮
  delay(100);
  digitalWrite(9, HIGH);   // 使Led亮
  delay(100);
  digitalWrite(10,HIGH);
  delay(100);
  digitalWrite(11,HIGH);
  delay(100);
  digitalWrite(12,HIGH);
  delay(100);
  digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13, LOW);   
  delay(100);
  digitalWrite(12, LOW);   
  delay(100);
  digitalWrite(11, LOW);   
  delay(100);
  digitalWrite(10, LOW);   
  delay(100);
  digitalWrite(9, LOW);   
  delay(100);   
  digitalWrite(8, LOW);   
  delay(100);

}
第二种方式用for循环,先让六个发光二极管依次点亮然后在依次熄灭
void setup()
{
  for (int i=0; i<=5; i++)    //通过循环的方式设置0-5号引脚为输出状态
  {
    pinMode(i,OUTPUT);
  }
}
void loop()
{
  for (int x=0; x<=5; x++)   //通过循环的方式依次让每个引脚的led在0.5秒内发光
  {
    digitalWrite(x,HIGH);
    delay(150);
}
for (int x=5; x>=0; x--)   //通过循环的方式依次让每个引脚的led在0.5秒熄灭
  {
    digitalWrite(x,LOW);
    delay(150);
}
}
回复

使用道具 举报

发表于 2014-5-25 20:09:52 | 显示全部楼层
加油啊 朋友
回复 支持 反对

使用道具 举报

发表于 2014-5-25 21:43:39 | 显示全部楼层
加油,你也可以把它升级成这个形式的流水灯了。

回复 支持 反对

使用道具 举报

发表于 2014-11-3 20:18:18 | 显示全部楼层
好东西    。。。。
回复 支持 反对

使用道具 举报

发表于 2014-11-22 21:46:36 | 显示全部楼层
正好用到,太好了
回复 支持 反对

使用道具 举报

发表于 2015-1-26 12:29:30 | 显示全部楼层
我也提供一些我的两种方法。

1. 用PORTB 来实现。
void loop()
{
  

  int lamp=1;
  for (int x=1; x<= 6; x++)   //通过循环的方式依次让每个引脚的led在0.5秒内发光
  {
    PORTB = lamp;
    lamp = lamp << 1;
    delay(150);
  }


  lamp = lamp >> 1;
  for (int x=1; x< 5; x++)   //通过循环的方式依次让每个引脚的led在0.5秒熄灭
  {
    PORTB = lamp;
    lamp = lamp >> 1;
    delay(150);
  }

  
}


2. 用Timer1的库来实现

#define Macro_SetPin( pin, state )  ( ( (state) == LOW ) ? Macro_SetPinLow( (pin) ) : Macro_SetPinHigh( (pin) ) )
#define Macro_SetPinLow( pin )   ( (pin) < 8 ) ? PORTD = PORTD & ~( 1 << (pin) )  : PORTB = PORTB & ~( 1 << ( (pin) - 8 ) )
#define Macro_SetPinHigh( pin )  ( (pin) < 8 ) ? PORTD = PORTD |  ( 1 << (pin) )  : PORTB = PORTB | ( 1 << ( (pin) - 8 ) )

#include <TimerOne.h>

int lamp=1;
int dir =0;

void timer_isr() {
  
  if (lamp == 32) {
    dir = 1;
  }
  
  if (lamp == 1) {
    dir = 0;
  }
  
  if (dir == 0) {
    lamp = lamp << 1;
  } else {
    lamp = lamp >> 1;
  }
  
  PORTB = lamp;
}

// 9-13
int pin=9;
int dir2;

void timer_isr2() {
  
  if (pin == 13) {
    dir2 = 1;
  }
  
  if (pin == 9) {
    dir2 = 0;
  }
  
  if (dir2 == 0) {
    pin = pin + 1;
    Macro_SetPinHigh( pin );
    Macro_SetPinLow( pin-1 );
  } else {
    pin = pin - 1;
    Macro_SetPinHigh( pin );
    Macro_SetPinLow( pin+1 );
  }
}

void setup()
{
  for (int i=9; i<=13; i++)    //通过循环的方式设置0-5号引脚为输出状态
  {
    pinMode(i,OUTPUT);
  }
  
  Timer1.initialize(150000);
  Timer1.attachInterrupt(timer_isr2);
}
回复 支持 反对

使用道具 举报

发表于 2015-1-26 23:08:52 来自手机 | 显示全部楼层
如果我用只用6个analog做渐变流水灯该怎么用for呢?
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-17 11:35 , Processed in 0.047984 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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