0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于移位寄存器的发光二极管立方体(4*4)编写代码

电子设计 来源:电路城 作者:电路城 2021-05-21 17:49 次阅读

该项目主要是为带有移位寄存器的发光二极管立方体(4*4)编写代码,为立方体创造不同的模式。

硬件组件:

Arduino Nano R3

移位寄存器75HC595

瞬时按钮开关

发光二极管

4*4立方体:

该立方体有16条腿和4排的立方体。Les s把这些行叫做层。如何将这16条支路连接到Arduino而不占用其所有引脚的最简单方法是使用移位寄存器75HC595。

基于移位寄存器的发光二极管立方体(4*4)编写代码

(移位寄存器75HC595)

将立方体的前8个引脚(1-8)连接到第一个移位寄存器(引脚Q0-Q7),并将其他8个引脚(9-16)连接到另一个引脚,如俯视图中的表格所示:

基于移位寄存器的发光二极管立方体(4*4)编写代码

(俯视立方体的腿)

下一步是用Arduino连接移位寄存器的引脚,如下所示:

引脚8(两个移位寄存器/ GND)至阿尔杜伊诺的接地引脚

第一移位寄存器的引脚9 (Q7)至第二移位寄存器的引脚14(数据)

引脚10(两个移位寄存器/复位)至Arduino的引脚8

引脚11(两个移位寄存器/时钟)至Arduino的引脚9

引脚12(两个移位寄存器/锁存器)至Arduino的引脚10

引脚14(第一个移位寄存器/数据)至Arduino的引脚11

引脚16(两个移位寄存器/ VCC)至Arduino的5V引脚

最后一步是用Arduino连接立方体的层:

