跳过主要内容

AN-1136 LED矩阵顺序字符显示

内容

参考文献

对于相关的文件和软件,请访问:

https://www.dialog-semicondoduments.c亚博电竞菠菜om/products/greenpak.

下载我们的免费GreenPAK设计软件[1],打开。gp文件[2],并使用GreenPAK开发工具[3]在几分钟内将设计冻结到您自己的定制IC中。

yabo国际娱乐Dialog Semiconductor提供了一个完整的应用笔记[4]库,包括设计示例以及Dialog IC内的功能和模块的说明。

  1. GreenPak Designer软件,软件下载和用户指南,Dialog Semiconductoryabo国际娱乐
  2. AN-1136 LED矩阵式字符显示,GreenPak设计文件,对话半导体yabo国际娱乐
  3. GreenPak开发工具, GreenPAK开发工具网页,Dialog半导体yabo国际娱乐
  4. GreenPAK应用笔记,绿派克应用笔记网页,对话半导体yabo国际娱乐
  5. SLG46620对话框数据表,半导体yabo国际娱乐

介绍

在此应用笔记中,我们将解释如何使用对话框的GreenPak可编程混合信号ASIC控制8x8 LED矩阵。在本申请说明中使用了8x8 LED矩阵和Arduino程序。

该项目包含2个阶段:

  1. 标识将显示在Arduino的8x8 LED Matrix上的字母。
  2. 用GreenPAK IC接收和处理数据。

系统视图

在这个项目中,我们将通过Dialog的GreenPAK将“SILEGO”写在8x8的LED矩阵上。以这种方式使用GreenPAK可以让微控制器GPIO用于其他任务。首先,让我们谈谈8x8 LED矩阵的工作逻辑。它由64个led组成,8列8行。

图1所示。8 × 8 LED矩阵原理图

如图所示,每一列都连接到使用led的行。列必须连接到Power,列必须连接到Ground,以照亮led。当电路完成时,流过led的电流使led亮起来。如图1所示,通常连接阴极的LED矩阵称为带共阴极的LED矩阵。正向电压(HIGH)应用于所选列,而正向电压(LOW)应用于所选行,以点亮矩阵中特定的led。让我们看看如何在将8x8 LED矩阵传递给Arduino程序之前获得字母。

你可以看到字母“S”在下面的8x8 LED矩阵上形成的例子;

图2. LED矩阵上的“S”字母显示

我们需要照亮24个LED,以创建字母“S”,如图2所示。我们不能因为矩阵的共同阴极结构而在同时点亮它们。例如,我们必须将C4列设置为HIGH和R2行,低于L2 LED。因为我们为L6的L2 LED设置了C4柱,因为L6的L6和R3行为低,所以位于C4列中的LED A也将点亮。因此,我们必须逐行向行排列,而不是一次显示字母“s”。8位数据(1字节)足以8列。在每个8位数据之后,GreenPak IC应通过传递到下一行完成字母“S”。当我们通过行驱动行时,它必须作为完整的字符。为此,行之间的转换必须非常快速地进行。25fps(每秒帧)足以让人们轻松辨别角色,但我们需要超过25fps来平滑LED闪烁。在GreenPak IC内的SPI单元可以轻松实现这一点。 We learned the structure of LED Matrix and how to drive it. We can now proceed with the Arduino Program.

Arduino程序

在前一部分中,我们学习了为什么需要逐行发送图像。我们将把字母逐行分开,我们将使用SPI将它发送到GreenPAK IC。我们将每个字母定义为一个8字节序列,因为每一行都是1字节。让我们再做一次字母“S”。

R1列为10000000,R2列为00111100,R3列为101100110,如图3所示。我们将把字母“S”定义为一个8字节的分析。与前面的图不同,您可以清楚地看到图中第一列的更改。这样做的原因是将第一列设置为行切换功能。通过这种方式,我们的目标是当新的数据行传递到下一行时,扫描所有的行。

图3.显示行时钟的“S”字母

因此,我们将第一列作为控制行更改的时钟信号。因此,第一列应该是:R1为1,R2为0,R3为1,R4为0,R5为0,R5为0,R7为1和R8为0。

注意:从这里开始,第一列将被命名为rClock,不要与其他列混淆。

根据这个,我们的新代码如表1所示。

