【雕爷学编程】Arduino动手做(81)--- 8位LED数码管模块5

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验八十一:8位LED数码管MAX7219模块(支持级联八位串行3个IO口控制)

【雕爷学编程】Arduino动手做(81)--- 8位LED数码管模块5_第1张图片
【雕爷学编程】Arduino动手做(81)--- 8位LED数码管模块5_第2张图片
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验八十一: 8位LED数码管MAX7219模块
项目之六:最简办法显示数字串

实验开源代码

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
   实验八十四: 8位LED数码管MAX7219模块
   项目之六:最简办法显示数字串
*/

#include "LedControl.h"
LedControl lc = LedControl(2, 4, 3, 1);

void setup() {
  lc.shutdown(0, false); 
  lc.setIntensity(0, 6); 
  lc.setDigit(0, 0, 9, false);
  lc.setDigit(0, 1, 8, false);
  lc.setDigit(0, 2, 7, false);
  lc.setDigit(0, 3, 6, false);
  lc.setDigit(0, 4, 5, true);
  lc.setDigit(0, 5, 4, false);
  lc.setDigit(0, 6, 3, false);
  lc.setDigit(0, 7, 2, false);
}

void loop() {
}

Arduino实验场景图

【雕爷学编程】Arduino动手做(81)--- 8位LED数码管模块5_第3张图片
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验八十一: 8位LED数码管MAX7219模块
项目之七:递归 LEDControl 计数器(8位1亿之内)

实验开源代码

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
   实验八十四: 8位LED数码管MAX7219模块
   项目之七:递归 LEDControl 计数器(8位1亿之内)
*/

#include 
#include "LedControl.h"
LedControl lc = LedControl(2, 4, 3, 1);
long num = 0;

void showNumber(long number, byte pos = 0) {
  byte digit = number % 10;
  lc.setDigit(0, pos, digit, false);
  long remainingDigits = number / 10;
  if (remainingDigits > 0) {
    showNumber(remainingDigits, pos + 1);
  }
}

void setup() {
  lc.shutdown(0, false);
  lc.setIntensity(0, 6);
  lc.clearDisplay(0);
}

void loop() {
  showNumber(num);
  num++;
}

实验场景图 动态图

【雕爷学编程】Arduino动手做(81)--- 8位LED数码管模块5_第4张图片

首先,我们需要包含所有必要的库:

#include 

接下来,我们需要创建一个 LedControl 实例,它控制我们的 MAX7219 显示:

LedControl lc = LedControl(3, 4, 5, 1); // dataPin、clockPin、cs Pin、num 设备

此外,让我们创建一个变量用作计数器。由于我们要使用所有 8 位数字,因此该变量应达到 99,999,999。由于 anint只会上升到 32,768(和unsigned int: 65,535),我们将使用long. 这将使我们能够数到 2,147,483,647。

long num = 0;

现在,开始真正的魔法:我们需要定义显示数字的函数。

void showNumber(long number, byte pos = 0) {
  // 所有的魔法都在这里
}

这意味着我们可以使用所需的数字作为参数调用此函数。作为第二个参数,我们定义开始的位置。数字从右到左编号,从0到7。所以我们想从 开始0,增加每个下一个数字的位置。因为我们定义了一个默认值0,所以在调用这个函数时我们可以省略这个参数。

当然,这仍然没有任何真正的魔法,所以是时候给这个函数添加一些代码了:

byte digit = number % 10;

通过%使用 10 作为除数计算数字的模 ( ),我们得到我们想要打印的数字的最后一位。例如:如果数字是123,变量digit将包含3。

使用该setDigit方法,我们现在可以将这个数字显示在屏幕上:

lc.setDigit(0, pos, digit, false);

