当前位置: 首页 > news >正文

第十节 点阵屏模块

一、点阵屏介绍

LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等。LED点阵屏广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等。

LED点阵屏分类

       按颜色:单色、双色、全彩

       按像素:8*8、16*16等(大规模的LED点阵通常由很多个小点阵拼接而成)

二、显示原理 

  • LED点阵屏的结构类似于数码管,只不过是数码管把每一列的像素以“8”字型排列而已
  • LED点阵屏与数码管一样,有共阴和共阳两种接法,不同的接法对应的电路结构不同
  • LED点阵屏需要进行逐行或逐列扫描,才能使所有LED同时显示

 这是 74HC595 驱动 LED 阵列 的原理图,核心是用移位寄存器扩展 IO 口,控制多盏 LED ,拆解如下:

(一)、核心器件:74HC595(移位寄存器)

1、作用:把单片机的串行数据转成并行输出,少引脚控制多LED(1个芯片可控制8路)。

2、关键引脚:

SER(14 脚):串行数据输入 → 接单片机引脚(图里是 P34 ),用来传要显示的数据。

SRCLK(11 脚):移位时钟 → 接单片机 P36 ,每来一个脉冲,SER 数据就 “移” 到内部寄存器。

RCLK(12 脚):锁存时钟 → 接单片机 P35 ,把移位好的数据 “锁” 到输出端,控制 LED 亮灭。

QA~QH(1~7 脚):并行数据输出 → 直接接 LED 负极(图里 D9~D16 ),输出高低电平控制 LED 。

OE(13 脚):输出使能 → 接 P35 ,低电平允许输出(一般接地或控使能 ,图里可能简化了)。

(二)、LED 与电阻(右侧电路)

1LED 部分(D9~D16):

共阴极设计(正极接 VCC ,负极接 74HC595 输出 ),74HC595 输出低电平时,LED 会亮(电流从 VCC → LED → 74HC595 地 )。

2、电阻(RP6RP8

1K 限流电阻,保护 LED 不被大电流烧坏(限制回路电流在安全范围 )。

(三)、控制逻辑

串行传数据:单片机通过 P34(SER)发 8 位二进制数(比如想让 D9 亮,就传00000001)。

移位锁存:

每发 1 位数据,P36(SRCLK)打一个脉冲,数据 “移” 进 74HC595 内部移位寄存器。

8 位发完后,P35(RCLK)打一个脉冲,把移位好的数据 “锁” 到 QA~QH 输出。

LED 亮灭:74HC595 输出低电平的引脚,对应的 LED 就会亮(比如 QA 输出 0 → D9 亮 )。

(四)、简单总结

        用 74HC595 把单片机 3 个引脚(P34、P35、P36 )扩展成 8 路输出,控制 8 个 LED 。

        优势:省单片机引脚,适合需要控制多个外设(比如点阵屏、LED 矩阵)的场景。

        简单说,这就是个 “串行转并行、少引脚控多设备” 的经典电路,学会它,玩点阵屏、LED 流水灯就轻松。

        74HC595是串行输入并行输出的移位寄存器,可用3根线输入串行数据,8根线输出并行数据,多片级联后,可输出16位、24位、32位等,常用于IO口扩展。 

2、开发板引脚对应关系:

        通过矩阵排列的方式,控制8*8个LED,仅需要8+8=16个I/O口,其中D0 ~ D7控制LED的阳极,P00 ~ P07控制 LED 的阴极。想让一个LED亮,必须阳极阴极连通,例如想让最左上角的 LED 亮起,则D7 = 1 && P07 = 0。

三、C51的sfr、sbit

1、sfr(特殊功能寄存器声明)

        功能sfr  “Special Function Register” 的缩写,用于声明一个特殊功能寄存器,方便程序员直接访问 51 单片机内部的特殊功能寄存器,对单片机的硬件资源进行配置和控制,比如控制 I/O 端口、定时器、串口等

        语法sfr 特殊功能寄存器名 = 地址值; 。其中,地址值是该特殊功能寄存器在单片机内部 RAM 中的字节地址,必须是 8 的整数倍(因为特殊功能寄存器在地址空间中是按字节编址的),并且要使用十六进制表示。

例如:

// 声明P0口对应的特殊功能寄存器,P0口在51单片机中的字节地址为0x80

sfr P0 = 0x80;

// 下面就可以对P0口进行操作,比如将P0口输出高电平

P0 = 0xff;

2sbitspecial bit):特殊位声明

        功能sbit 用于声明一个特殊功能寄存器中的某一位,在已经使用 sfr 声明了特殊功能寄存器的基础上,进一步对寄存器中的某一位进行单独操作,比如单独读取或设置 P0 口的某一位电平。

        语法:有三种声明方式。

        sbit 位变量名 = 特殊功能寄存器名^位序号;

        sbit 位变量名 = 字节地址^位序号;

        sbit 位变量名 = 位地址;
        其中,位序号是从 0 - 7,表示该位在寄存器中的位置 。

