回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

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

头像 驴友花雕 2023.07.25 16 1

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

 

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

03 (1).jpg
03 (2).jpg

 【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实验场景图

 

24.jpg

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

  实验开源代码

 

 

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

#include <Arduino.h>
#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++;
}

实验场景图  动态图  

 

WeChat_20210821103930.gif

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

```cpp
#include <LedControl.h>
```

 

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

```cpp
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。

```cpp
long num = 0;
```

 

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

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

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

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

```cpp
byte digit = number % 10;
```

 

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

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

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

 

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

```cpp
long remainingDigits = number / 10;
```

 

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

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


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

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

```cpp
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作为第一个参数调用,将执行以下函数调用:

```cpp
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实验场景图

 

WeChat_20210821132158.gif

评论

user-avatar
  • hacker_

    hacker_2023.07.25

    666

    0
    icon 他的勋章
      展开更多