创客联盟网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

开思网在线3D打印服务
查看: 21555|回复: 0
打印 上一主题 下一主题

Arduino小白自学教程019——流水灯!

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-25 21:21:07 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

马上注册(开思网用户可以直接登录),结交更多创客好友,享用更多功能,让你轻松玩转创客社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
点亮1,2,3,4,5,6,7,8LED
其实我们第一节课已经学会点亮LED灯啦,这节课我们来学习下如何点亮八个灯,相信聪明的你早就知道如何点亮八个LED~
一般LED连接方式有这两种,其实没什么区别的,就是控制的方式不同,我一般是用红LED那种接法。
LED接法:数字脚输出低电平LED就亮
LED接法:数字脚输出高电平LED就亮
我按第一种接法连接好8LED灯,8LED的正极一起接到+5V那里,我们称之为“共阳”,假如是LED负极一起接到GND那里,我们称之为“共阴”,我们先要有这个概念,因为我们后面的数码管会涉及到,所以大家要记住,其实不难记,正都接在一起就共阳,负都接在一起就共阴。

现在我们回顾下之前是怎么点亮一个LED的,现在来示范下如何点亮13脚的led
[mw_shl_code=cpp,true]void setup()
{
pinMode(13, OUTPUT);
}
void loop()
{  
digitalWrite(led, HIGH);   
}[/mw_shl_code]
好了我们来点亮8led
[mw_shl_code=cpp,true]void setup()
{
  for(int a=0;a<8;a++)
  {
    pinMode(a,OUTPUT);
  }  
}
void loop()
{
   for(int b=0;b<8;b++)
  {
    digitalWrite(b, HIGH);
  }     
}[/mw_shl_code]
编译下载,我们可以看到8个led被点亮了!
如果我们想弄个一些花样,我们可以用最笨的办法。例如现在我想点亮第一个和第八个led
[mw_shl_code=applescript,true]void setup()
{
  for(int a=0;a<8;a++)
  {
    pinMode(a,OUTPUT);
  }  
}

void loop()
{
    digitalWrite(0, HIGH);
    digitalWrite(7,HIGH);  


   digitalWrite(1, LOW);
   digitalWrite(2, LOW);  
   digitalWrite(3, LOW);
   digitalWrite(4, LOW);
   digitalWrite(5, LOW);
   digitalWrite(6,LOW);   
}[/mw_shl_code]
编译下载,我们可以看到效果了,如果我们要弄很多花式写在一起不就很乱吗?那么我们怎么办呢?我们可以用子函数!例如我现在再增加一个花式就是第二个和第七个led亮
[mw_shl_code=cpp,true]void setup()
{
  for(int a=0;a<8;a++)
  {
    pinMode(a,OUTPUT);
  }  
}
void loop()
{
    digitalWrite(0, HIGH);
    digitalWrite(7,HIGH);  


   digitalWrite(1, LOW);
   digitalWrite(2, LOW);  
   digitalWrite(3, LOW);
   digitalWrite(4, LOW);
   digitalWrite(5, LOW);
   digitalWrite(6, LOW);   
   delay(1000);
/*******************全灭************************/
   digitalWrite(0, LOW);

   digitalWrite(1, LOW);  digitalWrite(2, LOW);  
   digitalWrite(3, LOW);  digitalWrite(4, LOW);
   digitalWrite(5, LOW);  digitalWrite(6, LOW);   
   digitalWrite(7, LOW);
   delay(1000);
/*******************************************/  

   digitalWrite(0, LOW);
   digitalWrite(1, HIGH);  digitalWrite(2, LOW);  
   digitalWrite(3, LOW);  digitalWrite(4, LOW);
   digitalWrite(5, LOW);  digitalWrite(6, HIGH);   
   digitalWrite(7,LOW);    delay(1000);
}[/mw_shl_code]
一般新手都是这样写的 呵呵。我们现在可以用三个子函数把3个花式包起来。我说下子函数和主函数的关系。我是这样理解的
[mw_shl_code=cpp,true]void loop()
{
}[/mw_shl_code]
{   }就是一个舞台~,子函数就是一个演员,一个有你可以自由支配的演员,你可以决定它是不是能上场!所以子函数可以写出来,但是放不放到loop的{}里面就要看你咯
例如现在我新建两个子函数,子函数的名字一般没有什么规定的,只要不要特殊的名字就可以了,例如int digital那些与现有的语句重复那就不行了。我新建三个子函数。一个叫

