7.6 LED点阵的横向移动

Arduino 8×8点阵屏的驱动 根据点阵屏管脚定义,点阵屏的[9, 14, 8, 12, 1, 7, 2, 5]分别连接开发板的[6,11, 5, 9, 14, 4, 15, 2],这8个引脚为LED的正极;点阵屏的[13, 3, 4, 10, 6, 11, 15, 16]分别连接开发板的[10,16, 17, 7, 3, 8, 12, 13],这8个引脚为LED的负极。LED点阵屏由LED发光二极管组成,通过控制LED亮灭来显示文字、图片、动画、视频等,被广泛应用于公共场合做信息展示,如广告屏、公告牌等。1.根据原理图搭建电路。 阅读详情
上下移动我们会了,那我们还想左右移动该如何操作呢?

方法一、最简单,就是把板子侧过来放,纵向取模就可以完成。

这里大家是不是有种头顶冒汗的感觉?我们要做好技术,但是不能沉溺于技术。技术是我们的工具,我们在做开发的时候除了用好这个工具外,也得多拓展自己解决问题的思路,要慢慢培养自己的多角度思维方式。

那把板子正过来,左右移动就完不成了吗?当然不是。大家慢慢的学多了就会培养了一种感觉,就是一旦硬件设计好了,我们要完成一种功能,大脑就可以直接思考出来能否完成这个功能,这个在我们进行电路设计的时候最为重要。我们在开发产品的时候,首先是设计电路,设计电路的时候,工程师就要在大脑中通过思维来验证板子硬件和程序能否完成我们想要的功能,一旦硬件做好了,做好板子回来剩下的就是靠编程来完成了。只要是硬件逻辑上没问题,功能上软件肯定可以实现。

当然了,我们在进行硬件电路设计的时候,也得充分考虑软件编程的方便性。因为我们的程序是用 P0 来控制点阵的整行,所以对于我们这样的电路设计,上下移动程序是比较好编写的。那如果我们设计电路的时候知道我们的图形要左右移动,那我们设计电路画板子的时候就要尽可能的把点阵横过来放,有利于我们编程方便,减少软件工作量。

方法二、利用二维数组来实现,算法基本上和上下移动相似。

二维数组,前边提过一次,他的使用其实也没什么复杂的。它的声明方式是:
    数据类型 数组名[数组长度 1][数组长度 2];
与一位数组类似,数据类型是全体元素的数据类型,数组名是标识符,数组长度 1 和数组长度 2 分别代表数组具有的行数和列数。数组元素的下标一律从 0 开始。

例如:unsigned char a[2][3];声明了一个具有 2 行 3 列的无符号字符型的二维数组 a。

二维数组的数组元素总个数是两个长度的乘积。二维数组在内存中存储的时候,采用行优先的方式来存储,即在内存中先存放第 0 行的元素,再存放第一行的元素......,同一行中再按照列顺序存放,刚才定义的那个 a[2][3]的存放形式就如表 7-1 所示。

表7-1 二维数组的物理存储结构
a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]

二维数组的初始化方法分两种情况,我们前边学一维数组的时候学过,数组元素的数量可以小于数组元素个数,没有赋值的会自动给 0。当数组元素的数量等于数组个数的时候,如下所示:
    unsigned char a[2][3] = {{1,2,3}, {4,5,6}};
或者是
    unsigned char a[2][3] = {1,2,3,4,5,6};

当数组元素的数量小于数组个数的时候,如下所示:
    unsigned char a[2][3] = {{1,2}, {3,4}};
等价于
    unsigned char a[2][3] = {1,2,0,3,4,0};

而反过来的写法
    unsigned char a[2][3] = {1,2,3,4};
等价于
    unsigned char a[2][3] = {{1,2,3}, {4,0,0}};

此外,二维数组初始化的时候,行数可以省略,编译系统会自动根据列数计算出行数,但是列数不能省略。

讲这些,只是为了让大家了解一下,看别人写的代码的时候别发懵就行了,但是我们今后写程序的时候,按照规范,行数列数都不要省略,全部写齐,初始化的时候,全部写成unsigned char a[2][3] = {{1,2,3}, {4,5,6}};的形式,而不允许写成一维数组的格式,防止大家出错,同时也是提高程序的可读性。

