草庐IT

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

柠檬羊咩咩 2023-07-17 原文
 小伙伴们大家好,最近学习了点阵屏,写篇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;
			
		}
	}
}

有关【51单片机】LED点阵屏的纵向动画流动字幕的更多相关文章

  1. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  2. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  3. LVGL V8动画 - 2

    动画/*INITIALIZEANANIMATION 初始化一个动画*-----------------------*/lv_anim_ta;lv_anim_init(&a);/*MANDATORYSETTINGS 必选设置*------------------*//*Setthe"animator"function 设置“动画”功能*/lv_anim_set_exec_cb(&a,(lv_anim_exec_xcb_t)lv_obj_set_x);/*Setthe"animator"function*/lv_anim_set_var(&a,obj);/*Lengthoftheanim

  4. micropython复现经典单片机项目(二)可视化音频 频谱解析(基本搞定) - 2

    本人是音乐爱好者,从小就特别喜欢那个随着音乐跳动的方框效果,就是这个:arduino上一大把对,我忍你很久了,我就想用mpy做,全网没有,行我自己研究。果然兴趣是最好的老师,我之前有篇博客专门讲音频,有兴趣的可以回顾一下。提到可视化频谱,必然绕不开fft,大学学过这玩意,当时一心玩,老师讲的一个字都么听进去,网上教程简略扫了一下,大该就是把时域转频域的工具,我大mpy居然没有fft函数,奶奶的,先放着。音频信息如何收集?第一种傻瓜式的ADC,模拟转数字,原始粗暴,第二种,I2S库,我之前博客有讲过,数据是PCM编码。然后又去学PCM编码,一学豁然开朗,舒服,以代码为例:audio_in=I2S

  5. ruby - Carrierwave + MiniMagick - 如何将动画 GIF 压缩到第一帧? - 2

    有人知道如何使用Carrierwave+MiniMagick将动画GIF压缩到第一帧吗? 最佳答案 我认为MiniMagick有一些变化,因为我只花了三个小时试图找出为什么Andrey的代码对我不起作用。我收到以下错误:ActiveRecord::RecordInvalid(Validationfailed:ImageFailedtomanipulatewithMiniMagick,maybeitisnotanimage?OriginalError:Command("mogrify-scene/var/folders/0o/0oqN

  6. 51单片机——74HC595的应用(SPI实践) - 2

    目录SPI总线SPI总线概述 SPI总线分类SPI优点及缺点SPI接口硬件原理SPI四种工作模式 74HC595应用74HC595芯片概述74HC595封装及管脚功能74HC595工作原理 ​编辑 74HC595串行转并行点亮LED灯 程序实现  Proteus运行结构示意图SPI总线SPI总线概述 SPI(SerialPeripheralinterface):串行外围设备接口 用途:用来在微控制器与外围设备芯片之间实现数据交换 特点:高速、全双工、同步 SPI总线分类四线制全双工SPI(同时收发)MISO    主机输入/从机输出MOSI    主机输出/从机输入SCLK   串行时钟CS或

  7. 【毕业设计】基于单片机的智能温控农业大棚系统 - 物联网 stm32 - 2

    文章目录1简介2绪论2.1课题背景与目的3系统设计详细设计描述3.2硬件部分温度测量电路其他电路部分3.3软件部分主程序子系统程序温湿度程序流程键盘显示子程序3.4实现效果3.5部分相关代码4最后1简介Hi,大家好,这里是丹成学长,今天向大家介绍一个单片机项目基于单片机的智能温控农业大棚系统大家可用于课程设计或毕业设计单片机-嵌入式毕设选题大全及项目分享:https://blog.csdn.net/m0_71572576/article/details/1254090522绪论2.1课题背景与目的近年来我国的温室控制取得了长足的进步,首先在温室群控制方面,进行了初步的探索和理论研究,其次在温室

  8. AT24C04、AT24C08、AT24C16系列EEPROM芯片单片机读写驱动程序 - 2

    一、概述在之前的一篇博文中,记录了AT24C01、AT24C02芯片的读写驱动,先将之前的相关文章include一下:1.IIC驱动:4位数码管显示模块TM1637芯片C语言驱动程序2.AT24C01/AT24C02读写:AT24C01/AT24C02系列EEPROM芯片单片机读写驱动程序本文记录分享AT24C04、AT24C08、AT24C16芯片的单片机C语言读写驱动程序。二、芯片对比介绍型号容量bit容量byte页数字节/页器件寻址位可寻址器件数WordAddress位数/字节数备注AT24C044k5123216A2A149/1WordAddress使用P0位AT24C088k1024

  9. 基于51单片机、DS1302时钟模块的电子闹钟设计 - 2

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、设计原理1.DS1302介绍2.闹钟音乐播放原理二、程序设计1.DS1302.h2.ds1302.c3.music.h4.main.c三、电路图四、运行结果1.proteus仿真2.开发板实验五、总结六、附件提示:以下是本篇文章正文内容,下面案例可供参考一、设计原理1.DS1302介绍DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.0V~5.5V。该芯片采用普通32.768kHz晶振,DS1302工作时功耗很

  10. [蓝桥杯单片机]学习笔记——串口通信的基本原理与应用 - 2

    目录一、原理部分1、什么是串行通信(1)并行通信与串行通信(2)串行通信的制式(3)串行通信的主要方式  2、配置串口(1)SCON和PCON:串行口1的控制寄存器(2)SBUF:串行口数据缓冲寄存器 (3)AUXR:辅助寄存器​编辑(4)ES、PS:与串行口1中断相关的寄存器(5)波特率设置  3、串口框架编写二、程序案例一、原理部分1、什么是串行通信(1)并行通信与串行通信微控制器与外部设备的数据通信,根据连线结构和传送方式的不同,可以分为两种:并行通信和串行通信。并行通信:数据的各位同时发送与接收,每个数据位使用一条导线,这种方式传输快,但是需要多条导线进行信号传输。串行通信:数据一位一

随机推荐