LED 点阵简介

LED 点阵是由发光二极管排列组成的显示器件,如下所示为8*8LED 点阵:

以 16*16LED 点阵为例,其内部结构图如下所示:

16*16 点阵共由 256 个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,正极连接成一行,负极连接成一排。当对应的某一行置 1 电平,某一列置 0 电平,则行列交点处相应的二极管就亮。

硬件部分

使用到硬件资源如下:

  1. 16*16LED 点阵模块
  2. 74HC595 模块

74HC595 模块电路在前文IO 扩展(串转并)介绍过,电路如下:

该模块独立,使用了 4 块级联的 74HC595 芯片,即 RCLK 和 SRCLK 管脚并联在一起,并且 74HC595 (A)的串行数据输出 /QH 连接到 74HC595(B)的串行数据输入口 SI(SER),而 74HC595(B)的输出/ QH 又连接到 74HC595(C)的串行输入口 SI(SER),依次类推。

74HC595 需要用到的控制管脚有 RCK(RCLK)、SCK(SRCLK)、SI(SER) 。

要想控制 LED 点阵,可以将单片机管脚按照 74HC595 芯片的通信时序要求来传输数据。因为使用了 4 片 74HC595 芯片,A、B 两块控制点阵行: POS1-POS16,C、D 两块控制点阵列: NEG1-NEG16,即可控制 LED 点阵。根据 LED 发光二极管导通原理,当阳极(行)为高电平,阴极(列)为低电平则点亮,否则熄灭。因此通过单片机发送 4 组设置行列的数据,通过74HC595将这四组数据分配到对应输出,即可控制 LED 点阵。

软件部分

LED 点阵~点亮一个点

代码很简单,与上一个实验核心代码是一样的,主要是理解如何让 LED 点阵的左上角第一个LED点亮。实际上就是将第一个点对应的行为高电平,列为低电平即可。也就是让第一个 74HC595 输出 0X01(0000 0001),第二个 74HC595 输出 0X00(0000 0000),这样点阵第一行就是高电平,其余行为低电平。而第 3 个 74HC595 输出 0XFE(1111 1110),第 4 个 74HC595 输出 0XFF (1111 1111),这样点阵第一列就是低电平,其余列为低电平,从而让 LED 点阵第一个LED点亮。

源代码:

#include "reg52.h"typedef unsigned int u16;//使用关键字 typedef 对系统默认数据类型 unsigned int 重新命名
typedef unsigned char u8;/*定义74HC595控制管脚*/
sbit SI=P3^4;   //串行数据输入
sbit RCK=P3^5;  //存储寄存器时钟输入
sbit SCK=P3^6;   //移位寄存器时钟输入void delay_10us(u16 ten_us)//延时函数,ten_us=1 时,大约延时 10us
{while(ten_us--);
}void HC595_WRITE_DATA(u8 cs_data1,u8 cs_data2,u8 cs_data3,u8 cs_data4) //最后两个形参表示所有列的数据,前面两个形参表示所有行的数据
{u8 i=0;for(i=0;i<8;i++)//传入第四个形参{SI=cs_data4>>7;  //因为595芯片先传高位,所以将最高位移到最低位(比如 12345678——>00000001,此处12345678这样写只为方便理解),然后给个上升沿把1传入寄存器中cs_data4<<=1;   /*这一步是将原先cs_data(比如12345678)的第二个高位(1后面的2)移到第一个高位(即变成了23455670),这一步是为了执行下一次循环的时候,将最高位移到最低位做准备,也就是SI_SER=cs_date4>>7;*/SCK=0;  //此处开始产生上升沿,先设为0,后面再设置为1,上升沿就有了,数据在 SCK 的上升沿输入存储器delay_10us(1);SCK=1;   //此刻,最高位就输入到寄存器中了,然后下一次循环依次按照此方法传入第二个高位、第三个....delay_10us(1);}for(i=0;i<8;i++)//传入第三个形参{SI=cs_data3>>7;     cs_data3<<=1;                           SCK=0;delay_10us(1);SCK=1;delay_10us(1);}for(i=0;i<8;i++)//传入第二个形参{SI=cs_data2>>7;    cs_data2<<=1;                           SCK=0;delay_10us(1);SCK=1;delay_10us(1);}for(i=0;i<8;i++)//传入第一个形参{SI=cs_data1>>7;    cs_data1<<=1;                           SCK=0;delay_10us(1);SCK=1;delay_10us(1);}RCK=0;   //这里需要一个上升沿,将存储器的数据,在 RCK 的上升沿的作用下,输入到锁存器中(此时输出使能控制端/G或/OE接地)delay_10us(1);RCK=1;
}void main(void)     //主函数
{                      while(1) {HC595_WRITE_DATA(0x01,0x00,0xfe,0xff);         }
}