警告:注意图3中列的顺序,因为它根据图1所示的图表进行。但是,在图4中,位的顺序与图3中所示的顺序相反是因为C8已被视为MSB和Rclock作为LSB。

我们以原始形式保留8x8 LED矩阵字体,并在将行信息发送到GreenPak IC之前,将添加Rclock信号。

Arduino变量为字母“S”;

表1。二进制和十六进制表示行数据

二进制

十六进制

C8…C2

rClock

R1

0000000

1

01

R2

0011110

0

3 c

R3

0110011.

1

67

R4

0000011

0

06

R5

0011110

1

3 d

R6

0110000

0

60

R7

0110011.

1

67

R8

0011110

0

3 c

警告:数据顺序继续像R8, R7, R6。0 x00代表R1。

如果按照ASCII表将其他字母和标记记录为二维矩阵,则有一个类似右上方图表的变量显示如下数据。

该矩阵在程序开头定义为常量,因为其值不会改变。我们安排了“设置”阶段中的SPI通信的设置,我们将引脚安排为输出以激活GreenPak IC的SPI单元。

在我们在设置功能中进行了一些安排后,我们写了一个函数。

这个函数接受2个参数作为输入。这些都是:1。一个将要显示的句子(char sentence[])和2。字母/标记的更改时间(unsigned long appearance time)。首先,已经确定了将在“For循环”中使用的变量(int i, y)和变量(byte row),该变量保存要发送到GreenPAK IC的行信息。

然后我们使用strlen函数创建“For循环”来扫描接收到的作为输入的句子变量的所有字符。

然后使用millis函数获取当前时间信息,并将其保存到名为“enterTime”的变量中。我们用这个变量和millis函数得到了while循环。

这个循环连续地将相同的字符发送到GreenPAK IC,周期等于接收到的作为输入的apptime变量的值。

while循环中的等式用我们所节省的时间(enterTime)减去当前时间,并与用户所输入的时间(appearance time)进行比较。因此,即使经过的时间比用户请求的时间短,它也会继续发送相同的字符。如果经过的时间比用户输入的时间长,就会打破这个循环,选择下一个字母。

这些行需要逐个发送,因为每个字符由8行组成。为此,“For循环”和行数据被逐个发送。

注意:变量y从7减小到0的原因是第一行数据R1位于二维矩阵的第8列。

然后我们检查行顺序来添加rClock信号。我们利用二维矩阵的索引将奇数索引中的第一列设为HIGH,偶数索引中的第一列设为LOW。

二维矩阵中列的索引号及对应的行号:

表2。字体矩阵中行数据的顺序

指数

0

1

2

3.

4

5

6

7

R8

R7

R6

R5

R4

R3

R2

R1

我们从ASCII表中受益,以找出用户在8x8 LED矩阵字体上输入的句子中的相应字符。每个字符,字母和标记根据ASCII表具有数值。我们使用此数值对应创建了8x8 LED矩阵字体。例如:

在ASCII表中,L的值为76。如果我们在我们创建的二维矩阵的行索引中键入这个数字,我们就会获得为“L”创建的数据。您可以查看下面的ASCII表。

表3. ASCII表

上面的代码“(int)sentence(i)”表示相关字符对应的ASCII码。在此之后,我们从我们创建的8x8 LED Matrix Font中获得了相关字符的行信息。我们用Index[y]逐一处理这些行。

如果我们需要为rClock信号设置第一列HIGH,那么我们对具有0x01的行应用“Logical or”。第一列升高,而其他列不受影响,因为0是“Logic or”流程中的无效元素。

如果需要将第一列设置为LOW,则对具有0xfe的行应用“Logical AND”。由于“Logical AND”中的元素无效,第一列变为LOW,而其他列不受影响。

最后,我们使用SPI接口将此行信息发送到GreenPak IC。

你可以在循环部分调用函数,如下所示。

GreenPAK IC的设计

首先,我们必须调整SPI单元的设置来获取来自Arduino的数据。

设置如下图4所示:

图4. SPI的设置

SPI单元将来自Arduino来自Arduino的数据转换为并行数据,并允许我们单独处理比特。来自Arduino的数据是列数据,这允许我们将此数据直接连接到列引脚。编程Arduino时,我们已将第一列安排为1-0-1-0 ......确保它不断变化。