那么下面我们要进行横向做 I ❤ U 的动画了,先把我们需要的图片画出来,再逐一取模,和上一张图片类似的是,我们这个图形共有 30 张图片,通过程序每 250ms 改变一张图片,就可以做出来动画效果了。但是不同的是,我们这个是要横向移动,横向移动的图片切换时的字模数据不是连续的,所以这次我们要对 30 张图片分别取模,如图 7-11 所示。
图 7-11  横向动画取模图片
图 7-11  横向动画取模图片

图 7-11 中最上面的图形是横向连在一起的效果,而实际上我们要把它分解为 30 个帧,每帧图片单独取模,取出来都是 8 个字节的数据,一共就是 30*8 个数据,我们用一个二维数组来存储它们。
  1. #include <reg52.h>
  2. sbit ADDR0 = P1^0;
  3. sbit ADDR1 = P1^1;
  4. sbit ADDR2 = P1^2;
  5. sbit ADDR3 = P1^3;
  6. sbit ENLED = P1^4;
  7. unsigned char code image[30][8] = {
  8. {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}, //动画帧 1
  9. {0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F}, //动画帧 2
  10. {0xFF,0x3F,0x7F,0x7F,0x7F,0x7F,0x7F,0x3F}, //动画帧 3
  11. {0xFF,0x1F,0x3F,0x3F,0x3F,0x3F,0x3F,0x1F}, //动画帧 4
  12. {0xFF,0x0F,0x9F,0x9F,0x9F,0x9F,0x9F,0x0F}, //动画帧 5
  13. {0xFF,0x87,0xCF,0xCF,0xCF,0xCF,0xCF,0x87}, //动画帧 6
  14. {0xFF,0xC3,0xE7,0xE7,0xE7,0xE7,0xE7,0xC3}, //动画帧 7
  15. {0xFF,0xE1,0x73,0x73,0x73,0xF3,0xF3,0xE1}, //动画帧 8
  16. {0xFF,0x70,0x39,0x39,0x39,0x79,0xF9,0xF0}, //动画帧 9
  17. {0xFF,0x38,0x1C,0x1C,0x1C,0x3C,0x7C,0xF8}, //动画帧 10
  18. {0xFF,0x9C,0x0E,0x0E,0x0E,0x1E,0x3E,0x7C}, //动画帧 11
  19. {0xFF,0xCE,0x07,0x07,0x07,0x0F,0x1F,0x3E}, //动画帧 12
  20. {0xFF,0x67,0x03,0x03,0x03,0x07,0x0F,0x9F}, //动画帧 13
  21. {0xFF,0x33,0x01,0x01,0x01,0x03,0x87,0xCF}, //动画帧 14
  22. {0xFF,0x99,0x00,0x00,0x00,0x81,0xC3,0xE7}, //动画帧 15
  23. {0xFF,0xCC,0x80,0x80,0x80,0xC0,0xE1,0xF3}, //动画帧 16
  24. {0xFF,0xE6,0xC0,0xC0,0xC0,0xE0,0xF0,0xF9}, //动画帧 17
  25. {0xFF,0x73,0x60,0x60,0x60,0x70,0x78,0xFC}, //动画帧 18
  26. {0xFF,0x39,0x30,0x30,0x30,0x38,0x3C,0x7E}, //动画帧 19
  27. {0xFF,0x9C,0x98,0x98,0x98,0x9C,0x1E,0x3F}, //动画帧 20
  28. {0xFF,0xCE,0xCC,0xCC,0xCC,0xCE,0x0F,0x1F}, //动画帧 21
  29. {0xFF,0x67,0x66,0x66,0x66,0x67,0x07,0x0F}, //动画帧 22
  30. {0xFF,0x33,0x33,0x33,0x33,0x33,0x03,0x87}, //动画帧 23
  31. {0xFF,0x99,0x99,0x99,0x99,0x99,0x81,0xC3}, //动画帧 24
  32. {0xFF,0xCC,0xCC,0xCC,0xCC,0xCC,0xC0,0xE1}, //动画帧 25
  33. {0xFF,0xE6,0xE6,0xE6,0xE6,0xE6,0xE0,0xF0}, //动画帧 26
  34. {0xFF,0xF3,0xF3,0xF3,0xF3,0xF3,0xF0,0xF8}, //动画帧 27
  35. {0xFF,0xF9,0xF9,0xF9,0xF9,0xF9,0xF8,0xFC}, //动画帧 28
  36. {0xFF,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFE}, //动画帧 29
  37. {0xFF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF} //动画帧 30
  38. };
  39. void main(){
  40. EA = 1; //使能总中断
  41. ENLED = 0; //使能 U4,选择 LED 点阵
  42. ADDR3 = 0;
  43. TMOD = 0x01; //设置 T0 为模式 1
  44. TH0 = 0xFC; //为 T0 赋初值 0xFC67,定时 1ms
  45. TL0 = 0x67;
  46. ET0 = 1; //使能 T0 中断
  47. TR0 = 1; //启动 T0
  48. while (1);
  49. }
  50. /* 定时器 0 中断服务函数 */
  51. void InterruptTimer0() interrupt 1{
  52. static unsigned char i = 0; //动态扫描的索引
  53. static unsigned char tmr = 0; //250ms 软件定时器
  54. static unsigned char index = 0; //图片刷新索引
  55. TH0 = 0xFC; //重新加载初值
  56. TL0 = 0x67;
  57. //以下代码完成 LED 点阵动态扫描刷新
  58. P0 = 0xFF; //显示消隐
  59. switch (i){
  60. case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=image[index][0]; break;
  61. case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=image[index][1]; break;
  62. case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=image[index][2]; break;
  63. case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=image[index][3]; break;
  64. case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=image[index][4]; break;
  65. case 5: ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=image[index][5]; break;
  66. case 6: ADDR2=1; ADDR1=1; ADDR0=0; i++; P0=image[index][6]; break;
  67. case 7: ADDR2=1; ADDR1=1; ADDR0=1; i=0; P0=image[index][7]; break;
  68. default: break;
  69. }
  70. //以下代码完成每 250ms 改变一帧图像
  71. tmr++;
  72. if (tmr >= 250){ //达到 250ms 时改变一次图片索引
  73. tmr = 0;
  74. index++;
  75. if (index >= 30){ //图片索引达到 30 后归零
  76. index = 0;
  77. }
  78. }
  79. }
