源码:
链接:https://pan.baidu.com/s/1GKx_--HKnGsFwelTLNylHA?pwd=qiqx
提取码:qiqx
前言:
最近学完江协科技-51单片机入门教程,恰逢母亲节。就想利用刚学完的知识做点有意思的小东西,其中点阵屏无疑是51单片机很不错的显示模块之一,于是就有了这篇文章。
刚入门单片机的同学,在学完LED点阵屏之后,都可以尝试做一些自己感觉有意思的动画。
单片机型号:STC89C52RC
在线点阵字生成器:点击跳转
演示视频:点击跳转
源码:
逻辑图:
Delay.c:
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
Delay.h:
#ifndef __DELAY_H__
#define __DELAY_H__
void Delay(unsigned int xms);
#endif
main.c:
#include <REGX52.H>
#include "Delay.h"
#include "MatrixLED.h"
//加个code,放在flash里面,不占RAM的内存空间
//加了code后数组在后面不能更改
unsigned char code Animation1[] =
{
0xA4, 0x7F, 0x21, 0xF3, 0x9C, 0x9F, 0xF1, 0x01,
0x00, 0x04, 0x44, 0x4F, 0xF9, 0x65, 0x69, 0x23,
0x00, 0x7A, 0x1C, 0x02, 0xB8, 0x8A, 0xED, 0x0E,
0x00, 0x40, 0xE0, 0x5F, 0x50, 0xE2, 0x5C, 0x00,
0x00, 0x7F, 0x49, 0x49, 0x49, 0x7F, 0x00, 0x00,
0x10, 0xFF, 0x20, 0x4B, 0xFE, 0x48, 0x7E, 0x0B,
0x00, 0x32, 0x4C, 0x09, 0x7F, 0x88, 0x8A, 0x01,
0x00, 0x7A, 0x7A, 0x00
};
unsigned char code Animation2[] =
{
0x00, 0x18, 0x3C, 0x1E, 0x1E, 0x3C, 0x18, 0x00,
0x38, 0x7C, 0x7E, 0x3F, 0x3F, 0x7E, 0x7C, 0x38,
0x00, 0x18, 0x3C, 0x1E, 0x1E, 0x3C, 0x18, 0x00,
0x38, 0x7C, 0x7E, 0x3F, 0x3F, 0x7E, 0x7C, 0x38,
0x00, 0x18, 0x3C, 0x1E, 0x1E, 0x3C, 0x18, 0x00,
};
unsigned char code Animation3[] =
{
0x00, 0x41, 0x41, 0x7F, 0x7F, 0x41, 0x41, 0x00,
0x38, 0x7C, 0x7E, 0x3F, 0x3F, 0x7E, 0x7C, 0x38,
0x00, 0x7C, 0x7E, 0x03, 0x03, 0x7E, 0x7C, 0x00
};
unsigned char code Animation4[] =
{
0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00,
0x00, 0x00, 0x40, 0x20, 0x20, 0x40, 0x00, 0x00,
0x00, 0x40, 0x40, 0x20, 0x20, 0x40, 0x40, 0x00,
0x20, 0x40, 0x40, 0x20, 0x20, 0x40, 0x40, 0x20,
0x30, 0x40, 0x40, 0x20, 0x20, 0x40, 0x40, 0x30,
0x38, 0x40, 0x40, 0x20, 0x20, 0x40, 0x40, 0x38,
0x38, 0x44, 0x40, 0x20, 0x20, 0x40, 0x44, 0x38,
0x38, 0x44, 0x42, 0x20, 0x20, 0x42, 0x44, 0x38,
0x38, 0x44, 0x42, 0x21, 0x21, 0x42, 0x44, 0x38,
0x38, 0x44, 0x42, 0x23, 0x23, 0x42, 0x44, 0x38,
0x38, 0x44, 0x46, 0x27, 0x27, 0x46, 0x44, 0x38,
0x38, 0x4C, 0x4E, 0x2F, 0x2F, 0x4E, 0x4C, 0x38,
0x38, 0x5C, 0x5E, 0x3F, 0x3F, 0x5E, 0x5C, 0x38,
0x38, 0x7C, 0x7E, 0x3F, 0x3F, 0x7E, 0x7C, 0x38,
0x70, 0xF8, 0xFC, 0x7E, 0x7E, 0xFC, 0xF8, 0x70,
0x38, 0x7C, 0x7E, 0x3F, 0x3F, 0x7E, 0x7C, 0x38,
0x70, 0xF8, 0xFC, 0x7E, 0x7E, 0xFC, 0xF8, 0x70,
0x38, 0x7C, 0x7E, 0x3F, 0x3F, 0x7E, 0x7C, 0x38,
0x70, 0xF8, 0xFC, 0x7E, 0x7E, 0xFC, 0xF8, 0x70,
0x38, 0x7C, 0x7E, 0x3F, 0x3F, 0x7E, 0x7C, 0x38,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
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;
MatrixLED_Init();
//祝老妈节日快乐!
while (1)
{
for (i = 0; i < 8; i++)
{
MatrixLED_ShowColumn(i, Animation1[i + offset]);
}
Count++;
if (Count > 15) //相当于隔多少时间变
{
Count = 0;
offset++;//偏移量,
if (offset > 60)
{
break;
}
}
}
offset = 0;
//爱心跳动
while (1)
{
for (i = 0; i < 8; i++)
{
MatrixLED_ShowColumn(i, Animation2[i + offset]);
}
Count++;
if (Count > 50) //相当于隔多少时间变
{
Count = 0;
offset += 8; //偏移量,
if (offset > 40)
{
break;
}
}
}
offset = 0;
//I ❤️ U
while (1)
{
for (i = 0; i < 8; i++)
{
MatrixLED_ShowColumn(i, Animation3[i + offset]);
}
Count++;
if (Count > 10) //相当于隔多少时间变
{
Count = 0;
offset++;//偏移量,
if (offset > 24)
{
break;
}
}
}
offset = 0;
//爱心填充
while (1)
{
for (i = 0; i < 8; i++)
{
MatrixLED_ShowColumn(i, Animation4[i + offset]);
}
Count++;
if (Count > 10) //相当于隔多少时间变
{
Count = 0;
offset += 8; //偏移量,
if (offset > 176)
{
break;
}
}
}
offset = 0;
}
MatrixLED.c:
#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;
}
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;
}
MatrixLED.h:
#ifndef __MATRIXLED_H__
#define __MATRIXLED_H__
void MatrixLED_ShowColumn(unsigned char Column,Data);
void MatrixLED_Init();
#endif
结束语:
祝老妈母亲节节快乐!天天开心,永远年轻,漂亮!