原创 【雕爷学编程】Arduino动手做(104)---16X16点阵汉字屏

2022-6-19 19:48 2603 5 5 分类: MCU/ 嵌入式 文集: 雕爷学编程

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

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)实验一百零四:16X16点阵UART接口LED汉字显示屏模块


LED点阵屏
通过LED(发光二极管)组成,以灯珠亮灭来显示文字、图片、动画、视频等,是各部分组件都模块化的显示器件,通常由显示模块、控制系统及电源系统组成。LED点阵显示屏制作简单,安装方便,被广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等。

显示原理
以简单的8X8点阵为例,它共由64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一行置1电平,某一列置0电平,则相应的二极管就亮;如要将第一个点点亮,则9脚接高电平13脚接低电平,则第一个点就亮了;如果要将第一行点亮,则第9脚要接高电平,而(13、3、4、10、6、11、15、16)这些引脚接低电平,那么第一行就会点亮;如要将第一列点亮,则第13脚接低电平,而(9、14、8、12、1、7、2、5)接高电平,那么第一列就会点亮。

一般我们使用点阵显示汉字是用的16*16的点阵宋体字库,所谓16*16,是每一个汉字在纵、横各16点的区域内显示的。也就是说用四个8*8点阵组合成一个16*16的点阵。比如要显示“你”则相应的点要点亮,由于点阵在列线上是低电平有效,而在行线上是高电平有效,所以要显示“你”字,则它的位代码信息要取反,即所有列(13~16脚)送(0xF7,0x7F),而第一行(9脚)送1信号,然后第一行送0。再送第二行要显示的数据(13~16脚)送(0xF7,0x7F),而第二行(14脚)送1信号。依此类推,只要每行数据显示时间间隔够短,利用人眼的视觉暂停作用,这样送16次数据扫描完16行后就会看到一个“你”字;第二种送数据的方法是字模信号送到行线上再扫描列线也是同样的道理。同样以“你”字来说明,16行(9、14、8、12、1、7、2、5)上送(,0x00,0x00)而第一列(13脚)送、“0”。同理扫描第二列。当行线上送了16次数据而列线扫描了16次后一个“你”字也就显示出来了。

点阵屏驱动
由LED点阵显示器的内部结构可知,器件宜采用动态扫描驱动方式工作,由于LED管芯大多为高型,因此某行或某列的单体 LED驱动电流可选用窄脉冲,但其平均电流应限制在20mA内.多数点阵显示器的单体LED的正向压降约在2V左右.但大亮点∮10的点阵显示器单体 LED的正向压降约为6V。大屏幕显示系统一般是将由多个LED点阵组成的小模块以搭积木的方式组合而成的,每一个小模块都有自己的独立的控制系统,组合在一起后只要引入一个总控制器控制各模块的命令和数据即可,这种方法既简单而且具有易装、易维修的特点。LED点阵显示系统中各模块的显示方式有静态和动态显示两种。静态显示原理简单、控制方便,但硬件接线复杂,在实际应用中一般采用动态显示方式,动态显示采用扫描的方式工作,由峰值较大的窄脉冲驱动,从上到下逐次不断地对显示屏的各行进行选通,同时又向各列送出表示图形或文字信息的脉冲信号,反复循环以上操作,就可显示各种图形或文字信息。

点阵屏分类
LED点阵屏有单色和双色、全彩三类,可显示红,黄,绿,橙等。LED点阵有4×4、4×8、5×7、5×8、 8×8、16×16、24×24、40×40等多种;根据图素的数目分为等,双原色、三原色等,根据图素颜色的不同所显示的文字、图像等内容的颜色也不同,单原色点阵只能显示固定色彩如红、绿、黄等单色,双原色和三原色点阵显示内容的颜色由图素内不同颜色发光二极体点亮组合方式决定,如红绿都亮时可显示黄色,假如按照脉冲方式控制二极体的点亮时间,则可实现256或更高级灰度显示,即可实现真彩色显示。