下载进到板子上瞧瞧,是不是有一种帅到掉渣的感觉呢。技术这东西,外行人看的是很神秘的,其实我们做出来会发现,也就是那么回事而已,每 250ms 更改一张图片,每 1ms在定时器中断里刷新单张图片的某一行。

不管是上下移动还是左右移动,大家要建立一种概念,就是我们是对一帧帧的图片的切换,这种切换带给我们的视觉效果就是一种动态的了。比如我们的 DV 拍摄动画,实际上就是快速的拍摄了一帧帧的图片,然后对这些图片的快速回放,把动画效果给显示了出来。因为我们硬件设计的缘故,所以在写上下移动程序的时候,数组定义的元素比较少,但是实际上大家也得理解成是 32 张图片的切换显示,而并非是真正的“移动”。
51单片机学习记录(8) “8X8点阵 51单片机学习记录(8) “8x8点阵” 8x8点阵就是由64个小led灯组成的矩阵,现在先让我们看一下点阵的内部结构 从图中可以了解到 (从行看去)每一行的小灯的阳极相连在一起排成了一列 (从列看去)每一列的小灯的阴极相连在一起排成了一行 也就是说当我们对行进行操作的时候需要发送低电平,对列进行操作的时候需要发送高电平,这样才能使电路导通 74HC595芯片 因为想要点亮8x8点阵还需要它 其中8x8点阵led灯的列就是图示D0到D7控制的,当我们编写程序时需要用到SER,SRCLK,RCLK这 阅读详情

相关推荐

51单片机实操(8*8LED点阵屏静态显示爱心)(8*8LED点阵屏动态显示hello!)

LED点阵屏由独立的LED组成,一般有8*8,16*18,LED以矩阵形式排列。

weixin_52448289的博客 5338

51单片机教程:8*8 点阵显示字符、数字、简单汉字

点阵显示实验 一、什么是点阵? 我们用之前的方法一个IO口只能控制一个led,如果需要用更少的IO口控制更多的led怎么办呢,于是就有了点阵。 8X8点阵共由64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一行置1电平,某一列置0电平,则相应的二极管就亮;如要将第一个点点亮,则1脚接高电平a脚接低电平,则第一个点就亮了; 二、点阵原理图 可以看到点阵是由led按照一定的排列组成 ...

