51单片机学习笔记10-点阵屏

目录

[10.1 LED点阵屏简介](#10.1 LED点阵屏简介)

[10.2 74HC595模块简介](#10.2 74HC595模块简介)

[10.3 项目示例1:LED点阵显示图形](#10.3 项目示例1:LED点阵显示图形)

✅项目功能:

✅项目架构:

✅main.c主函数:

[10.3 项目示例1:LED点阵显示动画](#10.3 项目示例1:LED点阵显示动画)

✅项目功能:

✅项目架构:

✅main.c主函数:

10.1 LED点阵屏简介

10.2 74HC595模块简介

10.3 项目示例1:LED点阵显示图形

✅项目功能:

LED点阵显示屏显示静态图形

✅项目架构:

MatrixLED.c

cpp 复制代码
#include <REGX52.H>        // 51单片机寄存器定义头文件
#include "Delay.h"         // 引入延时函数,用于点阵消影和稳定显示

// 定义74HC595芯片的3个控制引脚,sbit独立位寻址
sbit RCK=P3^5;  // RCLK 寄存器时钟引脚,上升沿锁存数据到输出端
sbit SCK=P3^6;  // SRCLK 移位时钟引脚,上升沿将串行数据移入移位寄存器
sbit SER=P3^4;  // SER 串行数据输入引脚,串行数据写入引脚

/**
  * @brief  向74HC595串行移位寄存器写入一个字节数据
  * @param  Byte 要写入74HC595的8位数据
  * @retval 无
  */
void _74HC595_WriteByte(unsigned char Byte)
{
	unsigned char i;
	// 循环8次,逐位发送8位数据,高位先发
	for(i=0;i<8;i++)
	{
		SER=Byte&(0x80>>i);  // 取出Byte的每一位,赋值给串行数据引脚SER
		SCK=1;               // 移位时钟引脚置高,产生上升沿,移入当前位数据
		SCK=0;               // 移位时钟引脚置低,准备下一位移位
	}
	RCK=1;                   // 锁存时钟引脚置高,产生上升沿,将移位寄存器数据锁存到输出口
	RCK=0;                   // 锁存时钟引脚置低,完成数据锁存
}

/**
  * @brief  LED点阵屏初始化函数
  * @param  无
  * @retval 无
  */
void MatrixLED_Init()
{
	SCK=0;  // 初始化移位时钟引脚为低电平
	SER=0;  // 初始化串行数据引脚为低电平
}

/**
  * @brief  LED点阵屏显示指定一列的一行数据
  * @param  Column 要显示的列号,取值范围 0~7 (从左到右)
  * @param  Data   该列要显示的点亮数据,8位对应点阵8行的亮灭状态
  * @retval 无
  */
#define MATRIX_LED_PORT P0  // 宏定义点阵的列选端口为P0口,方便后续修改端口
void MatrixLED_ShowCloumn(unsigned char Column,Data)
{
	_74HC595_WriteByte(Data);          // 通过74HC595输出点阵行的亮灭数据
	MATRIX_LED_PORT=~(0x80>>Column);   // 选通指定列,取反后低电平有效选中对应列
	Delay(1);                          // 延时1ms,稳定显示当前列,利用视觉暂留消闪
	MATRIX_LED_PORT=0xFF;              // 清零列选端口,关闭所有列,消除点阵残影(核心消影操作)
}

MatrixLED.h

cpp 复制代码
#ifndef _MATRIXLED_H_
#define _MATRIXLED_H_

void MatrixLED_ShowCloumn(unsigned char Column,Data);
void MatrixLED_Init();
#endif

✅main.c主函数:

cpp 复制代码
#include <REGX52.H>
#include "MatrixLED.h"

void main()
{
	MatrixLED_Init();
	while(1)
	{
		MatrixLED_ShowCloumn(7,0xAA);		
	}
}

10.3 项目示例1:LED点阵显示动画

✅项目功能:

LED点阵显示屏显示动画

✅项目架构:

✅main.c主函数:

cpp 复制代码
#include <REGX52.H>        // 51单片机寄存器定义头文件
#include "MatrixLED.h"     // 引入点阵驱动头文件,包含点阵初始化和显示列的函数声明
// 定义点阵滚动动画的字模数组,code修饰:数据固化到ROM,节省单片机RAM空间
// 数组内是连续的点阵列显示数据,依次读取实现图案平滑滚动效果,共48个列数据
unsigned char code Annimation[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0x10,0x10,0x10,0xFF,0x00,0x70,0xA8,
0xA8,0xA8,0x10,0x00,0x00,0x70,0xA8,0xA8,
0xA8,0x10,0x00,0x7E,0x80,0x40,0x00,0x7E,
0x80,0x40,0x00,0x7C,0x82,0x82,0x7C,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
void main()
{
MatrixLED_Init();      // 调用点阵初始化函数,初始化74HC595和点阵引脚,准备显示
while(1)               // 死循环,持续执行点阵滚动显示逻辑
{
// 定义局部变量
unsigned char i,offset,count;
// i:遍历点阵的0~7列,用于逐列扫描显示
// offset:动画偏移量,控制读取字模数组的起始位置,实现图案滚动
// count:计数变量,用于控制滚动速度,防止滚动过快
	// 逐列扫描显示:循环点亮点阵的第0列到第7列
	for(i=0;i<8;i++)
	{
		// 核心滚动逻辑:读取字模数组中 偏移量+当前列 的数据,显示到对应列
		// offset变化 → 读取的字模起始位置变化 → 点阵图案整体滚动
		MatrixLED_ShowCloumn(i,Annimation[i+offset]);	
	}	
	
	count++;            // 计数变量自增
	if(count>10)        // 当计数到10时,执行一次偏移,控制滚动速度
	{
		count=0;        // 计数清零,重新开始计数
		offset++;       // 偏移量自增1,图案向【左】滚动一列
		if(offset>40)   // 偏移量边界判断,到滚动终点后复位
		{
			offset=0;   // 偏移量清零,图案回到初始位置,循环滚动
		}
	}
}

}
相关推荐
恶魔泡泡糖7 小时前
51单片机外部中断
c语言·单片机·嵌入式硬件·51单片机
项目題供诗9 小时前
51单片机入门(五)
单片机·嵌入式硬件·51单片机
A-code11 小时前
嵌入式UI刷新:观察者模式实战
stm32·单片机·mcu·物联网·51单片机
项目題供诗1 天前
51单片机入门(四)
单片机·嵌入式硬件·51单片机
项目題供诗1 天前
51单片机入门(三)
单片机·嵌入式硬件·51单片机
电子工程师成长日记-C511 天前
51单片机16路抢答器
单片机·嵌入式硬件·51单片机
项目題供诗2 天前
51单片机入门(二)
单片机·嵌入式硬件·51单片机
恶魔泡泡糖2 天前
51单片机步进电机
单片机·嵌入式硬件·51单片机
麦托团子3 天前
51单片机学习笔记2-LED
51单片机