例如:

sfr P1 = 0x90;  // 声明P1口对应的特殊功能寄存器,地址为0x90

// 使用第一种方式声明P1口的第0位

sbit P1_0 = P1^0; 

// 单独对P1.0引脚进行操作,比如设置P1.0输出高电平

P1_0 = 1;

四、程序设计

1、点阵屏显示静态笑脸

1、Main.c 


#include <REGX52.H>
#include " MatrixLED.h "void main(){MatrixLED_Init();while(1){MatrixLED_ShowColumn(0,0x3c);MatrixLED_ShowColumn(1,0x42);MatrixLED_ShowColumn(2,0xA9);MatrixLED_ShowColumn(3,0x85);MatrixLED_ShowColumn(4,0x85);MatrixLED_ShowColumn(5,0xa9);MatrixLED_ShowColumn(6,0x42);MatrixLED_ShowColumn(7,0x3c);}
}

2、MatrixLED.c 

#include <REGX52.H>
#include "Delay.h"sbit RCK = P3^5; // RCLK
sbit SCK = P3^6;  // SRCLK
sbit SER = P3^4;  // SER
#define  MATRIX_LED_PORT  P0
/***brief 初始化点阵屏*param 无*retval 无
*/
void MatrixLED_Init()
{SCK=0;RCK=0;
}/***brief 74HC595写入的字节*param 要写入的字节*retval 无
*/
void _74HC595_WriteByte(unsigned char Byte)
{
//	  SER=Byte&0x80;  // 取高位
//		SCK = 1;    // 上升沿存入一位数据
//		SCK = 0;    // 要置一
//		SER=Byte&0x40;  // 取第二位
//		SCK = 1;    // 上升沿存入一位数据
//		SCK = 0;    // 要置一
//		...unsigned char i;for(i=0;i<8;i++){SER=Byte&(0x80>>i);SCK=1;SCK=0;}RCK=1; // 发送数据SCK=0;
}
/***brief LED点阵屏显示一列数据*param Column 要选择的列,Data要显示的数据*retval 无
*/
void MatrixLED_ShowColumn(unsigned char Column,Data)
{// 显示的数据_74HC595_WriteByte(Data);// 第几列显示数据MATRIX_LED_PORT = ~(0x80>>Column);Delay(1);MATRIX_LED_PORT=0xFF; // 清零
}

 3、MatrixLED.h

#ifndef __MATRIXLED_H__
#define __MATRIXLED_H__
void MatrixLED_Init();
void _74HC595_WriteByte(unsigned char Byte);
void MatrixLED_ShowColumn(unsigned char Column,Data);#endif

 4、Delay.h

#ifndef __DELAY_H
#define __DELAY_Hvoid Delay(unsigned int xms);#endif

5、Delay.c 

void Delay(unsigned int xms)		//@12.000MHz
{unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}
}

2、显示动态笑脸 

main.c

#include <REGX52.H>
#include "MatrixLED.h"
unsigned char code Animation[]={0x3C,0x42,0xA9,0x85,0x85,0xA9,0x42,0x3C,0x3C,0x42,0xA1,0x85,0x85,0xA1,0x42,0x3C,0x3C,0x42,0xA5,0x89,0x89,0xA5,0x42,0x3C,
};void main()
{unsigned char i,Offset=0,Count=0;MatrixLED_Init();while(1){for(i=0;i<8;i++)	{MatrixLED_ShowColumn(i,Animation[i+Offset]);}Count++;			if(Count>15){Count=0;Offset+=8;		if(Offset>16){Offset=0;}}}
}

 其他代码同上。