[mw_shl_code=cpp,true]void light18()
{
}[/mw_shl_code]
另外一个叫
[mw_shl_code=cpp,true]void light27()
{
}[/mw_shl_code]
再有一个叫
[mw_shl_code=cpp,true]void lightoff()
{
}[/mw_shl_code]
子函数名字就建立好了,里面可以不填写代码,但是那是没有意义咯。大家都知道,能上舞台的演员肯定有它的“内涵”哈。
好,我们现在补充下
[mw_shl_code=cpp,true]void light18()
{

    digitalWrite(0, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(1, LOW);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    delay(1000);
}[/mw_shl_code]

咦,怎么更上面那个程序里面的18led亮那段程序代码一样的?是的,其实是一样的,只不过我用个子函数把它装起来。如此类推剩下两个就是这样写。
[mw_shl_code=cpp,true]void light27()
{
    digitalWrite(0, LOW);
    digitalWrite(1, HIGH);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, HIGH);
    digitalWrite(7, LOW);
    delay(1000);
}[/mw_shl_code]

[mw_shl_code=cpp,true]void lightoff()
{
    digitalWrite(0, LOW);
    digitalWrite(1, LOW);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    delay(1000);
}[/mw_shl_code]

好了我们这样就把三个子函数的内涵添加上去了,现在我们就要请这些演员上舞台咯,非常简单,就是这样
[mw_shl_code=cpp,true]void loop()
{
  light18();
  lightoff();
  light27();
}[/mw_shl_code]
大家要注意把子函数请到舞台上,就不用写“void”了!但是要记住后面要加“;”(分号)
/*********************************************************************************************************************************************************************************/
现在我来给出一个完整的程序

[mw_shl_code=cpp,true]void setup()
{
for(int a=0;a<8;a++)
{
pinMode(a,OUTPUT);
}
}
void loop()
{
light18();
lightoff();
light27();
}
void light18()
{
digitalWrite(0, HIGH);
digitalWrite(7,HIGH);

digitalWrite(1, LOW);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
delay(1000);
}
void light27()
{
digitalWrite(0, LOW);
digitalWrite(1, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
digitalWrite(7,LOW);
delay(1000);
}
void lightoff()
{
digitalWrite(0, LOW);
digitalWrite(1, LOW);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
delay(1000);
}[/mw_shl_code]

另外提示下,子函数调用次数是不限制的!例如你这样:

[mw_shl_code=cpp,true]void loop()
{
  light18();
  lightoff();
  light27();
  light18();
  light18();
  ightoff();
  light18();
  light18();
}[/mw_shl_code]
编译下载,看看是不是跟上面那个没用子函数程序的效果一样。
如果以上你程序成功了,你试试自己写写自己的8led灯花式。大家一定要动手练练,多练才会出问题file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.png出问题后解决才会有进步。
好了,我假设你已经成功写出你的花式了。但是是不是有点累呢?有没有更简单的办法呢,其实是有的!用数组但是太难解释了,我不打算展开说明,大家会用我的程序就可以了。

上菜!
[mw_shl_code=cpp,true]uint8_t buf[]={
  0b01111111,0b10111111,0b11011111,0b11101111,0b11110111,0b11111011,0b11111101,0b11111110,// 从左到右逐个显示
  0b11111110,0b11111101,0b11111011,0b11110111,0b11101111,0b11011111,0b10111111,0b01111111,// 从右到左逐个显示
  0b01111110,0b10111101,0b11011011,0b11110111,0b11001111,0b11011011,0b10111101,0b01111110,// 向里从右到左逐个显示靠拢后分开
  0b01111111,0b00111111,0b00011111,0b00001111,0b00000111,0b00000011,0b00000001,0b00000000,// 向右逐个点亮
  0b00000001,0b00000011,0b00000111,0b00001111,0b00111111,0b00111111,0b01111111,0b11111111,// 向右逐个熄灭
};
int i=0;

void setup()
{
  for(int a=0;a<8;a++)
  {
    pinMode(a,OUTPUT);
  }  
}
void loop()
{
  ledflash(buf,180,sizeof(buf));//第一、第三个参数对应上面的数组名称buf,第二个参数是延时
}

void ledflash(uint8_t *p,uint16_t ntime ,uint16_t len)
{
    uint8_t temp;
   while(len--)
  {   
      temp = *p;
    for(int i=0;i<8;i++)
    {
        if(temp&0x80)
        digitalWrite(i,HIGH);
        else digitalWrite(i,LOW);
        temp<<=1;
    }
    delay(ntime);
    p++;
  }
}[/mw_shl_code]

数组里面有“0bXXXXXXXX”X只能是018X对应8led。当那个位是0时,对应位led就会点亮,例如
0b01111111。第一个led亮了,其他如此类推!如果我们需要增加花式,那就在后面继续按格式填写就可以了。然后主函数里面,调用 ledflash(buf,X,sizeof(buf));X是修改延时的,大家试一试!




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|创客联盟网  

GMT+8, 2024-5-18 07:03 , Processed in 0.017455 second(s), 10 queries , Gzip On, Redis On.

Powered by Discuz! X3.3

© 2002-2024 www.iCAx.org

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