STC89C52单片机矩阵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);
}
}