马上注册(开思网用户可以直接登录),结交更多创客好友,享用更多功能,让你轻松玩转创客社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
点亮1,2,3,4,5,6,7,8个LED 其实我们第一节课已经学会点亮LED灯啦,这节课我们来学习下如何点亮八个灯,相信聪明的你早就知道如何点亮八个LED了~ 一般LED连接方式有这两种,其实没什么区别的,就是控制的方式不同,我一般是用红LED那种接法。 红LED接法:数字脚输出低电平LED就亮 蓝LED接法:数字脚输出高电平LED就亮 我按第一种接法连接好8个LED灯,8个LED的正极一起接到+5V那里,我们称之为“共阳”,假如是LED负极一起接到GND那里,我们称之为“共阴”,我们先要有这个概念,因为我们后面的数码管会涉及到,所以大家要记住,其实不难记,正都接在一起就共阳,负都接在一起就共阴。
现在我们回顾下之前是怎么点亮一个LED的,现在来示范下如何点亮13脚的led [mw_shl_code=cpp,true]void setup()
{
pinMode(13, OUTPUT);
}
void loop()
{
digitalWrite(led, HIGH);
}[/mw_shl_code] 好了我们来点亮8个led吧
[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]
咦,怎么更上面那个程序里面的1、8led亮那段程序代码一样的?是的,其实是一样的,只不过我用个子函数把它装起来。如此类推剩下两个就是这样写。
[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]
编译下载,看看是不是跟上面那个没用子函数程序的效果一样。
如果以上你程序成功了,你试试自己写写自己的8个led灯花式。大家一定要动手练练,多练才会出问题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只能是0和1,8个X对应8个led。当那个位是0时,对应位led就会点亮,例如
0b01111111。第一个led亮了,其他如此类推!如果我们需要增加花式,那就在后面继续按格式填写就可以了。然后主函数里面,调用 ledflash(buf,X,sizeof(buf));X是修改延时的,大家试一试!
|