(1)实验平台:
普中 51-Ai8051 开发板
https://item.taobao.com/item.htm?abbucket=17&id=1026052331067(2)资料下载 :普中科技-各型号产品资料下载链接
LED 点阵屏广泛应用于各种公共场合, 如电子广告牌、 时钟、 计数器、 车站、码头、 机场、 商场等地方。 它不仅能够提供清晰的视觉信息, 还能提升场所的档次和吸引力。 本章我们实现在 8*8LED 点阵屏上显示字符 0。 本章分为如下几部分内容:
[12.1 实验介绍](#12.1 实验介绍)
[12.1.1 实验简介](#12.1.1 实验简介)
[12.1.1.1 LED 点阵屏动态扫描原理](#12.1.1.1 LED 点阵屏动态扫描原理)
[12.1.1.2 字符汉字显示原理](#12.1.1.2 字符汉字显示原理)
[12.1.2 实验目的](#12.1.2 实验目的)
[12.2 硬件设计](#12.2 硬件设计)
[12.3 软件设计](#12.3 软件设计)
[12.3.1 创建和配置工程](#12.3.1 创建和配置工程)
[12.3.1.1 GPIO 配置](#12.3.1.1 GPIO 配置)
[12.3.1.2 生成工程](#12.3.1.2 生成工程)
[12.3.2 添加用户驱动代码](#12.3.2 添加用户驱动代码)
[12.3.2.1 main.c 文件](#12.3.2.1 main.c 文件)
[12.4 实验现象](#12.4 实验现象)
12.1 实验介绍
12.1.1 实验简介
12.1.1.1 LED 点阵屏动态扫描原理
行列划分: 整个 LED 点阵屏被划分为若干行和列, 每个 LED 灯与行和列的交汇处连接。
行选通: 驱动 IC 按照一定的顺序, 逐个选通 LED 像素所在的行。 例如, 在逐行动态扫描中, 首先选通第一行的像素, 然后迅速切换到下一行, 以此类推。
列数据发送: 在行被选通的同时, 向各列送出表示图形或文字信息的脉冲信号。 这些信号决定了该行中每个 LED 灯的亮灭状态。
时间分片: 每个被选通的行只保持短暂的时间, 然后快速切换到下一个行。这个过程非常迅速, 通常在肉眼无法察觉的范围内完成, 使得所有像素看起来都是同时亮起的。
刷新率: 扫描速度非常快, 通常达到 60Hz 或以上的刷新率, 以避免肉眼可见的闪烁。
12.1.1.2 字符汉字显示原理
要在 LED 点阵屏上显示字符 0, 可将对应位置的 LED 灯点亮, 其余熄灭, 这样就能得到每列扫描时, 对应行显示的数据, 如下图所示:

cpp
u8 gled_row[8]={0x00,0x7C,0x82,0x82,0x82,0x7C,0x00,0x00};//LED 点阵显示数字 0 的行数据
u8 gled_col[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//LED 点阵显示数字 0 的列数据
数组 gled_col 存放的是从左到右每列扫描时对应的列数据。
数组 gled_row 存放的是从左到右每列扫描时对应的行数据。
为了方便更改所显示的内容, 可借助 PCtoLCD2002.exe 取模软件(资料目录"\5--开发工具\3-常用辅助开发软件\PCtoLCD2002 完美版\PCtoLCD2002.exe" ) , 操作如下所示:




12.1.2 实验目的
在 LED 点阵屏上显示字符 0。
12.2 硬件设计
本实验使用到硬件资源如下:
(1) GPIO
(2) LED 点阵模块
相关电路在前面章节已经介绍过, 此处省略。
12.3 软件设计
12.3.1 创建和配置工程
按照前面章节内容创建一份新工程, 并命名为 08-leddz_char, 如下图所示:

12.3.1.1 GPIO 配置
使能端口和时钟, LED 点阵对应 IO 设置为推挽输出模式, 使能上拉电阻; 如下图所示:


12.3.1.2 生成工程
配置完成后, 按下代码生成按钮, 自动创建工程, 系统开始生成初始化代码。生成工程文件目录如下图所示:

在工程文件夹内新建一个 APP 文件夹, 用于存储用户编写的外设驱动, 方便后期工程管理和程序移植。 在 APP 文件夹下新建 leddz 文件夹, 并在该文件夹内新建 leddz.c 和 leddz.h 文件, 用于保存点阵相关驱动。 可直接从前面工程内复制即可。 如下所示:

然后在导出的工程中添加 APP 组, 并将 leddz.导入到工程组内, 最后添加头文件路径, 否则编译将报错。 如下:


添加完以后, 如下图所示:

12.3.2 添加用户驱动代码
leddz.c 和 leddz.h 文件内容不变, 可参照点亮一个点代码。
12.3.2.1 main.c 文件
cpp
//<<AICUBE_USER_HEADER_REMARK_BEGIN>>
/* 深圳市普中科技有限公司(PRECHIN 普中)
* 在线视频:https://space.bilibili.com/2146492485/video
官网:www.prechin.cn
* 实验名称:LED点阵实验(显示字符)
*
* 接线说明:参考电路图
*
* 实验现象:程序下载成功后,LED点阵显示数字0
*
* 注意事项:GND和OE短接
*
*/
//<<AICUBE_USER_HEADER_REMARK_END>>
#include "config.h" //默认已包含stdio.h、intrins.h、ai_usb.h等头文件
//<<AICUBE_USER_INCLUDE_BEGIN>>
// 在此添加用户头文件包含
#include "leddz.h"
//<<AICUBE_USER_INCLUDE_END>>
//<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
// 在此添加用户全局变量定义、用户宏定义以及函数声明
u8 gled_row[8]={0x00,0x7C,0x82,0x82,0x82,0x7C,0x00,0x00};//LED点阵显示数字0的行数据
u8 gled_col[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//LED点阵显示数字0的列数据
//<<AICUBE_USER_GLOBAL_DEFINE_END>>
////////////////////////////////////////
// 项目主函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void main(void)
{
//<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
// 在此添加用户主函数初始化代码
u8 j=0;
//<<AICUBE_USER_MAIN_INITIAL_END>>
SYS_Init();
//<<AICUBE_USER_MAIN_CODE_BEGIN>>
// 在此添加主函数中运行一次的用户代码
//<<AICUBE_USER_MAIN_CODE_END>>
while (1)
{
//<<AICUBE_USER_MAIN_LOOP_BEGIN>>
// 在此添加主函数中用户主循环代码
for(j=0;j<8;j++)//循环8次扫描8行、列
{
LEDDZ_COL_Write_Data(gled_col[j]);//传送列选数据
LEDDZ_Row_Write_data(gled_row[j]);//传送行选数据
delay_ms(1);//延时一段时间,等待显示稳定
LEDDZ_Row_Write_data(0x00);//消影
}
//<<AICUBE_USER_MAIN_LOOP_END>>
}
}
主函数实现功能主要初始化系统时钟及相应外设端口, while 循环内通过 for循环 8 次, 对 8*8LED 点阵进行动态扫描, 每列扫描时写入对应行的数据。
12.4 实验现象
将程序编译下载到目标板运行, 实验现象: LED 点阵屏上显示字符 0。 如下所示:
