第五章 LED的魔性操作

Posted stringsir

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第五章 LED的魔性操作相关的知识,希望对你有一定的参考价值。

想必大家都见过城市里漂亮的led广告牌吧,这一节我将带大家学习这些LED广告牌最基本的实现原理

初识LED

接线方法:D1~D8从接23~37号数字端口,v1和前面的针头分别接41号和39号数字端口,v2接负极。

#include <LNDZ.h>
twled led(23,39,41);//定义led灯端口从23号开始,39号和41号分别为红色和绿色
void init()
{
   B_start();
   led.sw(1,red);//1号亮红灯
   delay(500);  //亮0.5s
   led.sw(1,0);  //1号红灯熄灭
   led.sw(2,green);
   delay(500);
   led.sw(2,0);
   led.sw(3,orange);
   delay(500);
   led.sw(3,0);
}
void repeat()
{   

}

上传代码运行起来的效果是1号灯亮红灯0.5s,熄灭后,2号灯亮绿灯0.5s,熄灭后,3号灯亮黄灯0.5s。如果没有这种效果要么就是没插稳,要么就是接线错误。

 

在成功运行前面的程序后,大家应该对led灯有所了解,那么下面我来教大家写一下从头亮到尾的走马灯效果。

 

#include <LNDZ.h>
twled led(23,39,41);//定义led灯端口从23号开始,39号和41号分别为红色和绿色
void init()
{
   B_start();
}
void repeat()
{   
  for(int i=0;i<=8;i++){
   led.sw(i,red);//1号亮红灯
   delay(500);  //亮0.5s
}
}

 

上面的两个程序都是在别人封装函数的基础上进行的对led的操作,当你需要更高的特效时你就不能用这个函数,因为这个函数虽然帮助你快速的写出了简单特效,但是效率很低,我们学习机器人的目的不是为了学习怎么使用别人写好的东西,而是要学习机器人的原理和思维,所以下面我重点阐述如何才能做出更高级的、更有特效的的led灯的思维方法。

 

Led灯进一步学习

技术分享图片

 

 

上面是led灯的原理图

大家都知道灯泡要同时连接正负极才能发光。图中的DP1就可以看成发红光的灯泡,DP2可以看成发绿光的灯泡,当D1(23)J2-1(39)同时输电,DP1就会亮起来,当D1(23)J2-2(41)同时输电,DP2就会亮起来,当DP1DP2同时亮起来时红绿光加在一起就会变成橙光,这就是led的基本原理。

 

有的人可能会问那8个灯同时亮是怎么实现的呢。其实8个灯同时亮是人眼的一种错觉,举个例子说明可能你更能理解,1号灯亮起来1s,熄灭,然后2号灯亮起1s,熄灭,再1号灯亮起来1s。。。不停,你可以看到1号灯亮再2号灯亮。然后我们把灯亮的时间减为1ms1号灯亮起来1ms,熄灭,然后2号灯亮起1ms,熄灭,再1号灯亮起来1ms。。。不停,1号灯亮lms2号灯亮起来了,但是在短时间内1号灯的残影还在大脑中,残影消失之前再亮起1号灯就达到了人眼看起来1号和2号灯同时亮的状态。同理8个灯同时亮你只需要交替八个灯每个亮1ms,不停切换就可以了,这就是程序的神奇之处。

 

三色齐亮的效果

#include <LNDZ.h>
int i;
void init()
{
   B_start();   
}
void repeat()
{
  for(i=23;i<=27;i=i+2)
   {
       DO(i);DW(i,1);//向i号端口输入1(1就是输电,0就是不输电)
       if(i==23)
       {   
         DO(39);DW(39,1); //向39号端口输入1,
         DO(41);DW(41,0); //向41号端口输入0,i号红灯亮起
         delay(1);
       }
       if(i==25)
       {   
         DO(39);DW(39,0); //向39号端口输入0
         DO(41);DW(41,1); //向41号端口输入1,i号绿灯亮起
         delay(1);
       }if(i==27)
       {   
         DO(39);DW(39,1); //向39号端口输入1,
         DO(41);DW(41,1); //向39号端口输入1, i号黄灯亮起
         delay(1);
       } 
       DO(i);DW(i,0);     
   }
}

 

LED灯动画特效

下面是我写的两个酷炫led灯动画特效。

实例1:

