Skip to content

第7章:硬件适配层应用——显示屏 ​

本章导读

前面几章,我们看到信息的方式是"灯亮/灯灭"(LED)和"串口打印"(要接电脑)。这一章的显示屏,是板子自己的"脸"——直接在开发板上显示字符和数据,脱机就能看结果。

本章先对照原理图认识 GEC2530 底板的 LCD 电路,再讲 HAL 提供的 LCD API 和驱动移植方法。

一、先看电路:GEC2530 底板的 LCD(对照原理图) ​

① 板载 LCD 主控(Sheet 4) ​

打开原理图 Sheet 4,中间是 LCD 接口电路,核心器件为 U5(LCD_LM6059BCW):

text
                 LCD_LM6059BCW (U5)
┌──────────────────────────────────┐
│ L_CS1   ← 片选(L_CS1/BUTTON0)  │
│ L_RESET ← 复位                   │
│ L_RS    ← 数据/命令选择(L_MODE)│
│ L_CLK   ← 时钟 / DB6             │
│ L_SDA   ← 数据 / DB7             │
│ LCD_VDD ← 电源(L2 390nH 滤波)  │
│ R17(10K 可调) → 对比度调节       │
└──────────────────────────────────┘

关键点:

  1. LCD 控制信号共 5 根:片选 L_CS1、复位 L_RESET、数据/命令选择 L_RS、时钟 L_CLK/DB6、数据 L_SDA/DB7——这是典型的 SPI 式串行控制(部分型号也支持并行,用跳线选择);
  2. R17 可调电阻用来调 LCD 对比度(显示发白/发黑就调它);
  3. 显示数据走的 GPIO 复用很重:L_RS 与 P0_0(压力传感器)、L_CS1 与 P1_2(按键 S5)共用引脚,同一时刻只能选一个功能——这就是下一节"跳线帽选通"存在的意义。

② 扩展插座 J6 与跳线帽选通(Sheet 6) ​

打开原理图 Sheet 6,LCD 模块通过 J6(CONN SOCKET 20x2,40 脚插座) 连接主板,标注"跳线帽选通":

LCD 信号对应 GPIO复用的其他功能
LCD_CS / BUTTON0(L_CS1)P1_2按键 S5(REMOTI_BUTTON)
L_MODE(L_RS)P0_0压力传感器 VOUT
SCLK(L_CLK/DB6)P1_5—
MOSI(L_SDA/DB7)P1_6—
LED0 / L_BLA(背光)P0_7红外 LED0
RESETRESET—

"跳线帽选通"是什么意思? 插座上同一根引脚可能同时连了 LCD 信号和其他外设(比如 P1_2 既到 LCD 片选、又到按键 S5)。插上跳线帽 → LCD 信号接通,该引脚归 LCD 用;拔掉 → LCD 断开,引脚给其他外设用。用 LCD 前先确认跳线帽插对了位置。

③ 背光控制(Sheet 4) ​

背光不是直接常亮的,由 GPIO 控制开关:

text
P0_7(L_BLA)→ R23 10K → Q3(MMBT3904) → 控制 Q2(MMBT3904) → LCD 背光

背光"亮/灭"由 P0_7 电平决定。写程序让 LCD 显示前,先确认背光已打开(否则屏幕黑黑的,容易误以为屏坏了)。

二、显示屏驱动移植(以外部 SPI 屏为例) ​

原站配套的是 0.96 寸 OLED/TFT 外部 SPI 屏(通过 SPI:CS/RES/DC/SDA/SCL 连接),驱动以"替换 HAL"的方式移植。GEC2530 底板的板载 LCD 同样是 SPI 式控制信号,移植思路完全一致——把驱动文件放进 HAL,再配置路径和宏。

第 1 步:替换 HAL 文件夹 ​

配套工程代码中有一个 "HAL更新" 文件夹,里面有移植好的显示屏驱动:

HAL更新文件夹

操作方法:把 Z-Stack 3.0.1\Components 下的 hal 文件夹删除,用 HAL更新 里的 hal 文件夹替换过去。替换后,在 Components\hal\target\CC2530EB 下可以看到显示屏驱动程序。

第 2 步:在 IAR 工程中创建驱动组 ​

在工程 Workspace 的 HAL → Target → CC2530EB → Drivers 下创建 3 个组:Common、HW_LCD、SPI,把对应驱动文件添加进去:

创建驱动组并添加文件

驱动文件分工:

