LedControl 库说明文档

news2024/12/23 5:30:55

LedControl 库最初是为基于 8 位 AVR 处理器的 Arduino 板编写的。但由于该代码不使用处理器的任何复杂的内部功能,因此具有高度可移植性,并且应该在任何支持 和 功能的 Arduino(类似)板上pinMode()运行digitalWrite() 。

单个 MAX72XX Led 驱动器能够控制 64 个 Led。该库支持多达 8 个菊花链式 MAX72XX 驱动程序。控制 512 个 LED 对于大多数用途来说应该绰绰有余。

库初始化

要将库包含到 Arduino 代码中,您必须编写几行初始化代码。

将库添加到您的草图中

这与任何其他 Arduino 库一样工作,您可以使用 Include LibraryIDE 中的菜单功能,或者只需添加一个

#include "LedControl.h"

在草图的顶部声明。

创建 LedControl 变量

所有库 API 函数都是通过类型变量调用的, LedControl该变量应该在草图的顶部定义,以便项目代码的其余部分可以访问它。

库初始化的典型代码如下所示:

/* 包含 LedControl 库 */  
#include "LedControl.h"

/* 创建一个新的 LedControl 变量。
* 我们使用 Arduino 上的引脚 12,11 和 10 作为 SPI 接口
* 引脚 12 连接到第一个 MAX7221 的 DATA IN 引脚
* 引脚 11 连接到第一个 MAX7221 的 CLK 引脚
* 引脚 10 连接到到第一个 MAX7221 的 LOAD(/CS) 引脚
* 只有一个 MAX7221 连接到 arduino 
*/   
LedControl  lc1 = LedControl ( 12 , 11 , 10 , 1 ); 

我们与 MAX72XX 器件通信的变量的初始化代码有 4 个参数。前 3 个参数是 Arduino 上连接到 MAX72XX 的引脚号。这些可以是 arduino 上的任何数字 IO 引脚。在示例中12,引脚 、1110任意选择。库代码不会以任何方式对引脚号进行完整性检查以确保其 有效。传递一些愚蠢的东西(pin 123??),或者只是 错误的pin号会破坏代码,而不会发出通知或错误消息。您不必将 IO 引脚初始化为输出或将它们设置为特定状态,库将为您完成这些工作。

第四个参数LedControl(dataPin,clockPin,csPin,numDevices)是与此一起使用的级联 MAX72XX 器件的数量LedControl。该库可以通过单个变量寻址最多 8 个设备LedControl。添加到链中的每个设备都会带来一些性能损失,但无论您设置多少个设备,库代码使用的内存量都将保持不变。由于LedControl无法寻址超过 8 个设备,因此此处仅允许使用 1..8 之间的值。

如果您的草图需要控制超过 8 个 MAX72XX,则 LedControl需要创建另一个使用 arduino 板上 3 个不同引脚的变量。

#include "LedControl.h" 
// 为前 8 个设备创建一个 LedControl...   
LedControl  lc1 = LedControl ( 12 , 11 , 10 , 8 ); 
// ...以及接下来 8 个设备的另一个。   
LedControl  lc2 = LedControl ( 9,8,7,8 ) ; _ _ _ _ _ 

获取连接设备的数量

无法从代码中读取 IO 引脚编号,但有一个函数可以获取连接到LedControl.

/* 获取连接到此 LedControl 的最大设备数。
* 返回 : 
* int 连接到此 LedControl 的设备数量 */  
int  LedControl : :getDeviceCount (); 

该函数用于循环访问所连接的 MAX72XX 器件的完整列表。下面是一段代码,用于将所有 MAX72XX 器件从省电模式切换到正常工作模式。即使shutdown(addr)稍后介绍该函数,这段代码背后的想法也应该很清楚。

#include "LedControl.h"

lc1=LedControl(12,11,10,5);

void setup() { 
    for(int index=0;index<lc1.getDeviceCount();index++) {
        lc1.shutdown(index,false); 
    } 
} 