第一个参数 ( 0) 告诉我们要使用 device 的方法0。请注意,我们目前只配置了一台设备,因此您0现在可以忽略它。
第二个参数 ( pos) 定义显示器上的位置。如果在调用我们的函数时没有定义特定的位置,这pos将是0.
第三个参数 ( digit) 定义了我们想要显示的数字。这是我们刚刚使用模运算符在上一行计算的数字。
第四个参数 ( false) 告诉显示器是否需要打开小数点。为简单起见,我们将保持关闭状态。
好的,现在可以在我们的显示器上显示一位数字了,剩下的数字呢?好问题!让我们继续扩展我们的功能:

long remainingDigits = number / 10;

通过将数字除以10,我们得到需要显示的所有剩余数字。

<div>if (remainingDigits > 0) {</div><div>    showNumber(remainingDigits, pos + 1);</div><div>}</div>

这就是……真正的魔法!我说的递归!以上几行将执行以下操作:

如果remainingDigits变量大于0,则仍有数字要显示,因此我们需要执行递归操作。
递归:让函数使用两个计算参数自行调用它:remainingDigits和pos + 1
这就是这种神奇的递归方法的全部内容!完整的功能如下:

void showNumber(long number, byte pos = 0) {
    byte digit = number % 10;
    lc.setDigit(0, pos, digit, false);

    long remainingDigits = number / 10;
    if (remainingDigits > 0) {
        showNumber(remainingDigits, pos + 1);
    }
}

为了使其效果更清晰,请考虑以下事项:如果我们将这个函数12345作为第一个参数调用,将执行以下函数调用:

showNumber(12345); // shows a 5 on position 0
showNumber(1234, 1); // shows a 4 on position 1
showNumber(123, 2); // shows a 3 on position 2
showNumber(12, 3); // shows a 2 on position 3
showNumber(1, 4); // shows a 1 on position 4

这就是它需要做的全部!

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验八十一: 8位LED数码管MAX7219模块
项目之八:循环显示数字与“HELLO”

实验开源代码

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
   实验八十四: 8位LED数码管MAX7219模块
   项目之八:循环显示数字与“HELLO”
*/

#include "LedControl.h"
// Arduino 引脚 2 至DIN,4 至Clk,3 至ck,设备数量是1个
LedControl lc = LedControl(2, 4, 3, 1);

//*我们总是在显示更新之间等待一段时间
unsigned long delaytime = 250;

void setup() {
  //MAX72XX 在启动时处于省电模式,我们必须叫醒
  lc.shutdown(0, false);
  lc.setIntensity(0, 6); // 设置亮度级别(0 为最小值,15 为最大值)
  lc.clearDisplay(0); // 清除显示寄存器
}

void hello(){
  lc.setChar(0,7,'H',false);
  lc.setChar(0,6,'E',false);
  lc.setChar(0,5,'L',false);
  lc.setChar(0,4,'L',false);
  lc.setChar(0,3,'0',false);
  lc.setChar(0,2,'.',false);
  lc.setChar(0,1,'.',false);
  lc.setChar(0,0,'.',false);
  delay(delaytime+1000);
  lc.clearDisplay(0);
  delay(delaytime);
  lc.setDigit(0,7,1,false);
  delay(delaytime);
  lc.setDigit(0,6,2,false);
  delay(delaytime);
  lc.setDigit(0,5,3,false);
  delay(delaytime);
  lc.setDigit(0,4,4,false);
  delay(delaytime);
  lc.setDigit(0,3,5,false);
  delay(delaytime);
  lc.setDigit(0,2,6,false);
  delay(delaytime);
  lc.setDigit(0,1,7,false);
  delay(delaytime);
  lc.setDigit(0,0,8,false);
  delay(1500);
  lc.clearDisplay(0);
  delay(delaytime);
}

void loop() { 
   hello();
}

Arduino实验场景图

【雕爷学编程】Arduino动手做(81)--- 8位LED数码管模块5_第5张图片

你可能感兴趣的:(嵌入式硬件,单片机,物联网,Arduino,机器人,c++,8位LED数码管模块)