#include <LNDZ.h>
int t = 23, i = 23;
void init()
{
  B_start();
}
void repeat()
{
  //逐个慢亮
  for (i = 23; i < 39; i++, i++) {
    DO(i); DW(i, true);
    green_();
    delay(100);
  }
  while (true) {
    for (t = 23; t < 39; t += 2)
      for (int l = 0; l < 10; l++) {
        for (i = 23; i < 39; i += 2) {
          DO(i); DW(i, true);
          if (i <= t) orange_();
          else   green_();
          delay(1);
          DO(i); DW(i, false);
        }
      }
    for (t = 23; t < 39; t += 2)
      for (int l = 0; l < 10; l++) {
        for (i = 23; i < 39; i += 2) {
          DO(i); DW(i, true);
          if (i <= t) red_();
          else   orange_();
          delay(1);
          DO(i); DW(i, false);
        }
      }
          for (t = 23; t < 39; t += 2)
      for (int l = 0; l < 10; l++) {
        for (i = 23; i < 39; i += 2) {
          DO(i); DW(i, true);
          if (i <= t) green_();
          else   red_();
          delay(1);
          DO(i); DW(i, false);
        }
      }
  }
}

void red_()
{
  DO(39); DW(39, true);
  DO(41); DW(41, false);
}

void green_()
{
  DO(39); DW(39, false);
  DO(41); DW(41, true);
}

void orange_()
{
  DO(39); DW(39, true);
  DO(41); DW(41, true);
}

 

实例2:

#include <LNDZ.h>

 

//对代码进行宏,增加代码可读性

#define Red();         DO(39); DW(39, true); DO(41); DW(41, false);

#define Green();     DO(39); DW(39, false);DO(41); DW(41, true);

#define Orange();   DO(39); DW(39, true); DO(41); DW(41, true);

//输入端在指定在x端口输电,但是在实际使用中必须放在灯颜色控制宏之后,目的是为了关闭前面那个灯执行完效果后关闭显示。

#define InPut(x);     DO(x); DW(x, true);delay(1);DO(x); DW(x, false);

 

long long d;

void init()

{

  B_start();

}

void repeat()

{

  int t;

  

  for (t = 0; t <= 8; t++)//8个灯每个灯都实现动画

    for (int j = 23; j <= (37 - t * 2); j += 2) {//过渡效果

      d = millis();

      while ((millis() - d) <= 50) {//控制每一帧的时间

        Green(); InPut(j);

        for (int i = 37; i > (37 - t * 2); i--, i--) {Green();InPut(i);}//计算每一帧的效果

      }

    }   

  d = millis();

  while((millis() - d) <= 300){

    for(int i=23;i<39;i+=2){Green(); InPut(i);}

  }

 

  for (t = 7; t >= 0; t--)

    for (int j = 23 + t * 2; j < 39; j += 2) {

      d = millis();

      while ((millis() - d) <= 50) {

        Green(); InPut(j);

        for (int i = 23; i < (23 + t * 2); i+=2) {Green();InPut(i);}

      }

    }

    //delay(300);

/*======================================================================================*/

      for (t = 0; t <= 8; t++)

    for (int j = 23; j <= (37 - t * 2); j += 2) {

      d = millis();

      while ((millis() - d) <= 50) {

        Red(); InPut(j);

        for (int i = 37; i > (37 - t * 2); i--, i--) {Red();InPut(i);}

      }

    }   

  d = millis();

  while((millis() - d) <= 300){

    for(int i=23;i<39;i+=2){Red(); InPut(i);}

  }

 

  for (t = 7; t >= 0; t--)

    for (int j = 23 + t * 2; j < 39; j += 2) {

      d = millis();

      while ((millis() - d) <= 50) {

        Red(); InPut(j);

        for (int i = 23; i < (23 + t * 2); i+=2) {Red();InPut(i);}

      }

    }

    //delay(300);

/*======================================================================================*/

   for (t = 0; t <= 8; t++)

    for (int j = 23; j <= (37 - t * 2); j += 2) {

      d = millis();

      while ((millis() - d) <= 50) {

        Orange(); InPut(j);

        for (int i = 37; i > (37 - t * 2); i--, i--) {Orange();InPut(i);}

      }

    }   

  d = millis();

  while((millis() - d) <= 300){

    for(int i=23;i<39;i+=2){Orange(); InPut(i);}

  }

 

  for (t = 7; t >= 0; t--)

    for (int j = 23 + t * 2; j < 39; j += 2) {

      d = millis();

      while ((millis() - d) <= 50) {

        Orange(); InPut(j);

        for (int i = 23; i < (23 + t * 2); i+=2) {Orange();InPut(i);}

      }

    }

    //delay(300);

}

 

以上是关于第五章 LED的魔性操作的主要内容,如果未能解决你的问题,请参考以下文章

《恶意代码分析实战》-第五章 IDA Pro(含20种必备操作技能)

使用汇编按照GPIO操作流程点亮LED灯

JAVA-初步认识-第五章-数组-常见操作-遍历

第五章编程任务与二叉树基本操作

第五章学习心得

第五章学习心得