第二课--多个led的闪烁/zh
Language | English |
---|
目的已经讲了点亮一个led的方法,接下来稍微扩展下,控制多个led依次闪烁。巩固与深化下microduino的I/O口用法。 设备
原理图
其实数码管共阴、共阳就是这个原理,以后会详细介绍驱动数码管。 程序
void setup() {
//定义microduino数字D3~D10脚为输出
for(int i=3;i<11;i++)
pinMode(i, OUTPUT);
}
void loop() {
for(int i=3;i<11;i++)
{
digitalWrite(i, HIGH); // 数据口i(D3~D10)输出高电平
delay(50); //延时50ms
digitalWrite(i, LOW); //// 数据口i(D3~D10)输出低电平
delay(50); //延时50ms
}
}
/*===============================================
ox(高-低:10,9,8,7)(高-低:6,5,4,3)
例如
0x81:10000001
10,9,8,7,6,5,4,3
↓ ↓ ↓ ↓↓ ↓↓ ↓
1 0 0 0 0 0 0 1
在共阴即所有led阴极都接在一起情况下,1代表亮,0代表灭,
就可以通过数组形式直接控制亮度。
=================================================*/
long data[]=
{
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,//单独一个从左至右亮
0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,//单独一个从从右至左亮
0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81,//两边往中间亮及中间往两边亮
0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff,//从左到右依次点亮
0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,//从右到左依次熄灭
};
void setup()
{
for(int x=3;x<11;x++)
{
pinMode(x,OUTPUT);//设置输出引脚
}
}
void loop()
{
for(int x=0;x<40;x++)//分别读取不同花样灯
{
leddisplay(data[x]);
delay(200); //每个状态显示200ms
}
leddisplay(0x00);//循环完毕全灭
delay(200);
}
void leddisplay(int num) // 将花样字模对应到端口显示
{
/*====================================================================
先将16进制数向右移x位(num>>x),x代表了microduinoI/O口对应16进制的某位,
0是最低位,7是最高位。再将移的数据与0x01按位与,就可以得到16进制数某位的
数据(0或1),再将其值赋值给microduino的I/O就行。
====================================================================*/
digitalWrite(3, ((num>>0)&0x01));
digitalWrite(4, ((num>>1)&0x01));
digitalWrite(5, ((num>>2)&0x01));
digitalWrite(6, ((num>>3)&0x01));
digitalWrite(7, ((num>>4)&0x01));
digitalWrite(8, ((num>>5)&0x01));
digitalWrite(9,((num>>6)&0x01));
digitalWrite(10,((num>>7)&0x01));
}
此实验类似51单片机流水灯写法,将16进制数组赋值到I/O,比如0x18表示2进制的00011000,对应值为“1”的灯亮,“0”的灭。能简单随意的写出各种花样。 两个实验比较,第一个实验看起来简单,效果单一,并且输出口必须连续,局限性很大。第二个实验就优化了,利用数组,将16进制的每位得值都赋值给指定的I/O口,可以实现花样流水。 结果
led从左到右依次循环点亮每一个led。
可以看到五种花样效果:单独一个从左至右亮;单独一个从从右至左亮;两边往中间亮及中间往两边亮;从左到右依次点亮;从右到左依次熄灭。 视频 |