小伙伴们大家好,最近学习了点阵屏,写篇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文章来源:https://www.toymoban.com/news/detail-411974.html
#ifndef __delay_H__
#define __delay_H__
void Delay(unsigned char xms);
#endif
main.c文章来源地址https://www.toymoban.com/news/detail-411974.html
#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;
}
}
}
到了这里,关于【51单片机】LED点阵屏的纵向动画流动字幕的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!