3、点阵屏显示动态字符

main.c

#include <REGX52.H>
#include "Delay.h"
#include "MatrixLED.h"
unsigned  char code Animation[]={
//加code相当于放在单片机的flash里面,一般数据放在单片机的RAM里面,由于flash空间大,我们一般选择放在flash里面,放在Flash里面就不可以更改了。
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0x08,0x08,0x08,0xFF,0x00,0x0E,0x15,
0x15,0x15,0x08,0x00,0x7E,0x01,0x02,0x00,
0x7E,0x01,0x02,0x00,0x0E,0x11,0x11,0x0E,
0x00,0x7D,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//上面是hello字节每一列字节表示
};//主函数的意思是首先将LED屏上前8列的数字显示出来,显示出来以后,我们定义一个count,将count计数到20,相当于将LED屏上的数字延迟20s(我们姑且将20的单位当作秒),20s以后,图片偏移量开始增加,从0移植增加到40,(为什么是40呢,我们要保证偏移量能够将数组里的除了前8位数字全部过一遍,hello字符全部显示)同时随着偏移量的增加,LED点阵屏上的动画向左移动,当移动了40列以后,offset清0,又从头开始。
void main()
{unsigned  char i,count=0;unsigned  char offset=1;//图片的偏移量void MatrixLED_Init();while(1){for(i=0;i<8;i++){MatrixLED_ShowColumn(i,Animation[i+offset]);}count++;if(count>20)//将LED屏上的数字扫描20遍,相当于延时{count=0;//扫描20次后,清0.offset++;//将LED屏上的数字向左移动if(offset>40)//当图片偏移量大于40时,偏移量清0{offset=0;}}}
}

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

 【51单片机】LED点阵屏 原理 + 使用-CSDN博客

 51单片机学习——7--8*8LED点阵显示_单片机led8*8点阵显示7-CSDN博客

http://www.dtcms.com/a/298166.html

相关文章:

  • 案例分享|告别传统PDA+便携打印机模式,快速实现高效率贴标
  • 构建未来照护力量:虚拟仿真养老实训室的技能评估新体系
  • 常见主流网格孔洞修补算法(Mesh Hole Filling)汇总
  • 【Spring WebFlux】为什么 Spring 要拥抱响应式
  • 产业聚集+顶级配套 成都国际数字影像产业园打造企业战略增长极
  • DuoPlus云手机再上新:统一配置品牌型号、代理分组与便捷搜索功能全面提升!
  • 易求职 - 求职难题全方位解决方案
  • Android 图像编辑实战指南:从基础操作到进阶效果
  • 网络协议,DHCP 协议等。
  • 14-C语言:第14天笔记
  • C++ 笔记
  • 在Word和WPS文字中添加的拼音放到文字右边
  • 二分查找----6.寻找两个正序数组的中位数
  • CIU32L051 DMA+Lwrb环形队列实现串口无阻塞性数据的收发 + 数据百分百不丢失的实现
  • docker-compose up -d 显示no configuration file provided: not found什么问题
  • SSM花店花卉管理系统—计算机毕业设计源码—27787
  • 重构 MVC:让经典架构完美适配复杂智能系统的后端业务逻辑层(内附框架示例代码)
  • 全国产化5G-A低空经济基座
  • 基础很薄弱如何规划考研
  • 【实操记录】docker hello world
  • lesson24:Python的logging模块
  • 【pybind11】 pybind11如何调用python
  • Scrapy
  • 佳能iR-ADV C5560复印机如何扫描文件到电脑
  • 微信小程序中英文切换miniprogram-i18n-plus
  • HTTP 与 SpringBoot 参数提交与接收协议方式
  • Orbbec开发---数据流与数据流操作
  • “即时零售”风起,E3+企业中台如何赋能品牌企业破局增长?
  • 单片机(STM32-ADC模数转换器)
  • 软件异常读写威胁硬盘安全:从过往案例到防护之道