LedControl 库说明文档

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 shownlc.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 modelc.shutdown(0,false); //set a medium brightness for the Ledslc.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.mzph.cn/news/168207.shtml

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

相关文章

C练习题_3

一、单项选择题&#xff08;本大题共20小题&#xff0c;每小题2分&#xff0c;共40分。在每小题给出的四个备选项中,选出一个正确的答案&#xff0c;并将所选项前的字母填写在答题纸的相应位置上。 以下正确的C语言自定义标识符是() A. la B. 2a C. do D. a.12 2.在C语言中,错…

3、Qt使用windeploy工具打包可执行文件

新建一个文件夹&#xff0c;把要打包的可执行文件exe拷贝过来 点击输入框&#xff0c;复制一下文件夹路径 点击电脑左下角&#xff0c;找到Qt文件夹&#xff0c; 点击打开 “Qt 5.12.0 for Desktop” &#xff08;我安装的是Qt 5.12.0版本&#xff09; 输入“cd bin”&#xff…

vivado产生报告阅读分析20-QOR

Report QoR Suggestions report_qor_suggestions 命令是处理 QoR 建议对象时使用的主要命令。 QoR 建议对象会创建命令和属性来改善设计的时序性能&#xff08; 欲知详情 &#xff0c; 请参阅 QoR 建议 &#xff09; 。 report_qor_suggestions 命令可执行两项任务 &am…

chatGPT4机器学习数据后最终保留在机器里的是什么? 机器是怎么产生智能的? TensorFlow没有直接开发出类似GPT-4这样的模型

机器学习数据后最终保留在机器里的是机器学习模型。机器学习模型是机器学习系统中的核心&#xff0c;它是机器学习系统能够进行推理和预测的基础。 机器学习模型通常由参数组成。参数是机器学习模型的权重和偏差。机器学习系统通过训练来学习这些参数。训练是指让机器学习系统…

webpack 打包优化