现象:

LED 点阵~显示数字

同时点亮多个 LED 灯来显示数字,实现行列不同位置亮灯,需要用到动态数码管的动态扫描原理。在第一行亮灯一段时间以后灭掉,点亮第二行一段时间以后灭掉,点亮第三行一 段时间以后灭掉,如此点亮,直到八行全部点亮一次。在第一行点亮到最后一行灭掉的总时间不能超过人肉眼可识别的时间,即 24 毫秒。在每一行点亮的时候, 给列一个新的数据,此时对应列的数据就可以体现在这行上要点亮的灯上。这样就和动态数码管的显示一样,只不过数码管的 LED 灯是段值。这里使用 LED 点阵显示数字,也是多个 LED 同时点亮。

要想在点阵上显示数字等字符,首先要获取在 LED 点阵上显示数字字符所需的数据,即一个数字字符在 LED 点阵上显示,对应的每行每列都会有一些灯点亮或者熄灭,这样就会构成一组数据,也就是数字字符的显示数据,只要将这些数据通过 74HC595 发送到点阵对应的行或列就能显示数字字符。

通常使用"文字取模软件" 获取数字字符数据。文字取模软件链接: https://pan.baidu.com/s/15o5n-w3xjDEF0O2zeUNMIg?pwd=57rf 提取码: 57rf

文字取模软件使用方法:

1,双击打开该软件,首先选择“基本操作->新建图像”,设置图像的宽度和,度为 16,点击确定后将在显示窗口出现一个 16*16 的白色格子,这个就类似于 16*16LED 点阵,具体操作如下:

2,选择“模拟动画”, 后点击“放大格点”,如下所示:

3,然后在这个 16*16 白色格子里面点击,点击后会在对应位置出现 一个黑点,表示在 LED 点阵对应位置的 LED 灯点亮,未点击位置(白色)表示 LED 点阵对应位置的 LED 灯熄灭。 比如在 16*16LED 点阵上显示数字 0,那么可以在图中 16*16 白色框内通过点击对应位置描出一个数字 0 的外形,如下所示:

4,然后设置取模数据的取模方式等内容,选择“参数设置”后点击“其他 选项”。具体操作如下:

5,然后点击“取模方式”,选择 C51 格式选项,然后在点阵生成区自动会生成数字字符对应的数据(如果是使用汇编编程,那么汇编对应的汉字数据可选择 A51 格式)。如下所示:

6,数字 0 的数据生成之后,然后将生成的数据复制到程序定义的数组中,如下所示:

//LED点阵显示数字0的列数据
u8 gled_col[32]=
{0x00,0x00,0xE0,0x03,0x10,0x04,0x08,0x08,0x04,0x10,0x04,0x10,0x04,0x10,0x04,0x10,
0x04,0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x08,0x08,0x10,0x04,0xE0,0x03,0x00,0x00};

这些数据就是上述描绘的数字 0 从上到下依次每行对应的列数据。比如0x00,0x00表示第一行。0xE0,0x03表示第二行,0xE0为第二行前8位,0x03为第二行后8位。

这里解释一下参数设置中一些选项的意思,横向取模是按行读取数据,纵向取模是按列读取数据。字节倒序指的是字节数据的高位和低位的位置。比如第一行为:0x00,0x00,第二行为:0xE0,0x03。以第二行为例,0xE3化为二进制:1110 0000, 0x03化为二进制:0000 0011,因为设置了字节倒序,所有右边为高位,左边为低位,体现在图像上第二行就是:0000011111000000  。同理,第三行 0x10,0x04,体现在图像上第三行就是:0000100000100000 。而且,取模的参数设置,应该视具体硬件连接和程序设计的情况而定。

既然是动态扫描,就需要不断的扫描每列或每行,因此可以把 LED 点阵的行控制也用数组存储起来,为后面循环调用提供方便。根据数字 0 取模的数据特点是从上至下每行对应的列数据,因此扫描时也应该从上至下的顺序,如下:

