LED点阵8*8驱动开发笔记(Ai8051U单片机)
一、开发环境与硬件基础
- 单片机型号:Ai8051U-32Bit
- 开发工具:AiCube(图形化配置)、Keil(代码编程)、PCtoLCD2002(字模生成)
- 核心外设:LED点阵8*8、移位寄存器(74HC595)

二、AiCube图形化配置
2.1 全局端口配置,开系统时钟

2.2 功能管脚配置(核心驱动管脚)

三、Keil代码编程(C语言)
工程文件结构:led_matrix.h(头文件,宏定义/函数声明)、led_matrix.c(源文件,驱动实现)、main.c(主函数,业务逻辑)
3.1 头文件:led_matrix.h
c
#ifndef __LED_MATRIX_H
#define __LED_MATRIX_H
// 头文件包含
#include "config.h"
// 移位寄存器管脚宏定义(映射AiCube配置的物理管脚)
#define SER P45 // 串行数据输入管脚
#define SRCLK P46 // 移位时钟管脚
#define RCLK P36 // 锁存时钟管脚
// LED点阵列端口宏定义
#define LED_MATRIX_COL_PORT P0
// 函数声明
void Led_Matrix_Row_Write_Data(u8 dat); // 点阵行数据写入(移位输出)
void Led_Matrix_Col_Write_Data(u8 dat); // 点阵列数据写入(端口直驱)
#endif
3.2 源文件:led_matrix.c
c
#include "led_matrix.h"
/**
* @brief LED点阵行数据写入函数(基于74HC595移位寄存器)
* @param dat: 要写入的8位行数据,每1位对应点阵1个行LED的亮灭(1-亮/0-灭,可根据硬件调整)
* @retval 无
* @note 从最高位开始逐位移位,通过SER输入、SRCLK提供移位时钟、RCLK锁存输出
*/
void Led_Matrix_Row_Write_Data(u8 dat)
{
u8 i; // 循环变量,遍历8位数据
const u8 DELAY_US = 1; // 时钟延时时间,统一定义便于修改(适配硬件时序)
// 循环8次,将8位数据逐位移入74HC595
for(i = 0; i < 8; i++)
{
SER = (dat >> 7); // 取出数据最高位,赋值给串行数据输入管脚
dat <<= 1; // 数据左移1位,将次高位变为新的最高位,准备下一次移位
// 产生移位时钟下降沿+上升沿,触发74HC595接收1位数据
SRCLK = 0;
delay_us(DELAY_US);
SRCLK = 1;
delay_us(DELAY_US);
}
// 产生锁存时钟下降沿+上升沿,将移位寄存器中暂存的8位数据锁存到输出端,更新点阵行显示
RCLK = 0;
delay_us(DELAY_US);
RCLK = 1;
delay_us(DELAY_US);
}
/**
* @brief LED点阵列数据写入函数(端口直接驱动)
* @param dat: 要写入的8位列数据,每1位对应点阵1个列LED的选通(0-选通/1-关闭,可根据硬件调整)
* @retval 无
* @note 直接通过IO口端口赋值,无需移位,适用于列控制无移位寄存器的硬件方案
*/
void Led_Matrix_Col_Write_Data(u8 dat)
{
LED_MATRIX_COL_PORT = dat; // 列数据直接写入对应控制端口
}
3.3 主函数:main.c
c
// AiCube自动包含:stdio.h、intrins.h、ai_usb.h等基础头文件
#include "config.h" // AiCube自动生成的系统配置头文件
#include "led_matrix.h" // 引入LED点阵驱动头文件
// <<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
// 此处可添加用户全局变量、宏定义、额外函数声明
// <<AICUBE_USER_GLOBAL_DEFINE_END>>
/**
* @brief 项目主函数(程序入口)
* @param 无
* @retval 无
* @note 遵循AiCube代码规范,预留用户代码段注释标记
*/
void main(void)
{
// <<AICUBE_USER_MAIN_INITIAL_BEGIN>>
// 用户初始化代码段(可添加外设、中断等初始化)
// <<AICUBE_USER_MAIN_INITIAL_END>>
SYS_Init(); // AiCube自动生成的系统初始化函数(时钟、端口等)
// <<AICUBE_USER_MAIN_CODE_BEGIN>>
// 主函数中仅运行一次的代码:初始化点阵显示(点亮左上角第一个灯)
Led_Matrix_Row_Write_Data(0x80); // 行数据0x80=1000 0000,选通第一行
Led_Matrix_Col_Write_Data(0x7f); // 列数据0x7f=0111 1111,选通第一列
// <<AICUBE_USER_MAIN_CODE_END>>
// 死循环:主程序循环体
while(1)
{
// <<AICUBE_USER_MAIN_LOOP_BEGIN>>
// 此处可添加点阵动态显示代码(如字符、动画循环)
// <<AICUBE_USER_MAIN_LOOP_END>>
}
}
四、实验现象
将程序编译后下载至Ai8051U目标板,运行后LED点阵左上角第一个灯被点亮 ,验证行、列驱动逻辑及硬件接线正常。

五、PCtoLCD2002工具使用(8*8点阵字模生成)
用于生成自定义图形/字符的8*8点阵字模,直接供Led_Matrix_Row_Write_Data函数调用,步骤如下:
5.1 新建8*8点阵BMP图像
- 点击「文件」-「新建图像」,输入尺寸:宽度8像素、高度8像素 ,点击确定。


5.2 新建8*8点阵BMP图像字模参数配置
点击「选项」-「字模选项」,按以下参数设置):


;
- 绘制完成后,点击「生成字模」,工具自动生成十六进制字模数据;
- 生成的字模格式示例:
{0x00,0x7C,0x02,0x01,0x01,0x02,0x7C,0x00},可直接赋值给行数据变量使用。