我们通过从 0 到 的索引迭代设备列表 getDeviceCount()-1。索引是每个设备的地址。该地址是每个在设备上设置功能或 (Led-) 值的函数的第一个参数。请注意,getDeviceCount()返回连接的设备数量,但 设备的地址从第一个设备的 0 开始,第二个设备的地址从 1 开始,最后一个设备的地址从 getDeviceCount()-10 开始。

省电模式

LED 点亮时会消耗相当多的能量。电池供电的设备需要一种节省电量的方法,可以在用户不需要时关闭整个显示屏。MAX72XX 支持电源关断模式。

在关机模式下,设备会关闭显示屏上的所有 LED,但数据会保留。当设备退出关闭模式时,相同的 LED 将像进入睡眠状态之前一样亮起。甚至可以在关闭模式期间发送新数据。当设备重新激活时,新数据将出现在显示屏上。以下是7 段显示屏上不可见倒计时的示例:

void countDown() { 
    int i=9; 
    lc.setDigit(0,(byte)i,false); 
    //The digit '9' appears on the display 
    delay(1000); 
    //Go into shutdown mode 
    lc.shutdown(0,true); 
    //and count down silently 
    while(i>1) { 
        //data is updated, but not shown
        lc.setDigit(0,(byte)i,false); 
        i--; 
        delay(1000); 
    } 
    //Coming out of shutdown mode we have already reached '1' 
    lc.shutdown(0,false);
    lc.setDigit(0,(byte)i,false); 
} 

这是方法的原型LedControl.shutdown(addr,status)

/* 
 * Set the shutdown (power saving) mode for the device
 * Params :
 *   addr   The address of the display to control
 *   status If true the device goes into power-down mode. Set to false
 *          for normal operation.
 */
 void shutdown(int addr, bool status);

注意:当 Arduino 上电时,始终MAX72XX处于关闭模式。

限制位数 (ScanLimit)

这是一种专家功能,大多数图书馆用户并不真正需要。由于该库将其初始化 MAX72XX 为安全的默认值,因此您不必仅仅为了让您的硬件正常工作而阅读本节

当创建新的 LedControl 时,它将激活所有设备上的所有 8 位数字。每个亮起的数字将由驱动数字的多路复用器电路打开 1/8 秒。如果您有任何理由限制扫描数字的数量,则 LED 会更频繁地打开,因此会打开更长的时间。

将扫描限制设置为 4 的效果是,点亮的 LED 现在打开 1/4 秒,而不是标准的 1/8 秒。必须MAX72XX在较长的时间内为分段驱动器提供电流。

您应该仔细阅读数据表的相关部分MAX72XX!实际上,通过选择错误的电阻器组合,限制流过 LED 的电流和设备扫描的位数,可能会损坏 LED。调整扫描限制的唯一原因是显示器看起来太暗。但这很可能是由于启动时强度没有提高。这是原型,供有需要的人使用:MAX72XXRSetsetScanLimit()

/* 设置要显示的位数(或行数)。
* 有关扫描限制对显示器亮度的副作用,请参阅数据表。
* 参数: * addr 要控制的显示器的地址* limit 要显示的位数*/ 
void setScanLimit ( int addr , int limit ) ;



      

设置显示亮度

决定显示器亮度的三个因素。

  • Rset限制流过 LED 的最大电流的电阻值。
  • 显示器的扫描限制。(如果您阅读了本节,您已经知道我建议将此选项保留为安全默认值。)
  • 以及一个允许通过软件控制 LED 亮度的命令。

通过该setIntensity(int addr, int intensity)方法,LED 的亮度可以按 16 个离散步骤进行设置 ( 0..15)。值越高,显示越亮。大于 15 的值将被丢弃,而不改变亮度。即使是最低值也0不会完全关闭显示屏。