//LED 点阵显示数字 0 的行数据
u8 gled_row[32]=
{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

其它数字或字符及简单图形的显示取模方法与上述类似。此处使用了_nop_();函数,详细了解请阅览文章_nop_();的由来和作用。

源代码:

#include "reg52.h"
#include "intrins.h"typedef unsigned int u16;//使用关键字 typedef 对系统默认数据类型 unsigned int 重新命名
typedef unsigned char u8;/*定义74HC595控制管脚*/
sbit SI=P3^4;   //串行数据输入
sbit RCK=P3^5;  //存储寄存器时钟输入
sbit SCK=P3^6;   //移位寄存器时钟输入//LED点阵显示数字0的列数据
u8 gled_col[32]=
{0x00,0x00,0xE0,0x03,0x10,0x04,0x08,0x08,0x04,0x10,0x04,0x10,0x04,0x10,0x04,0x10,
0x04,0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x08,0x08,0x10,0x04,0xE0,0x03,0x00,0x00};
//LED点阵显示数字0的行数据
u8 gled_row[32]=
{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};void delay_10us(u16 ten_us)//延时函数,ten_us=1 时,大约延时 10us
{while(ten_us--);
}void HC595_WRITE_DATA(u8 cs_data1,u8 cs_data2,u8 cs_data3,u8 cs_data4) //最后两个形参表示所有列的数据,前面两个形参表示所有行的数据
{u8 i=0;for(i=0;i<8;i++)//传入第四个形参{SI=cs_data4>>7;  //因为595芯片先传高位,所以将最高位移到最低位(比如 12345678——>00000001,此处12345678这样写只为方便理解),然后给个上升沿把1传入寄存器中cs_data4<<=1;   /*这一步是将原先cs_data(比如12345678)的第二个高位(1后面的2)移到第一个高位(即变成了23455670),这一步是为了执行下一次循环的时候,将最高位移到最低位做准备,也就是SI_SER=cs_date4>>7;*/SCK=0;  //此处开始产生上升沿,先设为0,后面再设置为1,上升沿就有了,数据在 SCK 的上升沿输入存储器_nop_();  //该函数是在51单片机中用的延时函数,表示执行一条没有什么意义的指令,延时一个指令周期//delay_10us(5);SCK=1;     //此刻,最高位就输入到寄存器中了,然后下一次循环依次按照此方法传入第二个高位、第三个...._nop_();  //delay_10us(5);       }for(i=0;i<8;i++)//传入第三个形参{SI=cs_data3>>7;  cs_data3<<=1;                           SCK=0;_nop_();SCK=1;_nop_();}for(i=0;i<8;i++)//传入第二个形参{SI=cs_data2>>7;    cs_data2<<=1;                           SCK=0;_nop_();SCK=1;_nop_();}for(i=0;i<8;i++)//传入第一个形参{SI=cs_data1>>7;    cs_data1<<=1;                           SCK=0;_nop_();SCK=1;_nop_();}RCK=0;   //这里需要一个上升沿,将存储器的数据,在 RCK 的上升沿的作用下,输入到锁存器中(此时输出使能控制端/G或/OE接地)delay_10us(1);RCK=1;
}void main(void)       //主函数
{u8 i=0;                      while(1)  {for(i=0;i<16;i++)   //16行,一行一轮回,16个轮回{HC595_WRITE_DATA(gled_row[i],gled_row[i+16],~gled_col[i*2],~gled_col[i*2+1]); //传送行列选数据delay_10us(10);     //延时一段时间,等待显示稳定HC595_WRITE_DATA(0x00,0x00,0x00,0x00);   //消影    }   }
}

现象:

LED 点阵~显示汉字

取模软件不仅可以手动描点取模,还可以直接取汉字等字符数据,这里以汉字宋体常规小四号“风”为例,教大家如何使用该软件来获取汉字数据。

1,首先打开文字取模软件,选择“参数设置”,对字体大小进行设置, 如下所示

2, 然后设置取模数据的取模方式等内容,具体操作如下:

3, 然后在文字输入区内输入所要显示的汉字:风,然后按住键盘的 Ctrl+Enter 组合键完成汉字的输入。此时显示区就会显示刚才输入的汉字,通过放大格点可观察的更清楚,默认生成的是 16*16 大小的点阵数据。 具体操作如下:

4, 点击取模方式,选择 C51 格式选项,然后在点阵生成区自动会生成汉字对应的数据(如果是使用汇编开发,那么汇编对应的汉字数据可选择 A51 格式)。如下所示:

至此,就完成了汉字取模,然后将生成的汉字数据复制到程序内定义的数组中,如下所示:

//LED 点阵显示汉字“风”数据
u8 gled_col[32]=
{0x00,0x00,0xFC,0x0F,0x04,0x08,0x04,0x08,0x14,0x0A,0x24,0x0A,0x44,0x09,0x44,0x09,
0x84,0x08,0x84,0x08,0x44,0x09,0x44,0x49,0x24,0x52,0x12,0x52,0x02,0x60,0x01,0x40}; 

源代码:

#include "reg52.h"
#include "intrins.h"typedef unsigned int u16;//使用关键字 typedef 对系统默认数据类型 unsigned int 重新命名
typedef unsigned char u8;/*定义74HC595控制管脚*/
sbit SI=P3^4;   //串行数据输入
sbit RCK=P3^5;  //存储寄存器时钟输入
sbit SCK=P3^6;   //移位寄存器时钟输入//LED 点阵显示汉字“风”数据
u8 gled_col[32]=
{0x00,0x00,0xFC,0x0F,0x04,0x08,0x04,0x08,0x14,0x0A,0x24,0x0A,0x44,0x09,0x44,0x09,
0x84,0x08,0x84,0x08,0x44,0x09,0x44,0x49,0x24,0x52,0x12,0x52,0x02,0x60,0x01,0x40};
//LED点阵显示数字0的行数据
u8 gled_row[32]=
{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};void delay_10us(u16 ten_us)//延时函数,ten_us=1 时,大约延时 10us
{while(ten_us--);
}void HC595_WRITE_DATA(u8 cs_data1,u8 cs_data2,u8 cs_data3,u8 cs_data4) //最后两个形参表示所有列的数据,前面两个形参表示所有行的数据
{u8 i=0;for(i=0;i<8;i++)//传入第四个形参{SI=cs_data4>>7;  //因为595芯片先传高位,所以将最高位移到最低位(比如 12345678——>00000001,此处12345678这样写只为方便理解),然后给个上升沿把1传入寄存器中cs_data4<<=1;   /*这一步是将原先cs_data(比如12345678)的第二个高位(1后面的2)移到第一个高位(即变成了23455670),这一步是为了执行下一次循环的时候,将最高位移到最低位做准备,也就是SI_SER=cs_date4>>7;*/SCK=0;  //此处开始产生上升沿,先设为0,后面再设置为1,上升沿就有了,数据在 SCK 的上升沿输入存储器_nop_();  //该函数是在51单片机中用的延时函数,表示执行一条没有什么意义的指令,延时一个指令周期//delay_10us(5);SCK=1;     //此刻,最高位就输入到寄存器中了,然后下一次循环依次按照此方法传入第二个高位、第三个...._nop_();  //delay_10us(5);       }for(i=0;i<8;i++)//传入第三个形参{SI=cs_data3>>7;  cs_data3<<=1;                           SCK=0;_nop_();SCK=1;_nop_();}for(i=0;i<8;i++)//传入第二个形参{SI=cs_data2>>7;    cs_data2<<=1;                           SCK=0;_nop_();SCK=1;_nop_();}for(i=0;i<8;i++)//传入第一个形参{SI=cs_data1>>7;    cs_data1<<=1;                           SCK=0;_nop_();SCK=1;_nop_();}RCK=0;   //这里需要一个上升沿,将存储器的数据,在 RCK 的上升沿的作用下,输入到锁存器中(此时输出使能控制端/G或/OE接地)delay_10us(1);RCK=1;
}void main(void)       //主函数
{u8 i=0;                      while(1)  {for(i=0;i<16;i++)   //16行,一行一轮回,16个轮回{HC595_WRITE_DATA(gled_row[i],gled_row[i+16],~gled_col[i*2],~gled_col[i*2+1]); //传送行列选数据delay_10us(10);     //延时一段时间,等待显示稳定HC595_WRITE_DATA(0x00,0x00,0x00,0x00);   //消影    }   }
}

现象:

LED 点阵~显示图

跟上面原理一样,就懒得写了!

LED 点阵实验~点亮一个点、数字、汉字、图相关推荐

  1. 51单片机 | LED点阵实验 | 点亮一个点 | 显示数字 | 显示图像

    文章目录 一.LED点阵介绍 二.硬件设计 三.软件设计 1.LED点阵(点亮一个点) 2.LED点阵(显示数字) 3.LED点阵(显示图像) 四.实验现象 1.LED 点阵(点亮一个点) 2. LE ...

  2. 3.基础实验-实验01-点亮一个LED灯

    目录 3.1 实验01-点亮一个LED灯 3.1.1 STM32CubeMX软件配置 ​3.1.2 代码编写 3.1.3 编译与下载程序 3.1.4 查看实验结果 3.1 实验01-点亮一个LED灯 ...

  3. 51单片机学习:LED点阵实验(显示图像)

    实验名称:LED点阵实验(显示图像) 接线说明:     实验现象:下载程序后,8*8LED点阵显示心形 注意事项:LED点阵旁的J24黄色跳线帽短接到GND一端                   ...

  4. 51单片机LED点阵实验(74HC595)

    实验目的:用8*8的LED点阵显示一颗爱心. 实验仪器:普中开发板(非广告) 实验背景:出于一些原因,最近在看Arduino,但仍觉得51好玩.遂,一边看Arduino,一边整理51. 8*8的LED ...

  5. 项目二:LED点阵实验

    摘要: 本项目以AT89C52为基础,使用74HC138和74HC595控制8*8LED点阵显示拟定的内容,可以进行和静态显示和动态显示,并能够控制显示的方向,同时使用lcd1602作为辅助功能,显示 ...

  6. Arduino控制RGB三色LED灯实验、程序代码、连线图、仿真

    目录 RGB三色灯简介 PWM控制 PWM功能简介 硬件电路连接 所需器件 控制代码 测试结果 RGB三色灯简介 RGB色彩模式包含红绿蓝三种,通过控制红(R).绿(B).蓝(G)三种颜色的变化使其相 ...

  7. 51单片机STC 89C52RC进阶 – 自制8x8点阵、点亮单颗LED、显示点阵汉字

    电路及驱动原理 上图是CS1088B的8x8 LED点阵的部分技术文档截图,最下面就是这个点阵模块的基本电路图. 其实很简单,每一横行控制LED的一极,每一竖列又控制LED的另一极.又因为是一个矩阵, ...

  8. 【电子电路基础实验】LED点阵(上--硬件部分)

    文章目录 背景 主题活动 一. 74HC595和LED点阵之间的电气与数字接口 电气接口 数字接口 记录一段旅程–使用74HC595串转并8位移位寄存器来控制LED点阵. 背景 点亮了一颗led,就会 ...

  9. 点亮led灯的个数_16个LED灯循环点亮的小程序(代码)

    今天又小伙伴又来考我了.问我16个LED灯循环点亮怎么变成.我也动了下手,将手里的8个LED灯循环点亮的小程序进行了修改,就完成了16个LED灯循环点亮的小实验.那么下面给大家分享下吧! 其实16个L ...

  10. 51单片机实现c语言字母滚动,基于51单片机的led点阵滚动显示上下左右c语言程序.docx...

    *********** * * *LED点阵实验(左右上下流动显示) ***************************************************************** ...

最新文章

  1. 将二维数组保存为.csv格式
  2. 13款经典JavaScript图形和图表绘制工具
  3. c++ map 修改value_干货 | 名企高频考点如何使用map统计字符串各个字符出现的次数...
  4. .net core 使用redis 基于 StackExchange.Redis
  5. Educational Codeforces Round 81 (Rated for Div. 2) C. Obtain The String 序列自动机
  6. Apache Flink,流计算?不仅仅是流计算!
  7. Spring Cloud微服务之Hystrix服务熔断(十二)
  8. java 反射 接口工具类_Java 反射工具类 ReflectionUtils
  9. 顺德职业技术学院计算机专业录取线,顺德职业技术学院录取分数线2021是多少分(附历年录取分数线)...
  10. java堆栈_Java堆栈– Java堆栈
  11. nexus的下载与安装和启动
  12. 简单学习Infopath
  13. JAVA常见异常之NullPointerException 空指针异常
  14. 自回归滑动平均(ARMA)模型
  15. TestFlight iOS 平台 App内测 工具使用
  16. java安卓模拟器和电脑通信_android模拟器与PC的端口映射
  17. linux C-kermit 安装使用
  18. 人生于世上有几个知己,多少友谊能长存
  19. JavaScript判断浏览器版本
  20. Ubuntu系统进行复制粘贴文件显示没有权限的解决办法

热门文章

  1. dataframe按照拼音排序
  2. mysql 游戏背包_01背包问题(完全背包,部分背包)golang实现
  3. Python-百度经纬度转高德经纬度
  4. [论文阅读笔记47]ZEN-BERT-based Chinese (Z) text encoder Enhanced by N-gram representations
  5. Linux服务器CPU飙升排查
  6. 计算机公共课3-字处理软件Word 2010
  7. round函数几位小数c语言,Excel中利用round函数保留两位小数实例详解
  8. 微信小程序账号注册和APPID申请
  9. java审批工作流,值得一读!
  10. Stable Diffusion半秒出图;VLIW的前世今生;YOLOv5全面解析教程 | AI系统前沿动态