概述

从点到线,从线到面。现在开始要来一片的 LED 了,一大波的 LED 正在到来!

示例程序

因为手头没有现成的模块,手头只有 595,所以这里每一个示例程序都是使用 74HC595 扩展 IO 口的。后面不多加备注了。

现成的模块还有其它专门的驱动芯片的,程序写起来就更简单了,要根据具体的驱动芯片来决定程序,这个程序不通用的哦。

点阵显示静止的心

别看到静止两个字,这里点阵可是动态扫描的哟。所以程序里不能有 delay() 等阻塞主函数的延时函数。

// ----------------------------------------------------------------------------
// LEDLattice.ino
//
// Created 2015-06-07
// By seesea <seesea2517#gmail#com>
//
// LED 点阵
// 使用两个 74HC595 驱动单色 LED 点阵
//
// ---------------------------------------------------------------------------- const unsigned char latchPin = ; // 595 的 ST_CP
const unsigned char clockPin = ; // 595 的 SH_CP
const unsigned char dataPin = ; // 595 的 DS #define SIZE 7 // 点阵的行列数 // 每一行的模值
const byte row[] =
{
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80
}; // 心形的取模
const byte heart[] =
{
0xFF, 0x93, 0x6D, 0x7D, 0xBB, 0xD7, 0xEF, 0xFF
}; void setup ()
{
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
} void loop()
{
showArrPic(heart);
} // 显示数组所代表的图片
void showArrPic(const byte arr[])
{
for (unsigned char i = ; i < ; ++i)
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, (byte) arr[i]);
shiftOut(dataPin, clockPin, LSBFIRST, (byte) row[i]);
digitalWrite(latchPin, HIGH);
}
} // 另一种方式显示数组所代表的图片
void showArrPic2(const byte arr[])
{
static unsigned char i = ; digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, arr[i]);
shiftOut(dataPin, clockPin, LSBFIRST, row[i]);
digitalWrite(latchPin, HIGH); if (++i >= SIZE)
i = ;
}

简单看看接线吧,没有现成的模块,都是手工现搭的,纯天然……不建议自己搭,麻烦耗时还容易出错。(偷懒只在 VCC 处接了一个限流电阻,效果也还过得去,不怕麻烦的同学可以多加几个 :D )

飘落的心

没错,它动起来了,所以它是动态扫描的。好吧,前面的语句是错误的示范 :D

这个程序示范了一个位移动画。

// ----------------------------------------------------------------------------
// latticeDownHeart.ino
//
// Created 2015-06-07
// By seesea <seesea2517#gmail#com>
//
// 点阵动画:飘落的心
// 使用两个 74HC595 驱动单色 LED 点阵,显示一个向下飘落的心,展示位移动画
//
// ---------------------------------------------------------------------------- const unsigned char latchPin = ; // 595 的 ST_CP
const unsigned char clockPin = ; // 595 的 SH_CP
const unsigned char dataPin = ; // 595 的 DS const unsigned long delayMs = ; // 图像运动延时时间 #define SIZE 8 // 点阵的行列数 // 每一行的模值
const byte row[] =
{
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80
}; // 心形的取模
const byte heart[] =
{
0xFF, 0x93, 0x6D, 0x7D, 0xBB, 0xD7, 0xEF, 0xFF
}; void setup ()
{
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
} void loop()
{
static char y = -;
static unsigned long lastTick = millis(); // 延时一定时间后,移动坐标
if (millis() - lastTick > delayMs)
{
++y;
lastTick = millis(); if (y > SIZE)
y = -;
} showArrPic(heart, , y);
} // 显示数组所代表的图片
// 以 (x, y) 为左上角起点位置,默认在 (0, 0) 位置显示
// 坐标系:
// +------>
// | x
// |
// v y
//
void showArrPic(const byte arr[], char x, char y)
{
for (char i = ; i < SIZE; ++i)
{
if (i + x < || i + x >= SIZE ||
i + y < || i + y >= SIZE)
{
continue;
} digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, (byte) arr[i + x]);
shiftOut(dataPin, clockPin, LSBFIRST, (byte) row[i + y]);
digitalWrite(latchPin, HIGH);
}
}

咦,手机拍下的效果还有拖影,将就点吧,意思到了就行:):

走动的小人

这里演示了一个逐帧动画。

// ----------------------------------------------------------------------------
// LEDLattice.ino
//
// Created 2015-06-07
// By seesea <seesea2517#gmail#com>
//
// 点阵动画:人物走路的逐帧动画演示
// 使用两个 74HC595 驱动单色 LED 点阵
//
// ---------------------------------------------------------------------------- const unsigned char latchPin = ; // 595 的 ST_CP
const unsigned char clockPin = ; // 595 的 SH_CP
const unsigned char dataPin = ; // 595 的 DS const unsigned long frameDelayMs = ; #define FRAME_NUM 4 // 关键帧帧数
#define SIZE 8 // 点阵的行列数 // 每一行的模值
const byte row[] =
{
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80
}; // 人物走路的关键帧的取模
const byte man[FRAME_NUM][SIZE] =
{
{0xE7,0xE7,0xFF,0xC3,0xC5,0xE7,0xDB,0xBD},
{0xE7,0xE7,0xFF,0xE7,0xE3,0xE7,0xEB,0xDB},
{0xE7,0xE7,0xFF,0xE7,0xE7,0xE7,0xE7,0xE7},
{0xE7,0xE7,0xFF,0xE7,0xE3,0xE7,0xEB,0xDB}
}; void setup ()
{
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
} void loop()
{
static unsigned long lastTick = millis();
static unsigned char frame = ; // 延时一帧时间后,进入下一帧
if (millis() - lastTick >= frameDelayMs)
{
lastTick = millis(); ++frame;
if (frame >= FRAME_NUM)
frame = ;
} showArrPic(man[frame]);
} // 显示数组所代表的图片
void showArrPic(const byte arr[])
{
for (unsigned char i = ; i < SIZE; ++i)
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, (byte) arr[i]);
shiftOut(dataPin, clockPin, LSBFIRST, (byte) row[i]);
digitalWrite(latchPin, HIGH);
}
}

