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点阵屏来完成动画的效果。