当前位置: 首页 > article >正文

STC89C52单片机学习——第22节: LED点阵屏显示图形动画

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做!

本文写于:2025.03.16

51单片机学习——第22节: LED点阵屏显示图形&动画

  • 前言
  • 开发板说明
  • 引用
  • 解答和科普
  • 一、LED显示动画(取帧)
  • 二、LED动画(流水)
  • 问题
  • 总结

前言

   本次笔记是用来记录我的学习过程,同时把我需要的困难和思考记下来,有助于我的学习,同时也作为一种习惯,可以督促我学习,是一个激励自己的过程,让我们开始51单片机的学习之路。
   欢迎大家给我提意见,能给我的嵌入式之旅提供方向和路线,现在作为小白,我就先学习51单片机了,就跟着B站上的江协科技开始学习了.
   在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容,因为我之前有一个开发板,我大概率会用我的板子模仿着来做.让我们一起加油!
   另外为了增强我的学习效果:每次笔记把我不知道或者问题在后面提出来,再下一篇开头作为解答!

开发板说明

   本人采用的是慧净的开发板,因为这个板子是我N年前就买的板子,索性就拿来用了。不再另外购买视频中的普中开发板了。
   原理图如下
在这里插入图片描述
视频中的都用这个开发板来实现,如果有资源就利用起来。
仔细看了看:开发板的晶振为:11.0592Mhz;12Mhz晶振是用来给CH340G芯片外置晶振;

下图是实物图
在这里插入图片描述

引用

51单片机入门教程-2020版 程序全程纯手打 从零开始入门
还参考了下图中的书籍:
手把手教你学51单片机(C语言版)
在这里插入图片描述
STC89C52手册
在这里插入图片描述

解答和科普

一、LED显示动画(取帧)

在这里插入图片描述
原理:
就是要把你展示的画面逐帧的放入进数组中,让他循环8次取的一帧的画面,然后延迟一下,然后再展示下一帧动画,这样就动起来了。如本次实验用来3帧,分别为M\、U、P,然后还做了越界判断。这是一些细节。
1.1江协科技

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

//动画数据
unsigned char code Animation[]={
	0x3C,0x42,0xA9,0x85,0x85,0xA9,0x42,0x3C,
	0x3C,0x42,0xA1,0x85,0x85,0xA1,0x42,0x3C,
	0x3C,0x42,0xA5,0x89,0x89,0xA5,0x42,0x3C,
};

void main()
{
	unsigned char i,Offset=0,Count=0;
	MatrixLED_Init();
	while(1)
	{
		for(i=0;i<8;i++)	//循环8次,显示8列数据
		{
			MatrixLED_ShowColumn(i,Animation[i+Offset]);
		}
		Count++;			//计次延时
		if(Count>15)
		{
			Count=0;
			Offset+=8;		//偏移+8,切换下一帧画面
			if(Offset>16)
			{
				Offset=0;
			}
		}
	}
}

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

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

#define MATRIX_LED_PORT		P0

/**
  * @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  LED点阵屏显示一列数据
  * @param  Column 要选择的列,范围:0~7,0在最左边
  * @param  Data 选择列显示的数据,高位在上,1为亮,0为灭
  * @retval 无
  */
void MatrixLED_ShowColumn(unsigned char Column,Data)
{
	_74HC595_WriteByte(Data);
	MATRIX_LED_PORT=~(0x80>>Column);
	Delay(1);
	MATRIX_LED_PORT=0xFF;
}

#ifndef __MATRIX_LED_H__
#define __MATRIX_LED_H__

void MatrixLED_Init();
void MatrixLED_ShowColumn(unsigned char Column,Data);


#endif

1.2 慧净开发板

#include <REGX52.H>
#include <INTRINS.H>


sbit  	wei= P2^1;
sbit	duan=P2^0;
sbit	dianzhen=P2^2;
sbit LCDEN=P2^5;

unsigned char  code Animation[]={
	0xFF,0x11,0x55,0x6D,0x7D,0x7D,0x7D,0x7D,
	0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x83,0xFF,
	0x07,0x7B,0x7B,0x7B,0x07,0x7F,0x7F,0x7F


};


void Delay(unsigned int xms)		//@11.0592MHz
{
	
	while(xms--)
	{
	unsigned char i, j;


	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
	}
}
	