主要特点
1、亮度高:相对0603或0805等形式的分立表贴,LED可以有更多的光通量被反射出。
可实现超高密度:室内可高达62.500点/平米(P4)。也有厂家可以做到p3的。密度越大所需要的散热性能越好。
2、混色好:利用发光器件本身的微化处理和光的波粒二象性,使得红光粒子,纯绿光粒子,蓝光粒子三种粒子都将得到充分地相互混合搅匀。
3、环境性能好:耐湿、耐冷热、耐腐蚀
4、抗静电性能优势超强:制作环境有着严格的标准还有产品结构的绝缘设计。
5、可视角度大:140度(水平方向)
6、通透性高:新一代点阵技术凭借自身的高度纯度性能,以及几近100%光通率的环氧树脂材料,达到了接近完美的通透率。

16X16串口LED点阵模块
本模块采用超高亮LED灯芯、74HC595驱动芯片和高性价 比工业级单片机专业制造,工作稳定,刷新频率高,显示效果好;支持二次开发,应用方便。可以通过串口控制点阵模块显示方式:开启/关闭、正显/反显、左右翻转、上下翻转等;通过串口可以更新显示内容,也可以直接发送(16x16单色)bmp文件,方便接驳现有流行的智能硬件平台,如Arduino、树莓派等。

接线示意图与引脚功能


模块特点
1. 模块尺寸64mm X 64mm X 12mm(不含背面排针高度)
2. 仅需一根串口TXD信号即可(用广播设备号:0xFFFFFFFF)控制;
3. 超高亮贴片LED,5V或3.3V供电都可以。
4. 采用恒流亮度驱动电路, 亮度均匀。
5. 性价比高,开发速度快,提供网站自动生成arduino演示代码,粘贴到arduino IDE,下载即可实验与使用。


16X16串口LED点阵模块
采用74HC595作为LED扫描驱动器,板载时序控制器提供74HC595驱动信号和显示数
据;同时接收上位机发送的命令,实现点阵模块显示控制。发送命令格式如下:
[长度][设备号][命令号][参数...]
其中:长度表示本次发送的所有字节数,不包括本字节。本串口点阵模块收完一帧命令后会做长度校验,过滤干扰数据;设备号表示本串口点阵模块在多模块显示系统中的标识号,便于区分,当前版本支持32bit设备号。如果只控制单个模块,可以使用广播设备号(0xFFFFFFFF);命令号定义如下:

  1. typedef enum
  2. {
  3. LEP_CMD_NO_OPERATION, // 0-空操作
  4. LEP_CMD_SCREEN_HIDE, // 1-屏幕关闭
  5. LEP_CMD_SCREEN_INVERT, // 2-屏幕反显
  6. LEP_CMD_SCREEN_MIRROR, // 3-屏幕镜像
  7. LEP_CMD_SCREEN_TURN, // 4-屏幕倒影
  8. LEP_CMD_SCREEN_PIXEL, // 5-屏幕像素
  9. LEP_CMD_SCREEN_FILL, // 6-屏幕填充
  10. LEP_CMD_SCREEN_LOAD, // 7-屏幕载入
  11. LEP_CMD_CAVAS_ICON, // 8-显示图标
  12. LEP_CMD_PRINT_ASCII, // 9-英文字符
  13. }
  14. lepCmdNo_t; //命令号定义