图5. SPI的连接

在SPI单元的S2P模式下,我们将使用rClock作为时钟来理解串行到并行的数据转换已经完成。每个新行之后更改的第一列将向我们报告数据已准备好。我们将第一列连接到P DLY1单元,以检测第一列的任何变化。DLY1机组设置如下图6所示:

图6。P DLY1的设置

通过这种方式,每个传入数据的副本都会触发p dly单元并声明我们应该传递到下一行。我们使用简单计数器以顺序方式激活行。此计数器逐个增加,每当新行到达时最多可计入8。

第一个状态设置为空闲,下一个8个状态被设置为行状态,这就是计数器最多的原因。您可以看到下面使用的计数器:

图7.行计数器

您可以基于表4中的此计数器看到有源行信号。

根据K3-K2-K1-K0的情况,我们或者给每一行通电,或者停止通电。您可以看到我们在图8中使用的lut和引脚。

我们可以将DFF6的Q输出极性倒置,而不是使用INV1电池。这样我们就可以消除INV1细胞。您应该对DFF6进行如图9所示的设置。

表4。基于行计数器的有源行信号

K3 k2 k1 k0

R8 R7 R6 R5 R4 R3 R2 R1

0 0 0 0

0 0 0 0 0 0 0 0 0

0 0 0 1

0 0 0 0 0 0 0 1

0 0 1 0

0 0 0 0 0 0 0 1 0

0 0 1 1

0 0 0 0 1 0 0

0 1 0 0

0 0 0 0 1 0 0 0

0 1 0 1

0 0 0 1 1 0 0 0

0 1 1 0

0 0 1 0 0 0 0 0 0

0 1 1 1

0 1 0 0 0 0 0 0

1 0 0 0

1 0 0 0 0 0 0 0 0

图8。排销连接
图9。DFF设置

但是,需要再次编辑包含K0的每个等式。例如,在第一情况下,当K2,K1,K0 = 111时,3位LUT1高,而在新情况下它必须高于K2,K1,K0 = 110。

替代设计

与第一个设计不同的是,我们可以使用DFFs来移动行切换功能的信号。通过这种方法,我们可以消除与排销相连的lut,并且可以直接将DFF与排销相连。

该设计如图10所示。

图10。在Matrix0中链接DFFs R1到R5

矩阵0中的DFF0看到的是空闲状态的任务。在每次改变rClock时,dff依次升到HIGH。第一个R1是高的,然后是R2。R8连接到R1,这个循环就完成了。第一种设计使用较少的DFF,而第二种设计使用较少的LUT。

连接

你可以通过改变电流来改变led的亮度。使用外部电源,通过控制电流的晶体管,我们将有一个更好的解决方案而不是完全通过GreenPAK IC驱动LED。你可以调整LED的亮度与电位计,你连接到外部电源或与PWM驱动晶体管。

图11。在Matrix1中链接DFFs R6到R8
表5所示。顶级连接1

Arduino Pins.

SLG46620V引脚

43

13

52

2

51

10

表6.顶级连接2

SLG46620V引脚

NPN晶体管基座

3.

R1基础

4

R2基础

5

R3基础

6

R4基地

7

R5的基础

8

R6基地

9

R7基地

12

R8基础

表7所示。顶级连接3

SLG46620V针

8x8 LED矩阵引脚

14

3.

15

4

16

10

17

6

18

11

19

15

20.

16

图12。顶级示意图
表8所示。顶级连接5

8x8 LED矩阵引脚

NPN晶体管收集器

9

R1

14

R2

8

R3

12

R4

1

R5

7

R6

2

R7

5

R8

表9所示。顶级连接6

NPN晶体管发射器

电位计销

R1

3.

R2

3.

R3

3.

R4

3.

R5

3.

R6

3.

R7

3.

R8

3.

表10.顶级连接4

电位计销

电源销

2

接地

结论

在这个项目中,我们学习了用GreenPAK IC控制常用的8x8 LED Matrix,用SLG46620V版本的SPI单元控制LED Matrix非常容易,用这种方法可以很容易地控制LED Matrix。或者,您可以使用在GreenPAK5中可用的I2C协议来控制引脚的输出。

设计的局限性:

  • SPI的第1列保留给rCLK
  • 如果设计改变,第一列的gpio不够