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

初识LED

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

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

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

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

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

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

Led灯进一步学习

上面是led灯的原理图

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

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

三色齐亮的效果

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

LED灯动画特效

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

实例1:

#include <LNDZ.h>
int t = , i = ;
void init()
{
B_start();
}
void repeat()
{
//逐个慢亮
for (i = ; i < ; i++, i++) {
DO(i); DW(i, true);
green_();
delay();
}
while (true) {
for (t = ; t < ; t += )
for (int l = ; l < ; l++) {
for (i = ; i < ; i += ) {
DO(i); DW(i, true);
if (i <= t) orange_();
else green_();
delay();
DO(i); DW(i, false);
}
}
for (t = ; t < ; t += )
for (int l = ; l < ; l++) {
for (i = ; i < ; i += ) {
DO(i); DW(i, true);
if (i <= t) red_();
else orange_();
delay();
DO(i); DW(i, false);
}
}
for (t = ; t < ; t += )
for (int l = ; l < ; l++) {
for (i = ; i < ; i += ) {
DO(i); DW(i, true);
if (i <= t) green_();
else red_();
delay();
DO(i); DW(i, false);
}
}
}
} void red_()
{
DO(); DW(, true);
DO(); DW(, false);
} void green_()
{
DO(); DW(, false);
DO(); DW(, true);
} void orange_()
{
DO(); DW(, true);
DO(); DW(, 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 = ; t <= ; t++)//8个灯每个灯都实现动画

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

      d = millis();

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

        Green(); InPut(j);

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

      }

    }   

  d = millis();

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

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

  }

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

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

      d = millis();

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

        Green(); InPut(j);

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

      }

    }

    //delay(300);

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

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

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

      d = millis();

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

        Red(); InPut(j);

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

      }

    }   

  d = millis();

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

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

  }

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

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

      d = millis();

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

        Red(); InPut(j);

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

      }

    }

    //delay(300);

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

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

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

      d = millis();

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

        Orange(); InPut(j);

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

      }

    }   

  d = millis();

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

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

  }

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

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

      d = millis();

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

        Orange(); InPut(j);

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

      }

    }

    //delay(300);

}

最新文章

  1. bzoj1878--离线+树状数组
  2. html 学习(一)
  3. Python学习笔记10
  4. 快速排序C++
  5. php多维数组化一维数组
  6. bootStrap modal无法滚动处理
  7. python学习笔记25(文件管理 os包)
  8. 【斜率DP】BZOJ 1911:特别行动队
  9. 网络广告公司的恐慌 XSS广告终结者(html5新特性)
  10. 使用Python实现的杨辉三角
  11. linux内存管理初始化
  12. Spring对象生存周期(Scope)的分析
  13. Linux的内存分页管理
  14. Python爬虫入门教程 20-100 慕课网免费课程抓取
  15. 使用反射动态调用ActiveX控件
  16. hashcode()和equals()
  17. bittorrent 学习(三) MSG
  18. Inflated 3D ConvNet 【I3D】
  19. 【Collection、泛型】
  20. vue.js面试题整理

热门文章

  1. [原创]Aop之使用Autofac+Castle 自动注入服务且动态代理服务实现拦截(非MVC控制器拦截)
  2. Map接口常用实现类学习
  3. Oracle RAC集群搭建(五)--oracle部署
  4. 基于memcache的缓存机制的6个指令
  5. Python基本数据类型和其常用方法
  6. 接口隔离原则(Interface Segregation Principle)ISP
  7. isqlplus的使用
  8. ksframework的xlua版本
  9. BNU 4260 ——Trick or Treat——————【三分求抛物线顶点】
  10. 吴恩达《Machine Learning Yearning》总结(31-40章)