/* Set the brightness of the display.
 * Params:
 *   addr the address of the display to control
 *   intensity the brightness of the display.
void setIntensity(int addr, int intensity); 

设备初始化

当创建新的库时,LedControl库将使用以下命令初始化硬件

  • 显示清除
  • 强度设置为最小值
  • 设备处于省电模式
  • 激活设备上的最大位数

启动时显示空白可能是每个人都想要的。但当强度处于最低且设备处于关闭模式时,在启动配置中不会点亮任何 LED。大多数用户将在函数内进行自己的初始化setup()。下面是一段代码,可用作创建一个模板,LedControl一旦显示数据到达,该代码就可以以中等亮度点亮 LED。

#include "LedControl.h"

LedControl lc=LedControl(12,11,10,1);

void setup() { 
    //wake up the MAX72XX from power-saving mode
    lc.shutdown(0,false); 
    //set a medium brightness for the Leds
    lc.setIntensity(0,8); 
} 

LED矩阵

所有初始化代码就位后,现在可以控制一些 LED 了。

图像

清除显示

该函数的名称LedControl.clearDisplay(addr)已经暗示了它的作用。

/* 关闭显示屏上的所有 LED。
* Params: 
* addr 要控制的显示器的地址
*/  
void  clearDisplay ( int * addr ) ;  

所选设备上的所有 LED 均关闭。重要的是要了解这与保留数据的关闭模式不同。

控制单个 LED

这是打开或关闭单个 Led 的函数原型。

/* 设置单个 LED 的状态。
* 参数 : 
* 显示器的地址
* row Led 的行 (0..7) 
* col Led 的列 (0..7) 
* state 如果为 true,则 LED 打开,如果为 false,则打开off 
*/  
void  setLed ( int  addr ,  int  row ,  int  col ,  boolean  state ) ; 

addr和参数背后的想法state应该很清楚,但是rowcolumn参数指的是什么?这取决于矩阵MAX72XX和矩阵之间的接线。-libraryLedControl假定此示意图中使用的设置:

图像

矩阵中有 8 行(索引从 0..7 开始)和 8 列(索引也从 0..7 开始)。如果要点亮位于顶部第三行最右侧的 Led,则2.7必须使用 Led 的索引作为行和列参数。

此代码摘录显示了第一个 MAX72XX 器件上的 LED 数量设置情况

//打开addr=0处设备第3行第8列的LED
lc.setLed(0,2,7,true);
//现在 LED 位于第 0 行,从左侧数第二个
lc.setLed(0,0,1,true);
延迟(500);
//关闭第一个LED灯(第二个保持打开状态)
lc.setLed(0,2,7,false);

setLed()函数适合点亮几个 LED,但如果需要更新更多 LED,则需要很多行代码。因此,库中还有两个函数,可以使用单个命令控制完整的行和列。

控制矩阵的行

- 函数setRow(addr,row,value)有 3 个参数。第一个是我们已经熟悉的设备地址。第二个是需要更新的行,第三个是要为此行设置的值。

value参数采用 8 位宽字节,其中设置的每个位1 代表一个点亮的 LED,设置为0要关闭的 LED 的每个位。

例如,标记为红色的 LED 将打开,所有其他 LED 将关闭。

图像

要更新的行的索引为2(从顶部数)。必须将参数value 设置为字节值才能点亮 LED。最简单的方法是将标准头文件包含<binary.h>到您的草图中。该值以二进制编码写入,是设置的位1和要打开的 LED 之间的精确映射。

//将此文件包含在草图的顶部
<二进制.h>

// ...省略初始化代码...

//设置第一个设备的第三行(索引=2)的LED
lc.setRow(0,2,B10110000);

当无法以二进制编码指定值时,将每个位的十进制值映射到其影响的 Led 的简单表会有所帮助。底部的两行显示要计算的示例的十进制值。

Led2.0Led2.1Led2.2Led2.3Led2.4Led2.5Led2.6Led2.7
Bit-Value1286432168421
Led On?YesNoYesYesNoNoNoNo
Row-Value128032160020

 

value=176 (128+32+16)

该语句更新了Arduino 附加的lc.setRow(0,2,176)第一行的第三行。MAX72XX

显然 ,对所有 LED 连续setRow()调用八次要快得多。setLed()a 的硬件MAX72XX 使得该函数也比下一节中介绍的函数setRow()快 8 倍 。setColumn()如果草图代码的性能是重要因素,请setRow() 尽可能使用该函数。

函数原型