引脚4 -第0层(通过100欧姆电阻

引脚5 -第1层(通过100欧姆电阻)

引脚6 -第2层(通过100欧姆电阻)

引脚7 -第3层(通过100欧姆电阻)

(立方体的底部)

控制led

一层中的每个led都由一个数字表示,如下表所示:

基于移位寄存器的发光二极管立方体(4*4)编写代码

(打开指示灯的值)

所以要打开图层第二行的第二个led,就会设置layer = 32。要打开前两个led,layer = 1 + 2 = 3。要打开第一行led,layer = 1 + 2 + 4 + 8 = 15。

如果想将循环中的光穿过层中的所有LED,在第一步中,设置layer=b000000000000001=1,然后在循环中,将通过设置layer=layer《《1来移动该位。或者可以设置layer=(1《《count)并在循环中增加“count”。

主回路:

当知道如何在一层中设置led时,想要控制4层。虽然只能向我们的2个移位寄存器发送关于1层的信息,但使用Arduino的主循环来非常快速地打开和关闭循环中的层,它们将在同一时刻全部改变。显示图层值的代码非常简单:

SetShiftReg(layer[k]); //将层数据发送到移位寄存器

bitClear(PORTD, 4 + k); //启用“层k”

delay(1); //对LED亮度很重要

PORTD |= B11110000; //关闭图层

k++; if (k 》 3) k = 0; //在循环中再增加一层

在该项目中,使用按钮(与接地和Arduino的引脚2连接)来改变创建的模式。按下按钮设置“开始”。这个开始采用并初始化下一个模式。

然后,循环在“速度时间”值中设置的每一个时间(以毫秒为单位)后启动选定的模式。

关于主循环和按钮的标签

#define buttonPin 2

unsigned int layer[4] = {0, 0, 0, 0}; //65535填充层

byte k = 0;

bool start = true;

unsigned long delayTime;

int speedTime = 0;

int count;

void setup() {

InitializeShiftReg();

InitializeMyLedCube();

}

void InitializeMyLedCube() {

DDRD = B11110000; //引脚D0-D3作为输入,D4-D7作为输出

PORTD |= B11110000; //关闭图层

pinMode(buttonPin, INPUT_PULLUP);

attachInterrupt(digitalPinToInterrupt(buttonPin), PushButton, FALLING);

delayTime = millis();

}

byte patternNum = 28;

byte pattern = patternNum - 1;

void loop() {

if (start) {

detachInterrupt(digitalPinToInterrupt(buttonPin));

delay(500); //等待释放按钮

pattern++;

if (pattern 》 patternNum) pattern = 1;

attachInterrupt(digitalPinToInterrupt(buttonPin), PushButton, FALLING);

count = 0;

}

if (((millis() - delayTime) 》 speedTime) || start) {

switch (pattern) {

case 1: LayersUpDown(); break;

case 2: FallingDot(); break;

case 3: Rain(); break;

case 4: AllCube(); break;

case 5: Cut(); break;

case 6: Cube(); break;

case 7: Diagonal(); break;

case 8: Mixer(); break;

case 9: Random(); break;

case 10: FallingLayer(); break;

case 11: LayerCut(); break;

case 12: Circle(); break;

case 13: RandomWay(); break;

case 14: SmallCube(); break;

case 15: RandomWayCube(); break;

case 16: GrowingCube(); break;

case 17: FallingLayers(); break;

case 18: GrowingLine(); break;

case 19: CircleEdges(); break;

case 20: CircleSide(); break;

case 21: RandomWayLine(); break;

case 22: RandomWaySide(); break;

case 23: DJCube(); break;

case 24: FillingCube(); break;

case 25: NanoBuilding(); break;

case 26: Curve(); break;

case 27: Snake(); break;

case 28: Julka(); break;

default: break;

}

delayTime = millis();

}

//此部分显示在函数中设置的图层

SetShiftReg(layer[k]); //将层数据发送到移位寄存器

bitClear(PORTD, 4 + k); //启用“层k”

delay(1); //对LED亮度很重要

PORTD |= B11110000; //关闭图层

k++; if (k 》 3) k = 0; //在循环中再增加一层

}

void PushButton() {

start = true;

}

“移位寄存器”标签:

#define latchPin 10 //端口 B2

#define clockPin 9 //端口 B1

#define dataPin 11 //端口B3

#define resetPin 8 //端口 B0

void InitializeShiftReg() {

DDRB |= B1111; //引脚D8-D11作为输出

PORTB |= B0001; //将引脚重置为高

}

void SetShiftReg(unsigned int value) {

bitClear(PORTB, 2); //数字写入(latchPin, LOW);

shiftOut(dataPin, clockPin, MSBFIRST, value 》》 8);

shiftOut(dataPin, clockPin, MSBFIRST, value);

bitSet(PORTB, 2); //数字写入(latchPin, HIGH);

}

创建模式:

每次在“速度时间”值中设置模式的开始后,Arduino的主循环都会启动选定的模式。换句话说,一个模式的函数总是只改变一次层,但是主循环会重复多次。

以Rain()模式为例:

void Rain() {

if (start) {

start = false; speedTime = 200;

ClearLayers();

}

layer[0] = layer[1];

layer[1] = layer[2];

layer[2] = layer[3];

layer[3] = 1 《《 random(16);

}

只有当打开模式时,“开始”部分才会启动一次。它设置速度时间并关闭所有led。然后,总是随机打开顶层16个led中的一个,在这个循环中,把它移到底层。
责任编辑:pj

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6511

    浏览量

    87600
  • 发光二极管
    +关注

    关注

    13

    文章

    1138

    浏览量

    65680
  • 移位寄存器
    +关注

    关注

    2

    文章

    181

    浏览量

    22018
收藏 人收藏

    评论

    相关推荐

    发光二极管二极管的区别

    发光二极管二极管二极管根据功能不同可分为1、发光二极管英文缩写LED 2、整流二极管 3、稳压二极管
    发表于 07-12 15:44

    关于LED发光二极管的特性

    二极管。(3)最大反向电压VRm:所允许加的最大反向电压。超过此值,发光二极管可能被击穿损坏。(4)工作环境topm:发光二极管可正常工作的环境温度范围。低于或高于此温度范围,
    发表于 12-07 09:23

    发光二极管型号有哪些_发光二极管型号大全

    `发光二极管随着科技的不断进步,工业化程度也在不断的提升,现在高科技产品被大量的使用,相信大家对于红外发光二极管一定不会陌生,红外发光二极管指的就是一种能发出红外线的二极管,比较常见的
    发表于 04-03 11:33

    发光二极管型号有哪些_发光二极管型号大全

    `发光二极管随着科技的不断进步,工业化程度也在不断的提升,现在高科技产品被大量的使用,相信大家对于红外发光二极管一定不会陌生,红外发光二极管指的就是一种能发出红外线的二极管,比较常见的
    发表于 09-07 11:29

    【转】发光二极管的识别与检测

    在设计电子产品的时候,使用最频率比较高的元件之一有发光二极管发光二极管简称为LED,由含镓(Ga)、砷(As)、磷(P)、氮(N)等的化合物制成。它是半导体二极管的一种,可以把电能转化成光能。一
    发表于 11-02 22:09

    发光二极管原理

    发光二极管是一种直接能把电能转变为光能的半导体器件。与其它发光器件相比,具有体积小、功耗低、发光均匀、稳定、响应速度快、寿命长和可靠性高等优点,被广泛应用于各种电子仪器、音响设备、计算机等作电流指示
    发表于 06-13 02:40

    贴片LED发光二极管的应用范围

    发光二极管作交流电源插座指示灯的电路。插座的供电由开关S控制。当红光LED亮时,插座无电,当绿光LED亮时,插座有电。4.保险座指示灯。贴片LED发光二极管用作工厂设备配电箱保险
    发表于 06-20 02:01

    发光二极管电阻怎么计算

    发光二极管原理发光二极管特性发光二极管电阻计算方法发光二极管的限流电阻的计算发光二极管电阻接法
    发表于 03-04 07:46

    发光二极管电路的设计原理是什么

    发光二极管电路的设计原理是什么?发光二极管电路的特性有哪些?发光二极管与其它发光灯对比有何优势?
    发表于 10-09 08:07

    发光二极管型号有哪些

    发光二极管型号有哪些?通俗单色发光二极管通俗单色发光二极管具有体积孝工作电压低、工作电流孝发光均匀不变、响应速度快、寿命长等优点,可用各种直流、交流、脉冲等电源驱动点亮。它属于电流控制
    发表于 11-16 08:53

    编写一个发光二极管的流水灯程序

    例:编写程序,通过单片机控制:点亮系统上的第一个发光管.点亮系统上的最后一个发光管.点亮系统上的第1、3、5、7个发光二极管编写让一个
    发表于 12-02 08:29

    74HC595点亮8个发光二极管实验目的

    的扩展点亮8个发光二极管按照 1011 0001调整灯的亮灭2. 知识点8位移位寄存器08-74HC595各个针脚功能如下Vin :芯片高电平输入端(电源)GND:芯片接地端(接地)OE:使能端,接地才能正常工作,一般情况下接地MR:一般情况下接高电平,接低电平会重置0~
    发表于 12-07 10:05

    深圳收购发光二极管 回收发光二极管

    ,惠州收购发光二极管,大量回收发光二极管,大量收购发光二极管,回收电子料,优选帝欧电子!!帝欧还长期回收以下:ATMEGA128A-AUATMELATMEGA162-16AUATMEGA88-20AUATMELATMEGA88-
    发表于 12-28 19:33

    移位寄存器,移位寄存器是什么意思

    移位寄存器,移位寄存器是什么意思 移位寄存器_
    发表于 03-08 14:50 1.7w次阅读

    移位寄存器怎么用_如何使用移位寄存器_移位寄存器的用途

    移位寄存器是一个具有移位功能的寄存器,是指寄存器中所存的代码能够在移位脉冲的作用下依次左移或右移
    发表于 12-22 15:49 1.9w次阅读