9-LED点阵屏

1.LED点阵屏介绍

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

•LED点阵屏分类

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

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

2.显示原理

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

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

•LED点阵屏需要进行逐行或逐列扫描,才能使所有LED同时显示
在这里插入图片描述
开发板引脚对应关系
在这里插入图片描述
所以在操作列时直接给P0x赋值就可以,操作列时,需要74HC595将要控制的行的数据进行输入

3.74HC595

在这里插入图片描述
•74HC595是串行输入并行输出的移位寄存器,可用3根线输入串行数据,8根线输出并行数据,多片级联后,可输出16位、24位、32位等,常用于IO口扩展。
在这里插入图片描述
1.在SER写入数据

2.通过SERCLK线,给这条线一个上升沿,数据就可以一个一个被推入移位寄存器(数据自上而下0)

3.通过RCLK锁存,给RCLK一个高电平,移位寄存器的数据就会进入到输出缓存当中

4.QH‘可以进行多片级联

此时就可以只用三根线来进行数据输出

4.C51的sfr、sbit

•sfr(special function register):特殊功能寄存器声明

例:sfr P0 = 0x80;

声明P0口寄存器的物理地址为0x80
在这里插入图片描述
•sbit(special bit):特殊位声明

例:sbit P0_1 = 0x81; 或 sbit P0_1 = P0^1;

声明P0寄存器的第1位

•可位寻址/不可位寻址:在单片机系统中,操作任意寄存器或者某一位的数据时,必须给出其物理地址,又因为一个寄存器里有8位,所以位的数量是寄存器数量的8倍,单片机无法对所有位进行编码,故每8个寄存器中,只有一个是可以位寻址的。对不可位寻址的寄存器,若要只操作其中一位而不影响其它位时,可用“&=”、“|=”、“^=”的方法进行位操作

5.程序

要先移动黄色跳帽,跳到左边两个插针,点阵屏才可以点亮

段选 位选 延时 位清零 段选 位选

通过excel 8×8点阵做示例图(也可以使用文字取模软件生成相应图案)
在这里插入图片描述

#include <STC89C5xRC.H>
#include "Delay.h"

sbit RCK=P3^5;		//RCLK
sbit SCK=P3^6;		//SRCLK
sbit SER=P3^4;		//SER

void _74HC595_WriteByte(unsigned char Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		SER=Byte&(0x80>>i);
		SCK=1;
		SCK=0;
	}
	RCK=1;
	RCK=0;
}

void MatrixLED_ShowColumn(unsigned char Column,Data)
{
	_74HC595_WriteByte(Data);		//段选(行)
	P0=~(0x80>>Column);				//位选(列)
	Delay(1);						//延时
	P0=0xFF;						//“清零”
}
void main()
{
	SCK=0;
	RCK=0;
	while(1)
	{
		MatrixLED_ShowColumn(0,0x78);
		MatrixLED_ShowColumn(1,0x84);
		MatrixLED_ShowColumn(2,0x82);
		MatrixLED_ShowColumn(3,0x41);
		MatrixLED_ShowColumn(4,0x41);
		MatrixLED_ShowColumn(5,0x82);
		MatrixLED_ShowColumn(6,0x84);
		MatrixLED_ShowColumn(7,0x78);
	}
}

流动显示:Hello!

思路:一列一列往后偏移进行显示(每一列偏移之间隔一段时间)

main.c

#include <STC89C5xRC.H>
#include "Delay.h"
#include "MatrixLED.h"

unsigned char Animation[]={
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0xFF,0x10,0x10,0x10,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
};
void main()
{
	unsigned char i=0,offset=0,count=0;
	MatrixLED_Init();
	while(1)
	{
		for(i=0;i<8;i++)
		{
			MatrixLED_ShowColumn(i,Animation[i+offset]);
		}
		count++;//通过count来进行延时
		if(count>15)//扫描15次后往后偏移
		{
			count=0;
			offset++;
			if(offset>40)
			{
				offset=0;
			}
		}
	}
}

MatrixLED.c

#include <STC89C5xRC.H>
#include "Delay.h"
#define MATRIX_LED_PORT  P0

sbit RCK=P3^5;		//RCLK
sbit SCK=P3^6;		//SRCLK
sbit SER=P3^4;		//SER

/**
  * @brief  74HC595写入一个字节
  * @param  Byte:要写入的字节
  * @retval 无
  */
void _74HC595_WriteByte(unsigned char Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		SER=Byte&(0x80>>i);
		SCK=1;
		SCK=0;
	}
	RCK=1;
	RCK=0;
}
/**
  * @brief  点阵屏初始化
  * @param  无
  * @retval 无
  */
void MatrixLED_Init()
{
	SCK=0;
	RCK=0;
}

/**
  * @brief  点阵屏显示一列数据
  * @param  Column,要选择的列,范围:0~7,0在最左边
  * @param  Data,要选择的行,0x80代表最上面第一行,1为亮,0为灭
  * @retval 无
  */
