第二课--多个led的闪烁实验/zh
Radiumray9@gmail.com(讨论 | 贡献)2014年11月5日 (三) 07:30的版本
Language | English |
---|
目的通过第一个实验,我们已经知道如何控制一个led灯,接下来稍微扩展下,制作花样流水灯。 设备Microduino-CoreSTM32是采用 STM32F103CBT6芯片的ARM开发板,采用独特的Upin7接口,大小与一枚一元硬币差不多大,完全兼容Microduino其他扩展模块。
实验原理图我们采用8个led灯,因此我们需要用到8个I/O口。 led的阴极接Microduino-CoreSTM32的GND,阳极接Microduino-CoreSTM32数据控制口D3~D10,高电平点亮led。我们可以通过设置高低电平来实现花样流水的效果。 程序
void setup() {
//定义数字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
}
}
我们来看看程序结构: 采用for()循环结构语句,通过pinMode()函数定义数字D3~D10脚为输出,再通过for()循环依次让每个led灯闪烁。
采用16进制数组,将数据移位输出送至每个I/O口,花样流水 /*===============================================
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代表了Microduino-CoreSTM32I/O口对应16进制的某位,
0是最低位,7是最高位。再将移的数据与0x01按位与,就可以得到16进制数某位的
数据(0或1),再将其值赋值给Microduino-CoreSTM32的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));
}
将16进制数对应赋值到I/O,比如0x18表示2进制的00011000,对应值为“1”的灯亮,“0”的灭。能简单随意的写出各种花样。 两个实验比较,第一个实验看起来简单,效果单一,并且输出口必须连续,局限性很大。第二个实验就优化了,利用数组,将16进制的每位得值都赋值给指定的I/O口,可以实现花样流水。 调试
结果
led从左到右依次循环点亮每一个led。
可以看到五种花样效果:单独一个从左至右亮;单独一个从从右至左亮;两边往中间亮及中间往两边亮;从左到右依次点亮;从右到左依次熄灭。|} |