mbs706的博客 15万+

51单片机驱动LED点阵屏与74HC595实战指南

LED点阵屏作为基础显示设备,通过移位寄存器74HC595实现串行转并行控制,是嵌入式开发的经典应用。74HC595采用三线制控制(数据、时钟、锁存),通过级联可扩展输出引脚,配合51单片机可构建高性价比显示系统。这种硬件组合在商场电子价签、公交站牌等场景广泛应用,能以不足30元成本替代专业显示模块。关键技术涉及动态扫描消隐、PWM调光等显示优化手段,以及级联时序、电源滤波等硬件设计要点。通过双缓冲存储和字模提取算法,还能实现汉字显示与动画效果。

weixin_30565199的博客 424

51单片机 8*8LED点阵(入门教学)

字符或图像就是由多个点组成,想要在LED点阵上显示数字或简单的图像,首先要获取在 LED 点阵上显示数字字符所需的数据,即一个数字字符在 LED 点阵上显示,对应的每行每列都会有一些灯点亮或者熄灭,这样就会构成一组数据,也就是数字字符的显示数据,我们只要将这些数据通过单片机发送到点阵对应的行或列就能显示数字字符。然后可以在这个 8*8 白色格子里面点击,点击后即会在对应位置出现一 个黑点,表示在 LED 点阵对应位置的 LED 灯点亮,未点击位置(白色)表示 LED 点阵对应位置的 LED 灯熄灭。

qq_70878924的博客 1万+

51单片机入门——8X8点阵LED

文章目录1.初识点阵LED1.1.什么是点阵LED1.2.点亮LED点阵1.3.点阵显示图案2.点阵的动画显示2.1.点阵的纵向移动2.2.点阵横向移动 1.初识点阵LED 1.1.什么是点阵LED LED点阵屏通过LED(发光二极管)组成,以灯珠亮灭来显示文字、图片、动画、视频等,是各部分组件都模块化的显示器件,通常由显示模块、控制系统及电源系统组成。LED点阵显示屏制作简单,安装方便,被广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等。 点阵LED显示屏作为一种现代电子媒体设备,具有灵活的的显

倾晨灬雨曦的博客 3万+

【自学51单片机】7--LED点阵学习

文章目录1.LED点阵介绍2、点亮LED点阵原理3、LED点阵图形显示 1.LED点阵介绍   LED点阵由多个LED小灯构成,以8*8LED点阵介绍,实物图和内部原理图如下。  图7-2左侧8个引脚为内部LED小灯阳极,上侧8个引脚为阴极。 2、点亮LED点阵原理   点亮LED点阵与点亮LED小灯原理相似,根据LED点阵电路图分析即可,详细见第三章。 3、LED点阵图形显示 取模软件简单介绍  取模软件可以将LED点阵图形的数据转换为程序中的数据。取模软件中黑色为LED熄灭,值为1,白色为LED

LZY 2317

单片机点阵 LED 设计显示屏,超详细!

LED点阵的介绍点阵 LED 显示屏作为一种现代电子媒体,具有灵活的显示面积(可任意分割和拼装)、高亮度、长寿命、数字化、实时性等特点,应用非常广泛。前边学了 LED 小灯和 LED...

9042

【五】点阵LED(KST-51)

文章围绕8x8点阵展开,首先介绍其硬件结构,左侧8个引脚接内部LED阳极,上侧8个引脚接阴极,通过74HC138三八译码器和74HC245电路,配合单片机控制引脚电平实现LED点亮。接着阐述点阵的使用,包括开启点阵第一排LED、点亮所有LED的代码实现;然后讲解用取模软件获取图像二进制代码,通过动态刷新在点阵上显示图像;最后介绍点阵动画显示,纵向移动通过增加图像数量和改变动态刷新方式实现,横向移动则借助二维数组解决行不变列变化的问题,均通过定时器中断完成动态刷新,实现不同的显示效果。

2401_88606350的博客 1510

led动态显示 c语言,单片机LED点阵横向移动(动态显示)