在vue.config.js中配置 下载 uglifyjs-webpack-plugin 包 const { defineConfig } require("vue/cli-service"); var path require("path");module.exports defineConfig({transpileDependencies: true,filenameHashing: false, // 去除Vue打包后.cs…

0003Java程序设计-ssm基于微信小程序的家教信息管理系统

文章目录 摘要目 录系统实现开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅&#x1f427;裙&#xff1a;776871563 摘要 本文讲述了基于微信小程序的家教信息管理系统的设计与实现。结合线上管理的特点&#xff0c;分析了家教信息管理系统的现状&#xff0c;给出…

外汇天眼:香港监管机构对AMTD Global Markets Limited启动法律诉讼

香港证监会&#xff08;SFC&#xff09;已经启动了法律程序&#xff0c;要求首次审裁法院调查AMTD Global Markets Limited&#xff08;AMTD&#xff0c;目前以orientiert XYZ Securities Limited为名&#xff09;及其前高管在与首次公开发行&#xff08;IPO&#xff09;相关的…

【经典小练习】修改文件中的数据

文章目录 &#x1f339;例子&#x1f33a;思路&#x1f6f8;方法一✨报错解决 &#x1f6f8;方法二 &#x1f339;例子 文本文件中有下面的数据 2-1-9-4-7-8 将文件中的数据进行排序&#xff0c;变成下面的数据 1-2-4-7-8-9 &#x1f33a;思路 要对这些数据进行排序&#xf…

智慧楼宇可视化视频综合管理系统,助力楼宇高效安全运行

随着互联网技术的进步和发展&#xff0c;智能化的楼宇建设也逐步成为人们选择办公场所是否方便的一个重要衡量因素。在智能化楼宇中&#xff0c;安全管理也是重要的一个模块。得益于互联网新兴技术的进步&#xff0c;安防视频监控技术也得到了快速发展并应用在楼宇的安全管理中…

Python武器库开发-前端篇之html概述(二十八)

前端篇之html概述(二十八) html概述 HTML5是构建Web内容的一种语言描述方式。HTML5是互联网的下一代标准&#xff0c;是构建以及呈现互联网内容的一种语言方式&#xff0e;被认为是互联网的核心技术之一。HTML产生于1990年&#xff0c;1997年HTML4成为互联网标准&#xff0c;…

虹科Pico汽车示波器 | 汽车免拆检修 | 2011款瑞麒M1车发动机起动困难、加速无力

一、故障现象 一辆2011款瑞麒M1车&#xff0c;搭载SQR317F发动机&#xff0c;累计行驶里程约为10.4万km。该车因发动机起动困难、抖动、动力不足、热机易熄火等故障进厂维修。用故障检测仪检测&#xff0c;发动机控制单元&#xff08;ECU&#xff09;中存储有故障代码“P0340相…

Vue框架学习笔记——事件处理

文章目录 前文提要事件处理的解析过程样例代码如下&#xff1a;效果展示图片&#xff1a;v-on:click"响应函数"v-on:click简写形式响应函数添加响应函数传参占位符"$event"注意事项 前文提要 本人仅做个人学习记录&#xff0c;如有错误&#xff0c;请多包…

2、git进阶操作

2、git进阶操作 2.1.1 分支的创建 命令参数含义git branch (git checkout -b)<new_branch> <old_branch>表示创建分支-d <-D>删除分支 –d如果分支没有合并&#xff0c;git会提醒&#xff0c;-D强制删除-a -v查看分支-m重新命名分支commit id从指定的commi…

如何打造“面向体验”的音视频能力——对话火山引擎王悦

编者按&#xff1a;随着全行业视频化的演进&#xff0c;我们置身于一个充满创新与变革的时代。在这个数字化的浪潮中&#xff0c;视频已经不再只是传递信息的媒介&#xff0c;更是重塑了我们的交互方式和体验感知。作为字节跳动的“能力溢出”&#xff0c;火山引擎正在飞速奔跑…

RK3588平台 USB框架与USB识别流程

一.USB的基本概念 在最初的标准里&#xff0c;USB接头有4条线&#xff1a;电源&#xff0c;D-,D,地线。我们暂且把这样的叫做标准的USB接头吧。后来OTG出现了&#xff0c;又增加了miniUSB接头。而miniUSB接头则有5条线&#xff0c;多了一条ID线,用来标识身份用的。 热插拔&am…

最新AIGC创作系统ChatGPT网站源码,Midjourney绘画系统,支持GPT-4图片对话能力(上传图片并识图理解对话),支持DALL-E3文生图

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

2023亚太杯数学建模B题完整原创论文讲解

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2023亚太地区数学建模竞赛B题玻璃温室的微气候调控完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 论文共6…

软著项目推荐 深度学习 opencv python 实现中国交通标志识别

文章目录 0 前言1 yolov5实现中国交通标志检测2.算法原理2.1 算法简介2.2网络架构2.3 关键代码 3 数据集处理3.1 VOC格式介绍3.2 将中国交通标志检测数据集CCTSDB数据转换成VOC数据格式3.3 手动标注数据集 4 模型训练5 实现效果5.1 视频效果 6 最后 0 前言 &#x1f525; 优质…

游览器缓存讲解

浏览器缓存是指浏览器在本地存储已经请求过的资源的一种机制&#xff0c;以便在将来的请求中能够更快地获取这些资源&#xff0c;减少对服务器的请求&#xff0c;提高页面加载速度。浏览器缓存主要涉及到两个方面&#xff1a;缓存控制和缓存位置。 缓存控制 Expires 头&#…

RAM模型从数据准备到pretrain、finetune与推理全过程详细说明

提示&#xff1a;RAM模型&#xff1a;环境安装、数据准备与说明、模型推理、模型finetune、模型pretrain等 文章目录 前言一、环境安装二、数据准备与解读1.数据下载2.数据标签内容解读3.标签map内容解读 三、finetune训练1.微调训练命令2.load载入参数问题3.权重载入4.数据加载…