void MatrixLED_ShowColumn(unsigned char Column,Data)
{
	_74HC595_WriteByte(Data);						//段选(行)
	MATRIX_LED_PORT=~(0x80>>Column);				//位选(列)
	Delay(1);										//延时
	MATRIX_LED_PORT=0xFF;							//“清零”
}

MatrixLED.h

#ifndef __MATRIXLED_H__
#define __MATRIXLED_H__

void MatrixLED_ShowColumn(unsigned char Column,Data);
void MatrixLED_Init();
#endif
6.逐帧动画显示

思路:修改每次的偏移量为8,就可以实现每次显示逐帧的效果

放在flash内存当中的数据不允许更改

代码:一个真正的man

#include <STC89C5xRC.H>
#include "Delay.h"
#include "MatrixLED.h"

unsigned char code Animation[]={//code关键字将数据放在flash中
		0x00,0x0E,0x1B,0x7F,0x7F,0x1B,0x0E,0x00,
		0x00,0x04,0x0C,0x18,0x7F,0x7F,0x1B,0x0E,
		0x00,0x08,0x0C,0x05,0x7F,0x7F,0x1E,0x0C,
		0xC0,0x00,0x41,0x22,0x1A,0x7C,0x7D,0x1A,
		0x00,0x60,0x61,0x12,0x0A,0x7E,0x7F,0x08,
		0x00,0x06,0x0E,0x08,0x0B,0x3E,0x3E,0x0B,
		0x00,0x03,0x0B,0x08,0x0B,0x3E,0x3E,0x0B,
		0x00,0x06,0x0E,0x08,0x09,0x3F,0x3E,0x0B,
		0x00,0x0E,0x13,0x7E,0x7E,0x1F,0x0E,0x00,
		0x08,0x13,0x7E,0x7E,0x12,0x1D,0x0C,0x00,
		0x09,0x12,0x7E,0x7F,0x10,0x13,0x03,0x00,
		0x09,0x12,0x7E,0x7F,0x10,0x1C,0x0C,0x00,
		0x00,0x0C,0x15,0x7E,0x7E,0x17,0x0E,0x00,
		0x00,0x30,0x38,0x0D,0x7E,0x7F,0x1D,0x08,
		0xC0,0xC0,0x30,0x1B,0x7C,0x7F,0x08,0x00,
		0x00,0x00,0x37,0xF8,0xFA,0x34,0x00,0x00,
		0x00,0x00,0x1B,0x7C,0x7C,0x1A,0x01,0x00,
		0x00,0x00,0x09,0x1E,0x7C,0x7F,0x18,0x00,
		0x00,0x00,0x1B,0x7C,0x7C,0x1B,0x00,0x00,
		0x00,0x00,0x09,0x1E,0x7C,0x7F,0x18,0x00,
		0x00,0x00,0x1B,0x7C,0x7C,0x1B,0x00,0x00,
		0x08,0x10,0x16,0x7C,0x7F,0x10,0x08,0x00,
		0x00,0x10,0x13,0x7C,0x7E,0x18,0x00,0x00,
		0x00,0x08,0x13,0x7C,0x7F,0x10,0x10,0x00,
		0x00,0x08,0x12,0xFC,0xFD,0x3A,0x00,0x00,
		0x00,0x08,0x12,0xFC,0xFC,0x22,0x10,0x00,
		0x00,0x00,0x61,0x12,0x7C,0x7F,0x10,0x60,
		0x00,0x00,0x20,0x11,0x12,0x7C,0x7E,0x19,
		0x00,0x00,0x00,0x31,0x0A,0x7C,0x7E,0x0D,
		0x00,0x00,0x20,0x11,0x12,0x7C,0x7E,0x19,
		0x00,0x00,0x00,0x31,0x0A,0x7C,0x7E,0x0D,
		0x00,0x00,0x20,0x11,0x12,0x7C,0x7E,0x19,
		0x00,0x00,0x00,0x31,0x0A,0x7C,0x7E,0x0D,
		0x00,0x00,0x20,0x11,0x12,0x7C,0x7E,0x19,
		0x00,0x00,0x00,0x31,0x0A,0x7C,0x7E,0x0D,
};
void main()
{
	unsigned char i=0,offset=0,count=0;
	MatrixLED_Init();
	while(1)
	{
		for(i=0;i<8;i++)
		{
			MatrixLED_ShowColumn(i,Animation[i+offset]);
		}
		count++;//通过count来进行延时
		if(count>15)//扫描15次后往后偏移
		{
			count=0;
			offset+=8;
			if(offset>35*8)
			{
				offset=0;
			}
		}
	}
}

文章参考:
51单片机 点阵矩阵 坤坤代码_单片机蔡徐坤点阵代码-CSDN博客
[9-1] LED点阵屏_哔哩哔哩_bilibili

  • 16
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值