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},可直接赋值给行数据变量使用。
相关推荐
派大星~课堂4 小时前
【力扣-94.二叉树的中序遍历】Python笔记
笔记·python·leetcode
ZhiqianXia4 小时前
PyTorch 学习笔记(10) : PyTorch torch.library
pytorch·笔记·学习
小陈phd4 小时前
多模态大模型学习笔记(三十一)—— 基于CCT(Compact Convolutional Transformers)实现中文车牌数据集微调
笔记·学习
可乐鸡翅好好吃4 小时前
从四个 ble_evt_handler 看 Nordic BLE 架构:模块化解耦与优先级控制
单片机·嵌入式硬件
zzh0814 小时前
MySQL故障排查与优化笔记
数据库·笔记·mysql
&&Citrus5 小时前
【CPN 学习笔记(三)】—— Chap3 CPN ML 编程语言 上半部分 3.1 ~ 3.3
笔记·python·学习·cpn·petri网
南境十里·墨染春水5 小时前
linux学习进展 基础命令 vi基础命令
linux·运维·服务器·笔记·学习
Xudde.5 小时前
班级作业笔记报告0x08
笔记·学习·安全·web安全
三佛科技-187366133975 小时前
LPK8717省外围无需启动电阻,12W自供电PSR控制芯片恒压恒流方案
单片机·嵌入式硬件
迷路爸爸1805 小时前
Docker 入门学习笔记 05:卷到底是什么,为什么容器删了数据却还能保留
笔记·学习·docker