没有绘画天分,这全是手工点出来的点阵越看越不像,大家将就点吧:

Arduino 入门程序示例之一片 LED(2015-06-11)的更多相关文章

  1. Arduino 入门程序示例之一个 LED(2015-06-11)

    前言 答应了群主写一些示例程序,一直拖延拖延拖延唉.主要还是害怕在各大高手面前班门弄斧……(这也算是给拖延症找一个美好的理由吧),这几天终于下决心要写出来了,各位高手拍砖敬请轻拍啊. 示例程序 首先是 ...

  2. Arduino 入门程序示例之一排 LED(2015-06-11)

    概述 最简单的一个 LED 的实验之后,自然是增加几个 LED,咱排成一排来玩吧.最后,再把一排的 LED 排成一个 8 字来玩——七段数码管. 示例程序 流水灯 第一个出场的肯定是经典的流水灯,也叫 ...

  3. Arduino 入门程序示例之直流电机(2015-06-15)

    概述 演示直流电机的控制. 示例程序 PWM控制直流电机 略过控制电机转停的示例啦,有需要就把这里的 PWM 换成数字口输出 HIGH 或 LOW 就行了. // ------------------ ...

  4. arduino入门学习实现语音控制LED灯

    需要的准备的硬件arduino+PC+麦克风实现语音命令控制LED灯的亮灭. 首先需要将写好的arduino程序烧录到arduino uno主板中,下面是代码如下: int val;//定义变量val ...

  5. 译文 [ROM][多国语言][2015.06.11] Lenovo S750 (MTK6589) - andrea_d86-lenovos750-4.2.2

    ************************************************** andrea_d86-lenovos750-4.2.2-150530 ************** ...

  6. 2015.06.11,技术,关于Matlab中的Jbtest检验

    总体分布的正态性检验一般采取Jarque-Bera检验方法. 1. JBTest检验的定义: 在统计学中,Jarque-Bera检验是对样本数据是否具有符合正态分布的偏度和峰度的拟合优度的检验.该检验 ...

  7. Arduino 极速入门系列–1 点亮 LED

    本篇内容为,使用 Arduino 点亮 LED 的做法示范.很简单的一个入门示范.我们让 LED 闪. 本篇使用到的工具和材料 Arduino Mini Pro 1 PCS Mini USB 数据线 ...

  8. Arduino入门学习

    一直听到许多做物联网.智能家居的控制器使用的是Arduino,从师兄那里拿到了一块Arduino开发板,进行了一下午的学习,感觉这个适合小孩子们玩:) 废话少说,总结一下,便于以后可能会用得到.我主要 ...

  9. struts2入门程序

    struts2入门程序 1.示例 搭建编程环境就先不说了,这里假设已经搭建好了编程环境,并且下好了strut2的jar包,接下来程序. 1.1 新建web项目 点击File->New->D ...

随机推荐

  1. 把Orchard部署到Windows Azure Web Sites

    很久前就想做个人站点,主要用来记录自己的生活,我喜欢摄影,烘焙…然后又刚刚入皮坑,这些都可以放在网站上展示一下,或许还能为自己带来收入. 然后手上刚好有Azure的试用,于是乎动力就上来了. 以下是部 ...

  2. CheckBox控件实现选项的选中

    1:设置控件属性 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xml ...

  3. 【Visual C++】游戏开发五十六 浅墨DirectX教程二十三 打造游戏GUI界面(一)

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/16384009 作者:毛星云 ...

  4. Shell Script(1)----variable compare

    PS:在学习python的时间里,抽空复习自己学习的Linux下的shell脚本知识点 1.数据类型 学习一门语言,比较关心其数据的表示方式,以及数据的类型,这里首先看一个bash shell的脚本 ...

  5. 移动平台WEB前端开发技巧汇总(转)

    最近我很关注移动前端的知识,但做为一个UI设计师和web前端工作人员没有这个工作环境接触,做为门外汉,网上系统的知识也了了,一直有种雾里看花的感觉,见到本文,我自己是奉为经典.所以我分享之后又专门打笔 ...

  6. 推荐font-size的单位 % em单位

    在如今这个提倡可用性设计以及用户体验设计的网络时代,CSS也是要一同参与其中的.大部分人在CSS代码编写中总是先对整体定义字体尺寸,中文情况下一般为12px,而其实这样以来在通过IE顶部菜单中的“察看 ...

  7. 55. 略谈Lotus Notes的与众不同及系列文章至此的总结

    在二十多年的悠久历史里,Lotus Notes发展出一整套独特的概念.技术和思维.由于它早期惊人的领先时代和后续发展中同样惊人的忠于传统,这位软件领域的寿星在如今发展更新速度远超往日和技术愈趋公开互通 ...

  8. 如何用java比较两个时间或日期的大小

    有一个字符串的时间,比如"2012-12-31 16:18:36" 与另一个时间做比较,如果前者比后者早,则返回true,否则返回false. 为此,我设计了一个方法. impor ...

  9. perl 安装Net::ZooKeeper

    <pre name="code" class="python"><pre name="code" class=" ...

  10. 设计模式(一)工厂模式Factory(创建型)

    设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.可是在一些情况下, new操作符直接生成对象会带来一些问题. ...