/* 将一行中的所有 8 个 Led 设置为新状态
* 参数:
* 显示器的地址
* 要设置的行行 (0..7) 
* 每个位设置为 1 的值将点亮相应的 Led。  
*/  
void  setRow ( int  addr ,  int  row , 字节 值) ; 

控制矩阵的列

-setColumn()函数的工作方式与该命令类似setRow(),但会更新垂直列中的 8 个 LED。

同样,红色标记的 LED 灯将打开,所有其他 LED 灯将关闭。

图像

这次,第 6 列底部的 4 个 LED 将被点亮。对于二进制编码,值中最左边的位指的是列顶部的 LED。

//将此文件包含在草图的顶部
<二进制.h>

// ...省略初始化代码...

//设置第一个设备的第三行(索引=2)的LED
lc.setRow(0,2,B00001111);

setRow()如果值的二进制编码不是一种选择,则与 参考资料部分中的表类似的表会有所帮助。

LED2.0LED2.1LED2.2LED2.3LED2.4LED2.5LED2.6LED2.7
位值1286432168421
带领是的是的是的
行值128032160020

=15 (8+4+2+1)

函数原型:

/* 将一列中的所有 8 个 Led 设置为新状态
* 参数:
* 显示器的地址
* 要设置的列列 (0..7) 
* 每个位设置为 1 的值将点亮相应的 Led。  
*/  
void  setColumn ( int  addr ,  int  col , 字节 值) ; 

控制 7 段显示器

图像

在 7 段显示器上打印数字

7 段显示器最常见的用途是打印数字。LedControl 库有一个函数,只需接受字节类型的参数并在指定列上打印相应的数字。数字的有效值为从015,以允许显示十六进制值。大于 15(或负值)的值将被默默丢弃。该函数还提供了一个参数来打开或关闭列上的小数点。

以下是在显示屏上以 4 位数字打印 int 值 (-999..999) 的代码摘录。

void printNumber(int v) {  
    int ones;  
    int tens;  
    int hundreds; 

    boolean negative=false;

    if(v < -999 || v > 999)  
        return;  
    if(v<0) {  
        negative=true; 
        v=v*-1;  
    }
    ones=v%10;  
    v=v/10;  
    tens=v%10;  
    v=v/10; hundreds=v;  
    if(negative) {  
        //print character '-' in the leftmost column  
        lc.setChar(0,3,'-',false);  } 
    else {
        //print a blank in the sign column  
        lc.setChar(0,3,' ',false);  
    }  
    //Now print the number digit by digit 
    lc.setDigit(0,2,(byte)hundreds,false);
    lc.setDigit(0,1,(byte)tens,false); 
    lc.setDigit(0,0,(byte)ones,false); 
} 

该函数的原型:

/* Display a (hexadecimal) digit on a 7-Segment Display
 * Params:
 *  addr   address of the display
 *  digit  the position of the digit on the display (0..7)
 *  value  the value to be displayed. (0x00..0x0F)
 *  dp     sets the decimal point.  
*/  
void setDigit(int addr, int digit, byte value, boolean dp); 

- 参数digit必须在 0..7 范围内,因为 MAX72XX 可以控制 7 段显示器上最多 8 位数字。

在 7 段显示器上打印字符

在 7 段显示器上具有(视觉)意义的字符集有限。常见的用途是在-前面添加负值的字符以及表示整数十六进制值的 'A'..'F' 中的 6 个字符。

-setChar(addr,digit,value,dp)函数接受 7 位 ASCII 编码范围内的 char 类型值。由于可识别的模式有限,大多数定义的字符都会打印 -char <SPACE>。但有相当多的字符在 7 段显示器上有意义。

这是可打印字符集:

  • 0 1 2 3 4 5 6 7 8 9
  • A a(打印大写字母)
  • B b(打印小写)
  • C c(打印小写)
  • D d(打印小写)
  • E e(打印大写字母)
  • F f(打印大写字母)
  • H h(打印大写字母)
  • L l(打印大写字母)
  • P p(打印大写字母)
  • -(减号)
  • . ,(点亮小数点)
  • _(下划线)
  • <SPACE>(空白或空格字符)