上下移动我们会了,那我们还想左右移动该如何操作呢?方法一、最简单,就是把板子侧过来放,纵向取模就可以完成。这里大家是不是有种头顶冒汗的感觉?我们要做好技术,但是不能沉溺于技术。技术是我们的工具,我们在做开发的时候除了用好这个工具外,也得多拓展自己解决问题的思路,要慢慢培养自己的多角度思维方式。那把板子正过来,左右移动就完不成了吗?当然不是。大家慢慢的学多了就会培养了一种感觉,就是一旦硬件设计好了,...

weixin_42568512的博客 1290

7定时器不起作用_第7章 变量进阶与点阵LED

7章 变量进阶与点阵LED当我们走在马路上的时候,经常会看到马路两侧有一些LED点阵的广告牌,这些广告牌看起来绚烂夺目,非常吸引人,而且还会变化很多种不同的显示方式。本章我们就会学习到点阵LED的控制方式,但是首先得来了解一点C语言变量的进阶知识——变量的作用域和存储类别。7.1 变量的作用域所谓的作用域就是指变量起作用的范围,也是变量的有效范围。变量按他的作用域可以分为局部变量和全局...

weixin_39692830的博客 482

【五】点阵LED(KST-51)动画编程实战:从静态显示到动态效果

本文详细介绍了KST-51单片机控制8x8点阵LED的编程实战,从硬件结构、单点控制到全屏点亮技术。重点讲解了静态图像显示取模方法和动态动画效果实现,包括纵向移动横向移动等核心技巧,并提供了实用的调试方法和性能优化建议,帮助开发者快速掌握LED点阵动画编程。

time3的博客 186

51单片机 8*8LED点阵横向流水 使用位运算生成中间帧

#include typedef unsigned char uchar; sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; code uchar image[5][8] = { {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0

宁静致远 1547

(学习笔记)手把手教你学51单片机:变量进阶与点阵LED

一、变量的作用域 作用域:变量的有效范围。分为:局部变量和全局变量。 1.1局部变量 在函数内部声明的变量,只在本函数内部可以使用。 1.2全局变量 在函数外声明的变量就是全局变量。 二、变量的存储类别 变量的存储类别分为自动、静态、寄存器和外部四种。 局部变量如果不加static修饰都属于自动变量。关键词为auto,可以省略。 全局变量均为静态变量。 局部变量加 static...

Wapiti_y的博客 1402

单片机学习(点阵LED及多模块同时实现)

原理也是动态刷新,横向滚动时,8列为一张图片,总共是30张,用二维数组将这些图片存储起来 /* ******************************************************************************* * 《手把手教你学51单片机(C语言版)》 * 配套 KST-51 单片机开发板 示例源代码 * * (c) 版权所有 2014 金沙滩工作室/清华大学出版.

qq_58678697的博客 1541

KST-51:8*8点阵横向移动显示IG!

使用取模软件对 IG!一帧帧横向取模,将取模后每一帧(8*8点阵画面)的数据储存在二维数组中。一共有18帧画面。 image[][]数组中,行元素代表一帧画面,列元素代表当前帧中每一行。通过中断+switch遍历控制动态显示每一帧画面,从而实现视觉上像是IG!连续横向移动。 注:取模时,需要反向取模。即亮赋0,暗赋1。 #include&lt;reg52.h&gt; sbit AD...

Wapiti_y的博客 2146

【物联网实战】从74HC595到动态点阵:STM32驱动级联屏显的完整设计

本文详细介绍了如何利用74HC595芯片和STM32微控制器实现物联网显示系统的级联设计。从74HC595的工作原理到STM32的硬件SPI驱动优化,再到动态点阵屏的刷新技巧,提供了完整的应用指南。通过实际案例展示了该方案在智能家居和工业看板中的高效应用,显著降低硬件成本并提升系统可靠性。

weixin_30321709的博客 462

自己写的一个行扫描led点阵移动显示程序

行扫描的接法写个向上移动的程序很容易,列扫描的接法写个左右移动的程序很容易,只是通过字模的数组不同取法就可以实现但上面的接法明显不符合实际要求,行扫描的时候一般都是要左右移动显示,列扫描的时候一般是上下移动显示所以我们需要的是行扫描左右移动的程序,列扫描上下移动的程序,这样的程序要用到数组数据的移位操作,下面附上代码: #include #define uchar unsigned char

7426笨蛋的专栏 6571
上一篇: 7.5 LED点阵的纵向移动
下一篇: 8.1 单片机最小系统解析
seven-soft
博客等级 码龄14年 604粉丝 979原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值