【51单片机】LED点阵屏的纵向动画流动字幕

 小伙伴们大家好,最近学习了点阵屏,写篇blog记录一下。😁

🗣️前言:

学习完点阵屏,小伙伴们可能都想要展示一下自己的名字,而有的同学的名字太过复杂,宽为8的点阵屏无法写出,于是我便想到了纵向显示笔画过于复杂的名字。
就比如“嘉”字,横向无法写出,我们就把字体给拉长,丑是丑了点,但可以完整显示了🐶:

采用这种表示,将一整串名字自上到下进行展示,就可以把名字完整展示出来啦!💕

🤔思路:

横向流动的原理

1.要想将一长串的字幕展示出来,我们需要定义一个数组,把所有需要亮的位置显示出来。
这里要注意是纵向取模哦!

2.实现流动的效果:

纵向流动原理:

横向显示是通过列进行快速的扫描,我们需要把每一列的数据输入到点阵屏,再通过偏移量一列列的移动达到流动的效果

纵向显示的最大不同在于偏移量是向下一行行移动的,因此我们需要改变我们的扫描方式。
—->按行扫描

由下图,P0口控制列的显示,DP_口控制行的显示

P0口很容易控制,只需将数据取反,赋值即可.
难点在于DP_口的控制:根据原理图,DP_口接到了74HC595芯片上,进行了串行数据向并行数据的转换,点阵屏从74HC595的输出端得到数据.

根据上面的图,DPh控制第一行,DP口是二极管的阳极,要想第一行亮就要输入1000 0000 ,第二行亮:0100 0000 第三行0010 0000,

为了方便位的偏移,我们规定行是从0开始到7,这样我们想让哪一行亮,就可以写作Row=0x80>>Row; (Row是选中的行数),有了要显示的行数Row,

下一步就要把这个数据导入到74HC595, 由原理图,74HC595的输入是根据三个单片机的IO口进行控制的,

== 74HC595的具体原理如下: ==

先将输入的最低位放在串行的数据线SER上,给个上升沿SERCLK,数据移到最上面的格子,再给数据的次低位,给个上升沿,SER线上的数据移到第一个格子,同时刚刚存放的数据向下移,移满八个后,给个上升沿锁存,数据便从左边移到了右边.

举个简单的例子,要使点阵屏的第一行亮,DPh=1,其余全给0,即1000 0000 ,十六进制是0x80,要把1000 0000通过74HC595的输入端移到输出端,根据角标的对应关系,QH–>DPh,QG–>DPg,QF–>DPf… 应该先把高位1给到数据线SER,这样通过一位位的向下移动,1就到了最下面,锁存后QH=1,DPh=1
原理清楚后,上代码😈

代码:

MetrixLED.c

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

sbit RCK=P3^5;
sbit SCK=P3^6;
sbit SER=P3^4;

void MetrixLED_Init()
{
	RCK=0;
	SCK=0;
}

//74HC595输出要显示哪一行 Row:0~7
void _74HC595_WriteRow(unsigned char Row)
{
	unsigned char i = 0;
	Row=0x80>>Row;
	for(i=0;i<8;i++)
	{
		SER=Row&(0x80>>i);
		SCK=1;
		SCK=0;
	}
	RCK=1;
	RCK=0;
}

//Data: 1亮0灭
void MertixLED_ShowRow(unsigned char Row,Data)
{
	_74HC595_WriteRow(Row);
	P0=~Data;
	Delay(2);
	_74HC595_WriteRow(0xff);
}

MetrixLED.h

#ifndef __METRIXLED_H__
#define __METRIXLED_H__

void MetrixLED_Init();
void MertixLED_ShowRow(unsigned char Row,Data);

#endif

Delay.c

#include <REGX52.H>
#include <INTRINS.H>
void Delay(unsigned char xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms--)
	{
		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

Delay.h

#ifndef __delay_H__
#define __delay_H__
void Delay(unsigned char xms);
#endif

main.c

#include <REGX52.H>
#include "MetrixLED.h"
unsigned char code Animation[]={
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//	0xFE,0x10,0x10,0x7C,0x10,0x10,0x10,0xFF,  //你的名字 横向取模
//	0x00,0x24,0x48,0x8F,0x95,0xF4,0xA4,0xAA,
//	0xAA,0x91,0x00,0x00,0x24,0xFF,0x24,0x00,
//	0x48,0x22,0x9D,0x00,0x55,0xFF,0x77,0x22,
//	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
void main()
{
	unsigned char i,offset=0,count=0;
	MetrixLED_Init();
    while(1)
	{
		for(i=0;i<8;i++)
		{
			MertixLED_ShowRow(i,Animation[i+offset]);
		}
		count++;
		if(count>5)
		{
			count=0;
			offset++;
			if(offset>48)  //不要忘记改这里
				offset=0;
			
		}
	}
}
物联沃分享整理
物联沃-IOTWORD物联网 » 【51单片机】LED点阵屏的纵向动画流动字幕

发表评论