十六进制字符 ( 0..F) 已在字符值 0x00...0x0F 处重新定义。这使得混合数字和字符值成为可能。- 函数的字节值setDigit()可以与 一起使用setChar(),并将打印该值的十六进制表示形式。

该函数的原型看起来与显示数字的函数原型非常相似。

/* Display a character on a 7-Segment display.
 * Params:
 *   addr  address of the display
 *   digit the position of the character on the display (0..7)
 *   value the character to be displayed.
 *   dp    sets the decimal point.  
*/ 
void setChar(int addr, int digit, char value, boolean dp);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1249718.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中电金信:守【政】创新,探路保险数字化转型“新范式”

11月23日&#xff0c;CIIP2023中国保险科技创新合作大会在京举办。大会汇集保险科技领域行业专家、学者、国内外头部险企及保险科技公司负责人等各界人士&#xff0c;立足保险行业高质量发展和创新驱动理念&#xff0c;寻找行业数字化转型新动能、新视角&#xff0c;为保险科技…

【基础知识】AB软件RSLinx如何实现OPC通讯组态

哈喽&#xff0c;大家好&#xff0c;我是雷工。 在上一节了解了什么是RSLinx&#xff1f;以及RSLinx Lite、RSLinx Classice、RSLinx Professional、RSLinx Gateway几个版本的特点。 本节了解AB的RSLinx如何实现OPC组态。 一、创建RSLinx通讯&#xff1a; 1.1、【Communicati…

vue2项目从0搭建(三):配置环境变量及对应的webpack配置

前言 实际业务开发中,一个项目很可能会同时配置好几套环境。 比如:常规开发环境,开发测试环境,正式的测试环境,预发测试环境,客户甲的生产环境,客户乙的生产环境,通用生产环境,独立应用环境,微前端环境,大屏专用环境,移动端环境。 一女多嫁的实际业务场景,就需要我们进行多样…

mac上Homebrew的安装与使用

打开终端&#xff1a;command空格 &#xff0c;搜索‘’终端 ’&#xff0c;打开终端 在终端中输入以下命令并按下回车键&#xff1a; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"这个命令会自动下载并安装…

某60区块链安全之未初始化的存储指针实战二学习记录

系列文章目录 文章目录 系列文章目录未初始化的存储指针实战二实验目的实验环境实验工具实验原理实验内容实验过程EXP利用 未初始化的存储指针实战二 实验目的 学会使用python3的web3模块 学会分析以太坊智能合约未初始化的存储指针漏洞 找到合约漏洞进行分析并形成利用 实验…

win11渗透武器库,囊括所有渗透工具

开箱即用&#xff0c;最全的武器库&#xff0c;且都是2023年11月最新版&#xff0c;后续自己还可以再添加&#xff0c;下载地址&#xff1a;https://download.csdn.net/download/weixin_59679023/88565739 服务连接 信息收集工具 端口扫描 代理抓包 漏洞扫描 指纹识别 webshel…

apipost接口200状态码,浏览器控制台500状态码

