第五章 LED的魔性操作
想必大家都见过城市里漂亮的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);
}
第五章 LED的魔性操作的更多相关文章
- jQuery 实战读书笔记之第五章:使用 jQuery 操作页面
		
html 如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> &l ...
 - 《FPGA全程进阶---实战演练》第五章 基于74HC595的LED操作
		
1基础理论部分 1.1分频 分频,是的,这个概念也很重要.分频是指将一单一频率信号的频率降低为原来的1/N,就叫N分频.实现分频的电路或装置称为“分频器”,如把33MHZ的信号2分频得到16.5MHZ ...
 - 第五章、Django之模型层---单表操作
		
目录 第五章.Django之模型层---单表操作 一.ORM查询 二.Django测试环境搭建 三.单表查询 1. 增 2. 改 3. 删 4. 查 第五章.Django之模型层---单表操作 一.O ...
 - 第十五章、python中的进程操作-开启多进程
		
目录 第十五章.python中的进程操作-开启多进程 一.multprocess模块 二.multprocess.process模块 三.Process()对象方法介绍 四.Process()对象属性 ...
 - 《Entity Framework 6 Recipes》中文翻译系列 (22) -----第五章 加载实体和导航属性之延迟加载
		
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第五章 加载实体和导航属性 实体框架提供了非常棒的建模环境,它允许开发人员可视化地使 ...
 - Java语言程序设计(基础篇) 第五章 循环
		
第五章 循环 5.2 while循环 1.while循环的语法如下: while(循环继续条件){ //循环体 语句(组); } 2.程序:提示用户为两个个位数相加的问题给出答案 package co ...
 - 读《编写可维护的JavaScript》第五章总结
		
第五章 UI层的松耦合 5.1 什么是松耦合 在Web开发中,用户界面是由三个彼此隔离又相互作用的层定义的: HTML是用来定义页面的数据和语义 CSS用来给页面添加样式 JavaScript用来给页 ...
 - 《Linux内核设计与实现》课本第五章学习笔记——20135203齐岳
		
<Linux内核设计与实现>课本第五章学习笔记 By20135203齐岳 与内核通信 用户空间进程和硬件设备之间通过系统调用来交互,其主要作用有三个. 为用户空间提供了硬件的抽象接口. 保 ...
 - 《java编程思想》读书笔记(一)开篇&第五章(1)
		
2017 ---新篇章 今天终于找到阅读<java编程思想>这本书方法了,表示打开了一个新世界. 第一章:对象导论 内容不多但也有20页,主要是对整本书的一个概括.因为已经有过完整JAV ...
 
随机推荐
- python (2) 之 pyc
			
最近在编写Python脚本过程中遇到一个问题比较奇怪:Python脚本正常的,但执行报错"AttributeError: 'module' object has no attribute ' ...
 - Phyton Flask框架学习记录。
			
注意:在左侧菜单栏(在JQuery插件库下载的)右边是采用<iframe> 标签嵌入其他页面,此时标签的src应用用后台中的方法名称(本人测试用的是无参数的方法), 而页面跳转window ...
 - django contenttype 表应用
			
Django contenttypes 应用 contenttypes 是Django内置的一个应用,可以追踪项目中所有app和model的对应关系,并记录在ContentType表中. 每当我们创建 ...
 - 在Linux系统中,使用useradd命令新建用户后,登录该用户时shell开头为$,不显示用户名和路径,如下:
			
在~/.bash_profile中加入以下代码,若无该文件可自行创建: vi ~/.bash_profile #加入 #export PS1='[u@h W]$' 大写W代表最后路径,小写w代表详细路 ...
 - oracle 备份恢复篇(三)---rman  spfile的丢失
			
一,环境准备 1, 拥有全备 数据 2, 查看spfile文件位置 SQL> SQL> SELECT NAME, VALUE, DISPLAY_VALUE FROM V$PARAMETER ...
 - 为什么一段时间后网站后台自动退出 php中session过期时间设置
			
修改php配置文件中的session.gc_maxlifetime.如果想了解更多session回收机制,继续阅读.(本文环境php5.2) 概述:每一次php请求,会有1/100的概率(默认值)触发 ...
 - Composite Design Pattern in Java--转
			
https://dzone.com/articles/composite-design-pattern-in-java-1 The composite pattern is meant to &quo ...
 - pycharm激活码------2017.11.之前有效
			
BIG3CLIK6F-eyJsaWNlbnNlSWQiOiJCSUczQ0xJSzZGIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiI ...
 - SpringSecurity 3.2入门(3)单用户登录
			
1.增加web.xml文件配置如下 <!-- 获取Spring Security session的生命周期,这个监听器会在 session 创建和销毁的时候通知 Spring Security ...
 - python数据处理
			
1.数据清洗 1.1 数据格式化 数据格式化是数据清洗常见的形式之一,就是将可读性差的或无法阅读的数据转换成可读性较强的数据格式. python对字符串和数字都有格式化的方法,如%s, %d分别代表格 ...