组内容作用
Commoncc2530_ioctl.h、hal_delay.c/h延时函数、通用 IO 配置
HW_LCDFont/(字库)、HAL_OLED/(OLED 驱动)、HAL_TFT/(TFT 驱动)、hal_lcd_spi.c/h字库 + 屏幕驱动 + SPI 适配
SPIhw_spi.c/h、sw_spi.c/h、spi_common.h通用 SPI 驱动(硬件/软件 SPI)

HW_LCD 内部结构(字库 + 驱动):

HW_LCD 驱动内容

第 3 步:添加头文件路径到工程 ​

在 IAR 工程 Options → C/C++ Compiler → Preprocessor → Additional include directories 中添加驱动路径:

text
$PROJ_DIR$\..\..\..\..\..\Components\hal\target\CC2530EB\Common
$PROJ_DIR$\..\..\..\..\..\Components\hal\target\CC2530EB\SPI
$PROJ_DIR$\..\..\..\..\..\Components\hal\target\CC2530EB\HW_LCD\Font
$PROJ_DIR$\..\..\..\..\..\Components\hal\target\CC2530EB\HW_LCD\HAL_LCD_SPI
$PROJ_DIR$\..\..\..\..\..\Components\hal\target\CC2530EB\HW_LCD\HAL_OLED
$PROJ_DIR$\..\..\..\..\..\Components\hal\target\CC2530EB\HW_LCD\HAL_TFT

添加头文件路径

这样编译器才能找到 hal_lcd.h 等头文件。路径写错会报 "fatal error: hal_lcd.h: No such file"。

三、HAL LCD API 简介 ​

HAL 提供了完善的显示器驱动 API,定义在 hal_lcd.h / hal_lcd.c 中。最常用的两个:

① HalLcdWriteString() —— 显示字符串 ​

c
void HalLcdWriteString ( char *str, uint8 option );
参数含义
str待显示的字符串
option显示在哪一行:HAL_LCD_LINE_1 ~ HAL_LCD_LINE_4

在第一行显示 "Hello World!":

c
HalLcdWriteString( "Hello World!", HAL_LCD_LINE_1 );

② HalLcdWriteValue() —— 显示数值 ​

c
void HalLcdWriteValue ( uint32 value, const uint8 radix, uint8 option );
参数含义
value待显示的数值
radix进制(10 = 十进制,16 = 十六进制)
option显示在哪一行

在第一行用十进制显示变量 val:

c
uint8 val = 100;
HalLcdWriteValue( val, 10, HAL_LCD_LINE_1 );

四、启用 LCD 功能:宏定义 ​

使用 LCD 前,需要在工程 Options → C/C++ Compiler → Preprocessor → Defined symbols 中添加宏:

① 使用 0.96 寸 OLED 屏:

text
HAL_LCD=TRUE
HAL_LCD_OLED12864

② 使用 0.96 寸 TFT 屏:

text
HAL_LCD=TRUE

LCD 宏定义配置

如果没有定义 HAL_LCD_OLED12864,则使用 TFT 屏幕(二选一)。

五、调试仿真 ​

  1. Rebuild All 编译整个工程(确保 errors 0);
  2. 烧录到 GEC2530 开发板并全速运行;
  3. 观察屏幕:显示了 Z-Stack 相关的调试信息(协议栈初始化、入网状态等),说明 LCD 工作正常。

注意:若屏幕不亮,先查 背光(P0_7) 是否使能;若显示花屏/发白,调 R17 对比度可调电阻。

六、小结 ​

问题答案
GEC2530 板载 LCD 是什么?LCD_LM6059BCW(U5),SPI 式控制信号
LCD 控制信号有哪些?L_CS1 / L_RESET / L_RS / L_CLK / L_SDA
引脚怎么选通?J6 插座 + 跳线帽选通(与按键/传感器共用引脚)
背光怎么控制?P0_7(L_BLA)→ 三极管开关
驱动怎么移植?替换 hal 文件夹 → 建 Common/HW_LCD/SPI 组 → 加路径
最常用两个 API?HalLcdWriteString() / HalLcdWriteValue()
怎么启用?定义 HAL_LCD=TRUE(OLED 另加 HAL_LCD_OLED12864)

一句话总结:显示屏 = "硬件上跳线帽选通引脚 + 软件上替换 HAL 驱动、配置路径和宏"。API 只要两个——写字符串 HalLcdWriteString、写数值 HalLcdWriteValue,屏幕就成了开发板的"脸"。


内容来源:紫甲 IoT《ZigBee 3.0 开发指南》第三部分·第7章,经本站整理优化以便于理解,电路部分已对照 GEC2530 开发板底板原理图核对;原站链接

aioteer · 物联网专业课程群

💬AI 伴学配置