第7章:硬件适配层应用——显示屏
本章导读
前面几章,我们看到信息的方式是"灯亮/灯灭"(LED)和"串口打印"(要接电脑)。这一章的显示屏,是板子自己的"脸"——直接在开发板上显示字符和数据,脱机就能看结果。
本章先对照原理图认识 GEC2530 底板的 LCD 电路,再讲 HAL 提供的 LCD API 和驱动移植方法。
一、先看电路:GEC2530 底板的 LCD(对照原理图)
① 板载 LCD 主控(Sheet 4)
打开原理图 Sheet 4,中间是 LCD 接口电路,核心器件为 U5(LCD_LM6059BCW):
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 可调) → 对比度调节 │
└──────────────────────────────────┘关键点:
- LCD 控制信号共 5 根:片选 L_CS1、复位 L_RESET、数据/命令选择 L_RS、时钟 L_CLK/DB6、数据 L_SDA/DB7——这是典型的 SPI 式串行控制(部分型号也支持并行,用跳线选择);
- R17 可调电阻用来调 LCD 对比度(显示发白/发黑就调它);
- 显示数据走的 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 |
| RESET | RESET | — |
"跳线帽选通"是什么意思? 插座上同一根引脚可能同时连了 LCD 信号和其他外设(比如 P1_2 既到 LCD 片选、又到按键 S5)。插上跳线帽 → LCD 信号接通,该引脚归 LCD 用;拔掉 → LCD 断开,引脚给其他外设用。用 LCD 前先确认跳线帽插对了位置。
③ 背光控制(Sheet 4)
背光不是直接常亮的,由 GPIO 控制开关:
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更新" 文件夹,里面有移植好的显示屏驱动:

操作方法:把 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,把对应驱动文件添加进去:

驱动文件分工:
| 组 | 内容 | 作用 |
|---|---|---|
| Common | cc2530_ioctl.h、hal_delay.c/h | 延时函数、通用 IO 配置 |
| HW_LCD | Font/(字库)、HAL_OLED/(OLED 驱动)、HAL_TFT/(TFT 驱动)、hal_lcd_spi.c/h | 字库 + 屏幕驱动 + SPI 适配 |
| SPI | hw_spi.c/h、sw_spi.c/h、spi_common.h | 通用 SPI 驱动(硬件/软件 SPI) |
HW_LCD 内部结构(字库 + 驱动):

第 3 步:添加头文件路径到工程
在 IAR 工程 Options → C/C++ Compiler → Preprocessor → Additional include directories 中添加驱动路径:
$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() —— 显示字符串
void HalLcdWriteString ( char *str, uint8 option );| 参数 | 含义 |
|---|---|
str | 待显示的字符串 |
option | 显示在哪一行:HAL_LCD_LINE_1 ~ HAL_LCD_LINE_4 |
在第一行显示 "Hello World!":
HalLcdWriteString( "Hello World!", HAL_LCD_LINE_1 );② HalLcdWriteValue() —— 显示数值
void HalLcdWriteValue ( uint32 value, const uint8 radix, uint8 option );| 参数 | 含义 |
|---|---|
value | 待显示的数值 |
radix | 进制(10 = 十进制,16 = 十六进制) |
option | 显示在哪一行 |
在第一行用十进制显示变量 val:
uint8 val = 100;
HalLcdWriteValue( val, 10, HAL_LCD_LINE_1 );四、启用 LCD 功能:宏定义
使用 LCD 前,需要在工程 Options → C/C++ Compiler → Preprocessor → Defined symbols 中添加宏:
① 使用 0.96 寸 OLED 屏:
HAL_LCD=TRUE
HAL_LCD_OLED12864② 使用 0.96 寸 TFT 屏:
HAL_LCD=TRUE
如果没有定义
HAL_LCD_OLED12864,则使用 TFT 屏幕(二选一)。
五、调试仿真
- Rebuild All 编译整个工程(确保 errors 0);
- 烧录到 GEC2530 开发板并全速运行;
- 观察屏幕:显示了 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 开发板底板原理图核对;原站链接