后端 url 登录login方法 login(){this.$refs.loginForm.validate(async valid > {if (!valid) return// 由于data属性是一个json对象&#xff0c;需要进行解构赋值{data:result}&#xff0c;进行状态码判断const {data: result} await this.$http.post(/api/doLogin,this.…

解决在Windows10或Windows11下无权限修改hosts文件

解决在Windows10或Windows11下无权限修改hosts文件&#xff0c;无法写入内容 1、首先在开始菜单中找到这个 2、接着输入&#xff1a; C:\Windows\System32\drivers\etc3、再次输入以下命令行&#xff1a;notepad hosts &#xff0c;并回车&#xff1a; notepad hosts 4、然后…

Java专题(二)反射

反射概述 Java 反射就是在运行的状态下&#xff0c;对于任意一个类&#xff0c;都能知道这个类的任意的属性和方法&#xff0c;并且能调用这些方法或者改变这些类的属性&#xff0c;因此 Java 被称为准动态语言。 动态语言和静态语言 上面说了 Java 是准动态的语言&#xff0c…

面向对象三大特性,类与接口,java重写与重载,对象相等的判断, hashCode 与 equals

文章目录 2.1 面向对象三大特性2.1.1 封装 继承 多态2.1.2 其中Java 面向对象编程三大特性&#xff1a;封装 继承 多态2.1.3 关于继承如下 3 点请记住&#xff1a;2.1.4 什么是多态机制&#xff1f;Java语言是如何实现多态的&#xff1f;2.1.5 Java实现多态有三个必要条件&…

电脑中提示关于ntdll.dll错误怎么办,解决出现ntdll.dll错误的办法

ntdll.dll是Windows操作系统的一个关键系统文件&#xff0c;它包含了许多核心函数和系统调用&#xff0c;对于系统的稳定运行至关重要。然而&#xff0c;有时我们可能会遇到ntdll.dll报错的问题&#xff0c;导致程序无法正常运行。那么今天就和大家谈谈电脑中提示关于ntdll.dll…

企业计算机服务器中了360勒索病毒怎么办,360勒索病毒解密文件恢复

计算机技术的不断发展&#xff0c;为企业的生产运营提供了极大便利&#xff0c;不仅提升了办公效率&#xff0c;还促进了企业的发展。企业计算机在日常工作中一定加以防护&#xff0c;减少网络威胁事件的产生&#xff0c;确保企业的生产生产运营。最近&#xff0c;网络上的360后…

两巨头Facebook 和 GitHub 联手推出 Atom-IDE

9月13日&#xff0c;GitHub 宣布与 Facebook 合作推出了 Atom-IDE —— 它包括一系列将类 IDE 功能带到 Atom 的可选工具包。初次发布的版本包括更智能、感知上下文的自动完成&#xff1b;导航功能&#xff0c;如大纲视图和定义跳转(outline view and goto-definition)&#xf…

爬虫项目实战:利用基于selenium框架的爬虫模板爬取豆瓣电影Top250

&#x1f44b; Hi, I’m 货又星&#x1f440; I’m interested in …&#x1f331; I’m currently learning …&#x1f49e; I’m looking to collaborate on …&#x1f4eb; How to reach me … README 目录&#xff08;持续更新中&#xff09; 各种错误处理、爬虫实战及模…

【JAVA】SpringBoot + mongodb 分页、排序、动态多条件查询及事务处理

【JAVA】SpringBoot mongodb 分页、排序、动态多条件查询及事务处理 1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- mongodb ↓ -->&…

2023年亚太杯数学建模A题解题思路(*基于OpenCV的复杂背景下苹果目标的识别定位方法研究)

摘要 由于要求较高的时效性和劳力投入&#xff0c;果实采摘环节成为苹果生产作业中十分重要的一部分。而对于自然环境下生长的苹果&#xff0c;光照影响、枝叶遮挡和果实重叠等情况普遍存在&#xff0c;这严重影响了果实的准确识别以及采摘点的精确定位。针对在复杂背景下苹果的…

android 保活的一种有效的方法

android 保活的一种有效的方法 为什么要保活 说起程序的保活,其实很多人都觉得,要在手机上进行保活,确实是想做一些小动作,其实有些正常的场景也是需要我们进行保活的,这样可以增强我们的用户体验。保活就是使得程序常驻内存,这种程序不容易被杀,或者在被杀以后还能完…

kubernetes使用nfs创建pvc部署mysql stateful的方法

kubernetes创建的pod默认都是无状态的&#xff0c;换句话说删除以后不会保留任何数据。 所以对于mysql这种有状态的应用&#xff0c;必须使用持久化存储作为支撑&#xff0c;才能部署成有状态的stateful. 最简单的方法就是使用nfs作为网络存储&#xff0c;因为nfs存储很容易被…

css Vue尺子样式

原生css生成尺子样式 <template><div class"page"><div class"Light"></div><div class"rile"><ul id"list"><!--尺子需要几个单位就加几个--><li></li><li></li&…

css三角,鼠标样式,溢出文字

目录 css三角 鼠标样式 例子&#xff1a;页码模块 溢出文字表示方式 margin负值运用 css三角强化 css三角 css三角中&#xff1a;line-height&#xff1a;0和font-size&#xff1a;0是防止兼容性的问题 jd {position: relative;width: 120px;height: 249px;background-…