Arduino参考开源代码


  1. /*
  2. 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3. 实验一百零四: 16X16点阵串口LED汉字显示屏模块UART接口
  4. 1、安装库:打开Arduino IDE——工具——管理库,搜索marde
  5. 2、项目:显示“智”字
  6. 3、连线:
  7. VDD → 5V
  8. GND → GND
  9. TXD → D0
  10. RXD → D1
  11. */
  12. #include <MdLep16X16.h>
  13. byte message[][2]
  14. ={
  15. {0x20,0x00},//line_0
  16. {0x3e,0x7c},//line_1
  17. {0x48,0x44},//line_2
  18. {0x08,0x44},//line_3
  19. {0xff,0x44},//line_4
  20. {0x14,0x44},//line_5
  21. {0x22,0x7c},//line_6
  22. {0x40,0x00},//line_7
  23. {0x1f,0xf0},//line_8
  24. {0x10,0x10},//line_9
  25. {0x10,0x10},//line_10
  26. {0x1f,0xf0},//line_11
  27. {0x10,0x10},//line_12
  28. {0x10,0x10},//line_13
  29. {0x1f,0xf0},//line_14
  30. {0x10,0x10},//line_15
  31. };
  32. MdLep16X16 mdLep(0xFF, 0xFF, 0xFF, 0xFF);
  33. void setup() {
  34. // put your setup code here, to run once:
  35. Serial.begin(9600);
  36. delay(1000);
  37. mdLep.loadScreen((byte*)message);
  38. }
  39. void loop() {
  40. // put your main code here, to run repeatedly:
  41. }


实验场景图



  1. /*
  2. 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3. 实验一百零四: 16X16点阵串口LED汉字显示屏模块UART接口
  4. 1、安装库:打开Arduino IDE——工具——管理库,搜索marde
  5. 2、项目:滚动显示汉字
  6. 3、连线:
  7. VDD → 5V
  8. GND → GND
  9. TXD → D0
  10. RXD → D1
  11. */
  12. #include <MsTimer2.h>
  13. #include <MdLep16X16.h>
  14. byte message[][2] =
  15. {
  16. {0x00,0x00},
  17. {0x00,0x00},
  18. {0x00,0x00},
  19. {0x00,0x00},
  20. {0x00,0x00},
  21. {0x00,0x00},
  22. {0x00,0x00},
  23. {0x00,0x00},
  24. {0x00,0x00},
  25. {0x00,0x00},
  26. {0x00,0x00},
  27. {0x00,0x00},
  28. {0x00,0x00},
  29. {0x00,0x00},
  30. {0x00,0x00},
  31. {0x00,0x00},/*移出,9*/
  32. //-----------------------------以下内容自行更改
  33. {0x00,0x28},//line_0
  34. {0x7f,0x24},//line_1
  35. {0x49,0x40},//line_2
  36. {0x49,0x7e},//line_3
  37. {0x5d,0xc8},//line_4
  38. {0x49,0x48},//line_5
  39. {0x7f,0x7e},//line_6
  40. {0x41,0x48},//line_7
  41. {0x5d,0x48},//line_8
  42. {0x55,0x7e},//line_9
  43. {0x55,0x48},//line_10
  44. {0x5d,0x48},//line_11
  45. {0x41,0x48},//line_12
  46. {0x41,0x7e},//line_13
  47. {0x45,0x40},//line_14
  48. {0x82,0x40},//line_15/*"雕",0*/
  49. {0x04,0x40},//line_0
  50. {0x08,0x20},//line_1
  51. {0x18,0x50},//line_2
  52. {0x24,0x88},//line_3
  53. {0x03,0x00},//line_4
  54. {0x0c,0xc0},//line_5
  55. {0x30,0x30},//line_6
  56. {0xc0,0x0e},//line_7
  57. {0x1f,0xf0},//line_8
  58. {0x02,0x10},//line_9
  59. {0x02,0x10},//line_10
  60. {0x02,0x10},//line_11
  61. {0x02,0x50},//line_12
  62. {0x02,0x20},//line_13
  63. {0x02,0x00},//line_14
  64. {0x02,0x00},//line_15/*"爷",1*/
  65. {0x22,0x08},//line_0
  66. {0x11,0x08},//line_1
  67. {0x11,0x10},//line_2
  68. {0x00,0x20},//line_3
  69. {0x7f,0xfe},//line_4
  70. {0x40,0x02},//line_5
  71. {0x80,0x04},//line_6
  72. {0x1f,0xe0},//line_7
  73. {0x00,0x40},//line_8
  74. {0x01,0x80},//line_9
  75. {0xff,0xfe},//line_10
  76. {0x01,0x00},//line_11
  77. {0x01,0x00},//line_12
  78. {0x01,0x00},//line_13
  79. {0x05,0x00},//line_14
  80. {0x02,0x00},//line_15/*"学",2*/
  81. {0x10,0x80},//line_0
  82. {0x10,0x40},//line_1
  83. {0x23,0xfc},//line_2
  84. {0x22,0x04},//line_3
  85. {0x4a,0x04},//line_4
  86. {0xfb,0xfc},//line_5
  87. {0x12,0x00},//line_6
  88. {0x22,0x00},//line_7
  89. {0x43,0xfc},//line_8
  90. {0xfb,0x54},//line_9
  91. {0x43,0x54},//line_10
  92. {0x05,0xfc},//line_11
  93. {0x1d,0x54},//line_12
  94. {0xe5,0x54},//line_13
  95. {0x49,0x44},//line_14
  96. {0x01,0x0c},//line_15/*"编",3*/
  97. {0x08,0x00},//line_0
  98. {0x1d,0xfc},//line_1
  99. {0xf1,0x04},//line_2
  100. {0x11,0x04},//line_3
  101. {0x11,0x04},//line_4
  102. {0xfd,0xfc},//line_5
  103. {0x10,0x00},//line_6
  104. {0x30,0x00},//line_7
  105. {0x39,0xfe},//line_8
  106. {0x54,0x20},//line_9
  107. {0x54,0x20},//line_10
  108. {0x91,0xfc},//line_11
  109. {0x10,0x20},//line_12
  110. {0x10,0x20},//line_13
  111. {0x13,0xfe},//line_14
  112. {0x10,0x00},//line_15/*"程",4*/
  113. //-----------------------------内容区域结束
  114. {0x00,0x00},
  115. {0x00,0x00},
  116. {0x00,0x00},
  117. {0x00,0x00},
  118. {0x00,0x00},
  119. {0x00,0x00},
  120. {0x00,0x00},
  121. {0x00,0x00},
  122. {0x00,0x00},
  123. {0x00,0x00},
  124. {0x00,0x00},
  125. {0x00,0x00},
  126. {0x00,0x00},
  127. {0x00,0x00},
  128. {0x00,0x00},
  129. {0x00,0x00},/*移入,9*/
  130. };
  131. MdLep16X16 mdLep(0xFF, 0xFF, 0xFF, 0xFF);
  132. byte i = 0;
  133. byte *ptr;
  134. const int maxColumn = sizeof(message)/ROW_OCTS - LEP_ROWS;
  135. void onTimer()
  136. {
  137. mdLep.loadScreen(ptr+i*ROW_OCTS);
  138. i++;
  139. if(i == maxColumn) i = 0;
  140. }
  141. void setup() {
  142. ptr = &message[0][0];
  143. Serial.begin(9600);
  144. mdLep.mirrorOff();//(关闭汉字镜像)
  145. //mdLep.mirrorOn();
  146. MsTimer2::set(100, onTimer);
  147. MsTimer2::start();
  148. }
  149. void loop() {
  150. }


