51单片机LED点阵屏显示流动字幕及逐帧只因你太美动画

点阵屏的介绍

LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等。LED点阵屏广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等 LED点阵屏分类     按颜色:单色、双色、全彩     按像素:8*8、16*16等(大规模的LED点阵通常由很多个小点阵拼接而成)

点阵屏内部的排列状态

 

LED点阵屏与数码管一样,有共阴和共阳两种接法,不同的接法对应的电路结构不同 LED点阵屏需要进行逐行或逐列扫描,才能使所有LED同时显示,在开发板中点阵屏对应引脚按照接法来拉高/拉低其对应电位,使其对应位置接通,从而点亮对应的LED

在这里我选择对列操作点阵屏,即对某一列中的某一些位置上的LED进行点亮

那么如何找到这些对应的LED呢,或者说如何点亮自己想要设置的LED呢

这里我介绍一种传输数据的方法:

74HC595芯片传输数据

74HC595的脚位图

14脚:DS(SER)串行数据输入引脚
13脚:OE,输出使能控制脚,它是低电才使能输出,所以接GND
12脚:RCK存储寄存器时钟输入引脚。上升沿时,数据从移位寄存器转存到存储寄存器。
11脚:SCK(移位寄存器时钟引脚,上升沿时,移位寄存器中的bit 数据整体后移,并接受新的bit(从SER输入)。
74HC595数据传输原理:串行输入,数据一位一位地移入寄存器(SER)中,随后并行输出,一起从从移位寄存器转存到存储寄存器中

74HC595的使用

使用前的初始化

在使用前需要对其进行初始化,首先是对控制移位寄存器(SCK)的引脚进行初始化,SCk在上升沿时移位寄存器中的数据才往后移,为了保证数据的第一位被移进寄存器中,SCK先置0,保证移位寄存器在启动时第一位能够进入。其次存储寄存器的输出引脚(RCK),RCK是在移动寄存器存满八位时置0即可把数据转移到存储寄存器中,保证第一次的传送成功,在初始化时RCK需要先置零再进行操作

写入数据

74HC595采用的是串行输入的方式,需要把数据一位一位地移到移动寄存器中,在这里我用for循环来模拟把八个比特位的数据依次移动到移动寄存器中

void _74HC595_WriteByte(unsigned char Byte)
{
	unsigned char i=0;
	for(i=0;i<8;i++)  //Byte是要写入移动寄存器的数据
	{         //这里用到与操作符来获取数据中的某一位
		SER=Byte&(0x80>>i);  //用SER接受对应的每一位(一位一位地挪进移位寄存器中)
		SCK=1;    //把数据取到SER内时即可把移位寄存器置1,给到上升沿数据就会在移位寄存器中移动一位
		SCK=0;    //SCK恢复下降沿,保证下一次循环的移动
	}
    RCK=1;    //循环结束后RCK置高电位即把移位寄存器内的数据并行输出到存储寄存器中
    RCK=0;    //记得把RCK置零,方便下次移动
}

点阵屏的点亮

点阵屏点亮的操作就很简单了,点亮只需要把想点亮的灯列的数据通过74HC595写入并且确定了对应的列,即可把对应的列的对应灯光点亮,这里设计一个函数把列数和数据传入进来即可把对应的灯点亮

void MatrixLED_ShowColumn(unsigned char Column,unsigned char Data)
{
	_74HC595_WriteByte(Data);  //把数据写入存储寄存器中
	P0=~(0x80>>Column);  //传入的列号通过对0x80的右移实现对P0的列数选定
    //下面是消影的操作,避免在后面的动态显示中重影过多
	Delay(1);
	P0=0xFF;
}

点阵屏的滚动显示

点阵屏需要滚动显示需要定义一个偏移量,数据存储在数组中,在每次都显示完一页的数据后,偏移量++,随即再显示数组内偏移一位后的那页数据,即实现的点阵屏的滚动显示即在循环内显示列数i(0~8)显示的数组内下标也是i,不过在滚动显示中,下标变成了[i+move],move在循环后会自增,要注意的一点是,只保留以下的数据会导致滚动显示的很快,需要再定义一个count变量控制一下速度,if(count>设定的速度阈值)count=0,move再自增

while(1)
	{
		
		for(i=0;i<8;i++){
			MatrixLED_ShowColumn(i,Matrix_Table[i+move]);  //在点阵屏中显示
		}
		count++;
		if(count>10)  //设定速度阈值
		{
			count=0;
			move++;
			move%=32; //防止数组越界,从头显示
		}
	}

点阵屏的逐帧显示

点阵屏的逐帧显示和滚动显示原理一样,逐帧显示的偏移量在显示完上一帧的图像后move+=8,即实现了逐帧显示,下面我介绍一个逐帧显示的例子(我是ikun)

代码放在最后,这里我再介绍一个辅助取模软件,可以通过画的方式生成我们想要写的数据

这篇文章也是我取模的时候找的

【51单片机系列】文字取模软件使用_c51取模软件-CSDN博客

void main()	
{
	unsigned char i=0,count=0;
	int move=0;
	unsigned char code Matrix_Table[]={
		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};
	Matrix_Init();
	while(1)
	{
		
		for(i=0;i<8;i++){
			MatrixLED_ShowColumn(i,Matrix_Table[i+move]);
		}
		count++;
		if(count>10)
		{
			count=0;
			move+=8;
			move%=280; 
		}
	}

}

感兴趣可以自己做下,你会发现一片新大陆

  • 44
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值