void MatrixLED_ShowColumn(unsigned char Column,Data)
{
	duan=1;
	P0=(0x80>>Column);
	duan=0;
	dianzhen=1;
	P0=Data;
	

	Delay(1);
	dianzhen=0;
	duan=1;
	P0=0x00;
	duan=0;
	


}

void main()
{
	unsigned char i,Offset=0,Count=0;
	LCDEN=0;
	
	wei=1;
	P0=0xff;
	wei=0;
	dianzhen=0;
	

	while(1)
	{
		for(i=0;i<8;i++)
		{
		MatrixLED_ShowColumn(i,Animation[i+Offset]);
		}
		Count++;		//计次延时
		if(Count>50)
		{
		Count=0;
		Offset+=8;//偏移+1,切换下一帧画面
			if(Offset>16)
			{
			Offset=0;
			}
		}
		
	
	}

}

实验现象:

LED点阵屏显示动画逐帧

二、LED动画(流水)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
注意取模的方式,最好先用88的动画来看看是不是和开发板的选取模式相对应,我在这上面走了不少坑,昨天晚上调试了一晚上,可以选择88的看看选的数据对不对验证一下。

#include <REGX52.H>
#include <INTRINS.H>


sbit  	wei= P2^1;
sbit	duan=P2^0;
sbit	dianzhen=P2^2;
sbit LCDEN=P2^5;

unsigned char  code Animation[]={
	0x3C,0x5A,0x66,0x7E,0x7E,0x7E,0xFF,0x7E,
	0x7E,0x7E,0x7E,0x7E,0x81,0xFF,0x03,0x7B,
	0x7B,0x03,0x7F,0x7F,0x7F,0x7F,0x83,0x7F,
	0x7F,0x01,0x7D,0x7D,0x7D,0x83,0xFF,0xFF
};


void Delay(unsigned int xms)		//@11.0592MHz
{
	
	while(xms--)
	{
	unsigned char i, j;


	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
	}
}
	

void MatrixLED_ShowColumn(unsigned char Column,Data)
{
	duan=1;
	P0=(0x80>>Column);
	duan=0;
	dianzhen=1;
	P0=Data;
	

	Delay(1);
	dianzhen=0;
	duan=1;
	P0=0x00;
	duan=0;
	


}

void main()
{
	unsigned char i,Offset=0,Count=0;
	LCDEN=0;
	
	wei=1;
	P0=0xff;
	wei=0;
	dianzhen=0;
	

	while(1)
	{
		for(i=0;i<8;i++)
		{
		MatrixLED_ShowColumn(i,Animation[i+Offset]);
		}
		Count++;		//计次延时
		if(Count>50)
		{
		Count=0;
		Offset++;//偏移+1,切换下一帧画面
			if(Offset>24)
			{
			Offset=0;
			}
		}
		
	
	}

}

实验现象:

LED点阵屏显示动画流动只移动一行

问题

1、能不能换个方向流动,目前来看我的LED点阵是往下流动,我想着是不是能做到左右移动。

总结

本节课主要学了LED点阵屏动画,动画的形成其实就是每一帧动画再加上延迟,就会形成流动的动画,我们只需要加上延迟,还有偏移量就能实现LED点阵屏来完成动画的效果。


http://www.kler.cn/a/590557.html

相关文章:

  • Spring Boot整合JWT 实现双Token机制
  • Maven核心包:maven-resolver-api
  • Netty基础—5.Netty的使用简介
  • 小程序主包方法迁移到分包-调用策略
  • HTB 学习笔记 【中/英】《前端 vs. 后端》P3
  • API接口自动化学习总结
  • 共享 IP 与独立 IP:长期邮件营销的优劣比较
  • 解决QT_Debug 调试信息不输出问题
  • 【笔记】SQL进阶教程(第二版)
  • SpringBoot3+SaToken+JWT:轻量化权限认证实战指南
  • Launcher3 Hotseat区域动态插入All Apps按钮实现方案
  • Elasticsearch搜索引擎 3(DSL)
  • 数学建模:模型求解方法
  • Windows Qt动态监测系统分辨率及缩放比变化
  • 大动作!百度发布文心大模型4.5、文心大模型X1
  • Shp文件转坐标并导出到Excel和JSON(arcMap + excel)
  • Linux-数据结构-线性表-单链表
  • 基于深度学习的风格迁移实战:从神经风格迁移到CycleGAN
  • 管家婆实用贴-如何设置打印机共享
  • 【Go语言圣经3.1】