STC89C52单片机矩阵LED灯介绍以及代码示例

目录

一,LED点阵屏介绍

二,显示原理

三,74HC595以及LED点阵屏

74HC595寄存器的介绍:

74HC595寄存器的使用方法:

74HC595以及LED点阵屏原理图:

四,开发板引脚对应关系

五, 寄存器声明与位声明的方法:

六,代码示例:


一,LED点阵屏介绍

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

LED点阵屏分类

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

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

二,显示原理

LED点阵屏的结构类似于数码管,只不过是数码管把每一列的像素以“8”字型排列而已

LED点阵屏与数码管一样,有共阴和共阳两种接法,不同的接法对应的电路结构不同

LED点阵屏需要进行逐行或逐列扫描,才能使所有LED同时显示

三,74HC595以及LED点阵屏

74HC595寄存器的介绍:

之前的数码管用的是74HC138译码器,但是如果我们要输出的不是8位,而是更多的16位或者32位

那么74HC595的串行输入,并行输出就很有用。那么下面来介绍串行输入,并行输出的相关知识

一、并行输入与串行输入的输入方式不同:

1、并行输入是并行通信的一种输入方式,是指将一串数据(如八位数据)一同输入目的寄存器。

2、串口输入则是将数据排成一行,一位一位输入。

二、并行输入与串行输入的效率不同:

1、并行传输方式的效率优于串行传输方式。通俗地讲,并行传输的通路犹如一条多车道的宽阔大道,而串行传输则是仅能允许一辆汽车通过的乡间公路。以古老而又典型的标准并行口(Standard Parallel Port)和串行口(俗称COM口)为例,并行接口有8根数据线,数据传输率高。

2、串行传输方式比并行传输方式低,同样以古老而又典型的标准并行口(Standard Parallel Port)和串行口(俗称COM口)为例,串行接口只有1根数据线,数据传输速度低。

三、并行输入与串行输入的添加内容不同:

1、并行传输不需要在数据中要加入起始标志和结束标志位。

2、串行传输需要在数据中要加入起始标志和结束标志位。

74HC595寄存器的使用方法:

1,SER输入想要输入的0,1数据

2,然后配置上升沿位移SERCLK,将SER的数据移向下一位

3,重复步骤1,2等待要求的位数移满以后(8位就移8次就行,别的16位,32位依此类推)

4,配置RCLK将8位数据一次性并行输出

74HC595以及LED点阵屏原理图:

 此时看到LED矩阵屏,相当于A1~~A8的数据已经置入完成,由发光二极管的单向导通性可以知道正极已经配置王岑,即将想要放光的列(P0_0~~P0_7)置0就可发光了,同样的为了使每一列都有显示,需要对其进行扫描。

四,开发板引脚对应关系

五, 寄存器声明与位声明的方法:

sfr P0 = 0x80类似的寄存器声明一般都在头文件里面定义了,不需要我们再次定义,否则系统会报错重复定义

sbit  P0_1 = 0x81是定义P0第一个端口的物理地址,同样也是不需要我们定义的

sbit  P0_1 = P0^1是将P0的第一个端口宏定义为P0_1,也就是说以后就可以用P0_1在主函数里面表示P0的第一个端口

sfr与sbit用法通俗的来说就是:

sfr 定义特殊功能寄存器中的字节。类似于C语言中的宏定义,对选定字节地址进行模特殊功能的命名。  格式为: sfr  功能命名 = 地址(位地址的首位)

(目的是将keil与单片机中的寄存器相关联)

sbit 用于特殊功能寄存器中可以位寻的位地址。也是类似于C语言中的宏定义,对选定位地址进行默写特殊功能的命名。   格式为: sbit  命名 功能= 位地址

六,代码示例:

了解这些后就可以先在点阵版上设想出想要发光的点,然后段选,位选,延时,复位。位选是转换为十六进制数结合74H595进行的输入。

如果还想实现逐帧动画,那么要运用for循环语句,将每一帧的动画都显示出来,并停留一段时间(可以是1s或者0.5s都行)后显示下一帧动画。

要是显示动态字幕之类的,则利用的是相同的思路,只是显示一段时间后,原先显示的点阵都向左或者右移动一列,依次移动,实现效果;

下面展示的是最普通的只进行显示图像的函数(可以稍作修改变成子涵数)

#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//宏定义

void _74HC595_WriteByte(unsigned char Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		SER=Byte&(0x80>>i);//Byte为8位,SER为1位,将8位数据赋给1位时,满足非0即1的原则
		SCK=1;//串行输入
		SCK=0;
	}
	RCK=1;//并行输出
	RCK=0;
}

/**
  * @brief  LED点阵屏显示一列数据
  * @param  Column 要选择的列,范围:0~7,0在最左边
  * @param  Data 选择列显示的数据,高位在上(从高位开始置入,置入后依旧为高位,LED矩阵显示也是高位在上),1为亮,0为灭
  * @retval 无
  */
void MatrixLED_ShowColumn(unsigned char Column,Data)//段选,位选,延时,复位
{
	_74HC595_WriteByte(Data);
	MATRIX_LED_PORT=~(0x80>>Column);
//Data中1为亮,0为灭;这里自然使前面有取反符号表示0为选中,1为未选中
	Delay(1);
	MATRIX_LED_PORT=0xFF;
}

void main()
{
	SCK=0;//相当于初始化
	RCK=0;
	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);
	}
}

posted @ 2022-04-09 17:36  爱吃炸鸡的小猪  阅读(688)  评论(0编辑  收藏  举报