LED点阵8*8驱动开发笔记(Ai8051U单片机)

LED点阵8*8驱动开发笔记(Ai8051U单片机)

一、开发环境与硬件基础

  1. 单片机型号:Ai8051U-32Bit
  2. 开发工具:AiCube(图形化配置)、Keil(代码编程)、PCtoLCD2002(字模生成)
  3. 核心外设: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图像

  1. 点击「文件」-「新建图像」,输入尺寸:宽度8像素、高度8像素 ,点击确定。

5.2 新建8*8点阵BMP图像字模参数配置

点击「选项」-「字模选项」,按以下参数设置):

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c828e97534c047eb801abf306e203726.png

5.3 自定义点阵并生成字模

  1. 在8*8像素编辑区,点击像素点绘制自定义图形/字符(点击点亮、再次点击熄灭);
  2. 绘制完成后,点击「生成字模」,工具自动生成十六进制字模数据;
  3. 生成的字模格式示例:{0x00,0x7C,0x02,0x01,0x01,0x02,0x7C,0x00},可直接赋值给行数据变量使用。
相关推荐
Wyawsl2 小时前
Nginx性能优化与监控笔记
笔记·nginx·性能优化
LCMICRO-133108477462 小时前
长芯微LDC64115完全P2P替代AD4115,是一款低功耗、低噪声、24位、Σ-Δ(Σ-Δ)模数转换器(ADC)
stm32·单片机·嵌入式硬件·fpga开发·硬件工程·模数转换器
xiaokangzhe2 小时前
nginx安全笔记
笔记·nginx·安全
-Springer-2 小时前
STM32 学习 —— 个人学习笔记9-1(USART串口协议 & 串口发送及接收数据)
笔记·stm32·学习
徐先生 @_@|||2 小时前
AI 大模型编程的软件开发范式:SDD(Specification-Driven Development)模式驱动开发
人工智能·驱动开发
_李小白2 小时前
【OSG学习笔记】Day 1: OpenSceneGraph(OSG)安装指南
笔记·学习
busideyang2 小时前
数据手册和参考手册区别
stm32·单片机·嵌入式硬件·嵌入式
深蓝轨迹2 小时前
吃透 Spring Boot dataSource与Starter
java·spring boot·笔记·后端