实验场景图

实验场景动态图

https://www.arduino.cn/data/attachment/forum/201909/06/194759gm2k505p9viek9pl.gif


  1. /*
  2. 【花雕动手做】有趣好玩的音乐可视化系列小项目(08)---四位32段点阵屏
  3. 项目之一:八段分频8X8点阵屏的音乐频谱灯
  4. 接脚连线:MAX9814 接A0
  5. MAX7219 UNO
  6. VCC →→→→→ 5V
  7. GND →→→→→ GND
  8. DIN →→→→→ D11(数据,数据接收引脚)
  9. CS →→→→→ D10(负载,命令接收引脚)
  10. CLK →→→→→ D13(时钟,时钟引脚)
  11. */
  12. #include "LedControl.h"
  13. /* Led matrix - Max7219 Declared */
  14. LedControl lc = LedControl(11, 13, 10, 1);
  15. const int maxScale = 11;
  16. /* Sensor - Max9812 Declared */
  17. const int sensorPin = A0;
  18. const int sampleWindow = 50; // 50ms = 20Hz
  19. unsigned int sample;
  20. unsigned long startMillis;
  21. unsigned long timeCycle;
  22. unsigned int signalMax = 0;
  23. unsigned int signalMin = 1024;
  24. unsigned char index = 0;
  25. unsigned int peakToPeak[8];
  26. unsigned int displayPeak[8];
  27. unsigned int temp[8] = {0, 0, 0, 0, 0, 0, 0, 0};
  28. unsigned int signalMaxBuff[8];
  29. unsigned int signalMinBuff[8];
  30. void setup() {
  31. // Led matrix
  32. lc.shutdown(0, false); // bật hiện thị
  33. lc.setIntensity(0, 2); // chỉnh độ sáng
  34. lc.clearDisplay(0); // tắt tất cả led
  35. Serial.begin(9600);
  36. }
  37. void loop() {
  38. startMillis = millis();
  39. //peakToPeak = 0;
  40. signalMax = 0;
  41. signalMin = 1024;
  42. // Get data in 50ms
  43. while (millis() - startMillis < sampleWindow) {
  44. sample = analogRead(sensorPin);
  45. if (sample < 1024) {
  46. if (sample > signalMax) {
  47. signalMax = sample;
  48. }
  49. if (sample < signalMin) {
  50. signalMin = sample;
  51. }
  52. }
  53. // 20Hz - 64Hz - 125Hz - 250Hz - 500Hz - 1kHz (timeCycle = 1/F)(ms)
  54. timeCycle = millis() - startMillis;
  55. if (timeCycle == 1 || timeCycle == 2 || timeCycle == 4 || timeCycle == 8
  56. || timeCycle == 16 || timeCycle == 32 || timeCycle == 40 || timeCycle == 50) {
  57. signalMaxBuff[index] = signalMax;
  58. signalMinBuff[index] = signalMin;
  59. index = (index + 1) % 8;
  60. delay(1);
  61. Serial.println(timeCycle);
  62. }
  63. }
  64. // Delete pointer to array
  65. index = 0;
  66. // Calculation after get samples
  67. for (int i = 0; i < 8; i++) { // i = row (led matrix)
  68. // sound level
  69. peakToPeak[i] = signalMaxBuff[i] - signalMinBuff[i];
  70. // Map 1v p-p level to the max scale of the display
  71. displayPeak[i] = map(peakToPeak[i], 0, 1023, 0, maxScale);
  72. // Show to led matrix
  73. displayLed(displayPeak[i], i);
  74. // Led drop down
  75. if (displayPeak[i] >= temp[i]) {
  76. temp[i] = displayPeak[i];
  77. }
  78. else {
  79. temp[i]--;
  80. }
  81. lc.setLed(0, i, temp[i], true);
  82. delayMicroseconds(10);
  83. }
  84. }
  85. void displayLed(int displayPeak, int row) {
  86. switch (displayPeak) {
  87. case 0 : lc.setRow(0, row, 0x80); break;
  88. case 1 : lc.setRow(0, row, 0xC0); break;
  89. case 2 : lc.setRow(0, row, 0xE0); break;
  90. case 3 : lc.setRow(0, row, 0xF0); break;
  91. case 4 : lc.setRow(0, row, 0xF8); break;
  92. case 5 : lc.setRow(0, row, 0xFC); break;
  93. case 6 : lc.setRow(0, row, 0xFE); break;
  94. case 7 : lc.setRow(0, row, 0xFF); break;
  95. }
  96. }

实验场景动态图

https://img.mydigit.cn/forum/202111/20/154104vqvzuvmddc0d1nln.gif

实验场景图


实验视频剪辑(2分40秒)

https://v.youku.com/v_show/id_XNTgyMTMyMzM2MA==.html?spm=a2hcb.playlsit.page.1


作者: 雕爷学编程, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-3894459.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
5
关闭 站长推荐上一条 /3 下一条