01 lcd核心库应用
作者:沈园园 | 最后修改:2026-04-20
一、概述
AirLCD_1020 是合宙推出的一款RGB接口,带触摸,5寸屏,800*480 的LCD配件板,其中:
- 驱动IC:显示屏的驱动IC是:ST7265,触摸面板的驱动IC是:GT911;
- 适用于Air8101系列模组;
airui 是基于 LVGL 9.4 版本进行图形层封装的 LuatOS 核心库,把常用组件、事件管理、输入和基础视觉主题封装为更易上手的 Lua 接口,便于在支持 LuatOS 的设备和 PC 上统一开发。
建议使用airui来开发显示界面,airui demo参考:
https://gitee.com/openLuat/LuatOS/tree/master/module/Air8101/demo/ui/airui/single
二、演示功能概述
1、核心主程序模块
- main.lua - 主程序入口,负责系统初始化和任务调度
- ui_main.lua - 用户界面主控模块,管理页面切换和事件分发
2、显示页面模块
- home_page.lua - 主页模块,提供应用入口和导航功能
- lcd_page.lua - LCD图形绘制演示模块
- customer_font_page.lua - 自定义字体演示模块(目前仅预留相关页面,未有实际功能演示)
3、驱动模块
-
lcd_drv.lua - LCD显示驱动模块,基于lcd核心库,lcd_drv和exlcd_drv二选一使用
-
exlcd_drv.lua - LCD显示驱动模块,基于exlcd扩展库,lcd_drv和exlcd_drv二选一使用
-
tp_drv.lua - 触摸驱动模块,基于tp核心库,tp_drv和extp_drv二选一使用
-
extp_drv.lua - 触摸驱动模块,基于extp扩展库,tp_drv和extp_drv二选一使用
-
customer_font_drv.lua - 自定义外部字体驱动功能模块(开发中)
-
hzfont_drv.lua - 合宙软件矢量字库(开发中)
customer_font_drv、hzfont_drv
可以都不启用
可以仅启用一种
可以启用任意两种
可以全部启用
三、触摸消息介绍
"BASE_TOUCH_EVENT" - 基础触摸事件消息,包含触摸坐标和事件类型
- tp触摸库事件类型:
tp.EVENT_DOWN(按下)、tp.EVENT_MOVE(移动)、tp.EVENT_UP(抬起) - extp触摸库事件类型:
SINGLE_TAP(单击)、LONG_PRESS(长按)可根据UI需求打开滑动事件 - 坐标范围:X: 0-799,Y: 0-479
四、准备硬件环境

1、Air8101 核心板 × 1
2、AirLCD_1020 触摸配件板 × 1
3、双排40PIN的双头线 x 1
4、母对母杜邦线 × 6,杜邦线太长的话,会出现 spi 通信不稳定的现象;
5、TYPE-C 数据线 × 1
6、Air8101 核心板和 AirLCD_1020配件板的硬件接线方式为
- Air8101 核心板通过 TYPE-C USB 口供电(核心板背面的功耗测试开关拨到 OFF 一端),此种供电方式下,vbat 引脚为 3.3V,可以直接给 AirLCD_1020配件板供电;
- 为了演示方便,所以 Air8101 核心板上电后直接通过 vbat 引脚给 AirLCD_1020配件板供电;
- 客户在设计实际项目时,一般来说,需要通过一个GPIO来控制LDO给LCD和TP供电,这样可以灵活地控制供电,可以使项目的整体功耗降到最低;
- 核心板和配件板之间配备了双排40PIN的双头线,可以参考下表很方便地连接双方各自的40个管脚,插入或者拔出双头线时,要慢慢的操作,防止将排针折弯;
LCD 显示屏接线
| Air8101核心板 | AirLCD_1020配件板 |
|---|---|
| gnd | GND |
| vbat | VCC |
| 42/R0 | RGB_R0 |
| 40/R1 | RGB_R1 |
| 43/R2 | RGB_R2 |
| 39/R3 | RGB_R3 |
| 44/R4 | RGB_R4 |
| 38/R5 | RGB_R5 |
| 45/R6 | RGB_R6 |
| 37/R7 | RGB_R7 |
| 46/G0 | RGB_G0 |
| 36/G1 | RGB_G1 |
| 47/G2 | RGB_G2 |
| 35/G3 | RGB_G3 |
| 48/G4 | RGB_G4 |
| 34/G5 | RGB_G5 |
| 49/G6 | RGB_G6 |
| 33/G7 | RGB_G7 |
| 50/B0 | RGB_B0 |
| 32/B1 | RGB_B1 |
| 51/B2 | RGB_B2 |
| 31/B3 | RGB_B3 |
| 52/B4 | RGB_B4 |
| 30/B5 | RGB_B5 |
| 53/B6 | RGB_B6 |
| 29/B7 | RGB_B7 |
| 28/DCLK | RGB_DCLK |
| 54/DISP | RGB_DISP |
| 55/HSYN | RGB_HSYNC |
| 56/VSYN | RGB_VSYNC |
| 57/DE | RGB_DE |
| 14/GPIO8 | LCD_BL |
| 13/GPIO9 | LCD_RST |
| 8/GPIO5 | LCD_SDI |
| 9/GPIO6 | LCD_SCL |
| 68/GPIO12 | LCD_CS |
| 75/GPIO28 | TP_RST |
| 10/GPIO7 | TP_INT |
| 12/U1TX | TP_SCL |
| 11/U1RX | TP_SDA |
五、准备软件环境
5.1 软件环境
在开始实践本示例之前,先筹备一下软件环境:
1、烧录工具:Luatools 下载调试工具
2、本demo开发测试时使用的固件为LuatOS-SoC_V1006_Air8101 1号固件,本demo对固件版本没有什么特殊要求,所以你如果要测试本demo时,可以直接使用最新版本的内核固件;如果发现最新版本的内核固件测试有问题,可以使用我们开发本demo时使用的内核固件版本来对比测试;
3、脚本文件:https://gitee.com/openLuat/LuatOS/tree/master/module/Air8101/demo/accessory_board/AirLCD_1020/lcd
4、lib脚本文件:使用Luatools烧录时,勾选 添加默认lib 选项,使用默认lib脚本文件
准备好软件环境之后,接下来查看 Air8101 核心板使用说明,将本篇文章中演示使用的项目文件烧录到 Air8101 核心板中。
5.2 API 介绍
lcd 核心库:https://docs.openluat.com/osapi/core/lcd/
六、程序结构
AirLCD_1020/lcd/
│── font_drv
│── customer_font_drv.lua
│── hzfont_drv.lua
│── images
│── logo.jpg
│── lcd_drv
│── exlcd_drv.lua
│── lcd_drv.lua
│── tp_key_drv
│── extp_drv.lua
│── tp_drv.lua
│── ui
│── customer_font_page.lua
│── home_page.lua
│── lcd_page.lua
│── ui_main.lua
│── readme.md
6.1 文件说明
1、font_drv:
- customer_font_drv.lua:自定义外部字体驱动功能模块(开发中)
- hzfont_drv.lua:合宙软件矢量字库(开发中)
2、images:
logo.jpg:演示图片文件(和lua脚本文件一起烧录,会自动放置在/luadb/目录下)
3、lcd_drv:
- lcd_drv.lua:LCD显示驱动模块,基于lcd核心库,lcd_drv和exlcd_drv二选一使用
- exlcd_drv.lua:LCD显示驱动模块,基于exlcd扩展库,lcd_drv和exlcd_drv二选一使用
4、tp_key_drv:
- tp_drv.lua:触摸驱动模块,基于tp核心库,tp_drv和extp_drv二选一使用
- extp_drv.lua:触摸驱动模块,基于extp扩展库,tp_drv和extp_drv二选一使用
5、ui
- ui_main.lua:用户界面主控模块,管理页面切换和事件分发
- home_page.lua :主页模块,提供应用入口和导航功能
- lcd_page.lua:LCD图形绘制演示模块
- customer_font_page.lua:自定义字体演示模块(目前仅预留相关页面,未有实际功能演示)
七、代码详解
7.1 main.lua
主程序文件 main.lua 是整个项目的入口点。它负责初始化系统环境。
7.2 customer_font_drv.lua
自定义外部字体驱动功能模块(开发中)
--[[
说明:customer_font_drv是用户外部自定义外部点阵字体驱动功能模块,目前正在开发中。。。
]]
7.3 hzfont _drv.lua
hzfont 是合宙开发的一个内置矢量字体库,目前正在开发中
-- hzfont 是合宙开发的一个内置矢量字体库,目前正在开发中
7.4 exlcd_drv.lua
本模块为扩展LCD显示驱动功能模块,主要功能包括:
1、初始化AirLCD_1020扩展LCD显示;
2、配置显示缓冲区和自动刷新设置;
如果需要实现背光亮度调节,参考exlcd扩展库中的exlcd.set_bl(level)进行设置
local exlcd = require "exlcd"
local exlcd_drv = {}
--[[
初始化扩展LCD显示驱动;
@api exlcd_drv.init()
@summary 配置并初始化AirLCD_1020扩展LCD显示
@return boolean 初始化成功返回true,失败返回false
@usage
-- 初始化扩展LCD显示
local result = exlcd_drv.init({})
if result then
log.info("扩展LCD初始化成功")
else
log.error("扩展LCD初始化失败")
end
]]
function exlcd_drv.init()
local result = exlcd.init({lcd_model = "AirLCD_1020"})
if result then
-- 开启缓冲区, 刷屏速度会加快, 但也消耗2倍屏幕分辨率的内存
lcd.setupBuff(nil, true)
lcd.autoFlush(false)
end
return result
end
return exlcd_drv
7.5 lcd_drv.lua
本模块为LCD显示驱动功能模块,主要功能包括:
1、初始化AirLCD_1020 LCD屏幕;
2、配置LCD显示参数和显示缓冲区;
3、支持多种屏幕方向和分辨率设置;
local lcd_drv = {}
--[[
初始化LCD显示驱动;
@api lcd_drv.init()
@summary 配置并初始化AirLCD_1020 LCD屏幕
@return boolean 初始化成功返回true,失败返回false
@usage
-- 初始化LCD显示
local result = lcd_drv.init()
if result then
log.info("LCD初始化成功")
else
log.error("LCD初始化失败")
end
]]
function lcd_drv.init()
local result = lcd.init("nv3052c",
{
pin_pwr = 8, -- 背光控制引脚GPIO端口号
port = lcd.RGB, -- 驱动端口
direction = 0, -- lcd屏幕方向 0:0° 1:90° 2:180° 3:270°,屏幕方向和分辨率保存一致
w = 800, -- lcd 水平分辨率
h = 480, -- lcd 竖直分辨率
xoffset = 0, -- x偏移(不同屏幕ic 不同屏幕方向会有差异)
yoffset = 0, -- y偏移(不同屏幕ic 不同屏幕方向会有差异)
bus_speed = 30 * 1000 * 1000, -- SPI总线速度,不填默认50M,若速率要求更高需要进行设置
hbp = 8, -- 水平后廊
hspw = 4, -- 水平同步脉冲宽度
hfp = 8, -- 水平前廊
vbp = 16, -- 垂直后廊
vspw = 4, -- 垂直同步脉冲宽度
vfp = 16, -- 垂直前廊
})
log.info("lcd.init", result)
if result then
-- 开启缓冲区, 刷屏速度会加快, 但也消耗2倍屏幕分辨率的内存
lcd.setupBuff(nil, true)
lcd.autoFlush(false)
-- 开启背光引脚供电
gpio.setup(8,1)
end
return result
end
return lcd_drv
7.6 extp_drv.lua
本模块为扩展触摸面板驱动功能模块,主要功能包括:
1、初始化AirLCD_1020扩展触摸面板;
2、配置I2C通信接口和触摸参数;
3、发布触摸事件消息供UI系统处理;
local extp = require "extp"
local extp_drv = {}
--[[
初始化扩展触摸面板驱动;
@api extp_drv.init()
@summary 配置并初始化AirLCD_1020扩展触摸面板
@return boolean 初始化成功返回true,失败返回false
@usage
-- 初始化扩展触摸面板
local result = extp_drv.init()
if result then
log.info("扩展触摸面板初始化成功")
else
log.error("扩展触摸面板初始化失败")
end
]]
function extp_drv.init()
extp.init({ tp_model = "AirLCD_1020" })
end
return extp_drv
7.7 tp_drv.lua
本模块为触摸面板驱动功能模块,主要功能包括:
1、初始化GT911触摸控制器;
2、配置I2C通信接口和触摸回调函数;
3、发布触摸事件消息供UI系统处理;
local tp_drv = {}
--[[
触摸事件回调函数;
@local
@function tp_callback(tp_device, tp_data)
@userdata tp_device 触摸设备对象
@table tp_data 触摸数据数组
@return nil
]]
local function tp_callback(tp_device, tp_data)
if tp_data[1].event == tp.EVENT_DOWN then
-- log.info("tp_drv tp_callback", tp_data[1].event, tp_data[1].x, tp_data[1].y)
sys.publish("BASE_TOUCH_EVENT", tp_data[1].event, tp_data[1].x, tp_data[1].y)
end
end
--[[
初始化触摸面板驱动;
@api tp_drv.init()
@summary 配置并初始化GT911触摸控制器
@return boolean 初始化成功返回true,失败返回false
@usage
-- 初始化触摸面板
local result = tp_drv.init()
if result then
log.info("触摸面板初始化成功")
else
log.error("触摸面板初始化失败")
end
]]
function tp_drv.init()
-- 初始化软件I2C,接口i2c.createSoft(scl, sda, delay)
local result = i2c.createSoft(0, 1)
if type(result) ~= "userdata" then
log.error("tp_drv.init i2c.createSoft error")
return false
end
-- 此处触摸IC数据读取使用的是软件I2C接口
result = tp.init("gt911", { port = result, pin_rst = 28, pin_int = 7, w = 800, h = 480 }, tp_callback)
log.info("tp.init", result)
return result
end
return tp_drv
7.8 ui_main.lua
本模块为核心UI控制模块,主要功能包括:
1、初始化LCD显示和触摸面板驱动;
2、管理多个页面之间的切换逻辑;
3、分发触摸事件到各个页面处理;
4、维护页面状态和生命周期管理;
-- 加载子页面
local home_page = require "home_page"
local lcd_page = require "lcd_page"
local customer_font_page = require "customer_font_page"
-- 当前页面状态
local current_page = "home"
local last_page = ""
frame_time = 20 * 1000
--[[
切换页面;
@api switch_page(new_page)
@string new_page 目标页面名称
@valid_values "home", "lcd","customer_font_page"
@return nil
@usage
-- 切换到LCD演示页面
switch_page("lcd")
]]
local function switch_page(new_page)
-- 调用旧页面的退出函数(如果存在)
if current_page == "home" and home_page.on_leave then
home_page.on_leave()
elseif current_page == "lcd" and lcd_page.on_leave then
lcd_page.on_leave()
elseif current_page == "customer_font_page" and customer_font_page.on_leave then
customer_font_page.on_leave()
end
last_page = current_page
current_page = new_page
-- 调用新页面的进入函数(如果存在)
if new_page == "home" and home_page.on_enter then
home_page.on_enter()
elseif new_page == "lcd" and lcd_page.on_enter then
lcd_page.on_enter()
elseif new_page == "customer_font_page" and customer_font_page.on_enter then
customer_font_page.on_enter()
end
log.info("ui_main", "切换到页面:", current_page)
end
--[[
处理触摸事件;
@api handle_touch_event(event, x, y)
@number event 触摸事件类型
@valid_values tp.EVENT_DOWN, tp.EVENT_MOVE, tp.EVENT_UP
@number x 触摸点X坐标,范围0-799
@number y 触摸点Y坐标,范围0-479
@return boolean 事件处理成功返回true,否则返回false
]]
-- 处理触摸事件
local function handle_touch_event(event, x, y)
log.info("触摸事件", "event:", event, "x:", x, "y:", y)
if event then -- 只在抬起时处理点击
if current_page == "home" then
return home_page.handle_touch(x, y, switch_page)
elseif current_page == "lcd" then
return lcd_page.handle_touch(x, y, switch_page)
elseif current_page == "customer_font_page" then
return customer_font_page.handle_touch(x, y, switch_page)
end
end
return false
end
--[[
用户界面主任务;
@api ui_main()
@summary 初始化显示和触摸驱动,启动UI主循环
@return nil
]]
local function ui_main()
lcd_drv.init()
tp_drv.init()
-- 默认使用系统自带的12号中文字体
lcd.setFont(lcd.font_opposansm12_chinese)
-- 调用主页的进入函数
if home_page.on_enter then
home_page.on_enter()
end
while true do
-- 根据当前页面绘制内容
if current_page == "home" then
home_page.draw()
elseif current_page == "lcd" then
lcd_page.draw()
elseif current_page == "customer_font_page" then
customer_font_page.draw()
end
lcd.flush()
-- 等待触摸事件
local result, event, x, y = sys.waitUntil("BASE_TOUCH_EVENT", frame_time)
if result then
handle_touch_event(event, x, y)
end
end
end
sys.taskInit(ui_main)
7.9 home_page.lua
本模块为主页面功能模块,主要功能包括:
1、绘制主页面UI界面,显示应用标题和功能介绍;
2、提供三个功能按钮:LCD演示、矢量字体演示、自定义字体演示;
3、处理主页面的触摸事件,实现页面导航;
local home_page = {}
-- 屏幕尺寸
local width, height
local center_x
-- 按钮区域定义(适配800x480)
local buttons = {
lcd_page = { x1 = 100, y1 = 350, x2 = 340, y2 = 430 },
customer_font_page = { x1 = 410, y1 = 350, x2 = 650, y2 = 430 }
}
local title = "合宙LCD演示系统"
local content1 = "本页面使用的是系统内置的12号中文点阵字体"
--[[
绘制主页界面;
@api home_page.draw()
@summary 绘制主页面所有UI元素
@return nil
]]
function home_page.draw()
lcd.clear()
lcd.setColor(0xFFFF, 0x0000)
lcd.setFont(lcd.font_opposansm12_chinese)
width, height = lcd.getSize()
center_x = math.floor(width / 2)
-- 显示标题(居中)
-- 后续V2020版本以上支持lcd核心库的固件会新增lcd.getStrWidth(title)接口获取文本宽度,对齐、居中、换行可使用
-- lcd.drawStr(center_x - lcd.getStrWidth(title) / 2, 50, title, 0x0000) -- 自动居中
log.info("center_x", width, height, center_x)
lcd.drawStr(center_x - 70, 50, title, 0x0000)
-- 显示说明文字
lcd.drawStr(center_x - 130, 90, content1, 0x0000)
-- 添加演示说明
lcd.drawStr(center_x - 75, 120, "屏幕尺寸: " .. width .. "x" .. height, 0x0000)
-- 绘制LCD演示按钮
lcd.fill(buttons.lcd_page.x1, buttons.lcd_page.y1,
buttons.lcd_page.x2, buttons.lcd_page.y2, 0x001F)
lcd.setColor(0xFFFF, 0x0000)
lcd.drawStr(buttons.lcd_page.x1 + 85, buttons.lcd_page.y1 + 45, "LCD演示", 0xFFFF)
-- 绘制自定义字体演示按钮
lcd.fill(buttons.customer_font_page.x1, buttons.customer_font_page.y1,
buttons.customer_font_page.x2, buttons.customer_font_page.y2, 0x07E0)
lcd.drawStr(buttons.customer_font_page.x1 + 75, buttons.customer_font_page.y1 + 45, "自定义字体演示", 0xFFFF)
end
--[[
处理主页触摸事件;
@api home_page.handle_touch(x, y, switch_page)
@number x 触摸点X坐标,范围0-799
@number y 触摸点Y坐标,范围0-479
@function switch_page 页面切换回调函数
@return boolean 事件处理成功返回true,否则返回false
]]
function home_page.handle_touch(x, y, switch_page)
-- 检查LCD演示按钮
if x >= buttons.lcd_page.x1 and x <= buttons.lcd_page.x2 and
y >= buttons.lcd_page.y1 and y <= buttons.lcd_page.y2 then
switch_page("lcd")
return true
end
-- 检查自定义字体演示按钮
if x >= buttons.customer_font_page.x1 and x <= buttons.customer_font_page.x2 and
y >= buttons.customer_font_page.y1 and y <= buttons.customer_font_page.y2 then
switch_page("customer_font_page")
return true
end
return false
end
return home_page
7.10 lcd_page.lua
本模块为LCD图形绘制演示功能模块,主要功能包括:
1、展示LCD核心库的基本图形绘制功能;
2、演示点、线、矩形、圆形等基本图形绘制;
3、显示图片和二维码生成功能;
4、提供颜色示例展示;
local lcd_page = {}
-- 按钮区域定义
local back_button = { x1 = 10, y1 = 10, x2 = 80, y2 = 50 }
--[[
绘制LCD演示页面;
@api lcd_page.draw()
@summary 绘制LCD演示页面的所有图形和UI元素
@return nil
]]
function lcd_page.draw()
lcd.clear()
lcd.setFont(lcd.font_opposansm12_chinese)
-- 绘制返回按钮
lcd.fill(back_button.x1, back_button.y1, back_button.x2, back_button.y2, 0xC618)
lcd.setColor(0x07E0, 0x0000)
lcd.drawStr(35, 35, "返回", 0x0000)
-- 设置默认颜色
lcd.setColor(0xFFFF, 0x0000)
-- 显示标题
lcd.drawStr(364, 20 + 12, "lcd核心库演示", 0x0000)
-- 绘制各种图形
lcd.drawStr(20, 60 + 12, "基本图形绘制:", 0x0000)
-- 绘制点
lcd.drawPoint(30, 100, 0xFCC0)
lcd.drawPoint(40, 100, 0x07E0)
lcd.drawPoint(50, 100, 0x001F)
-- 绘制线
lcd.drawLine(70, 90, 150, 90, 0xFCC0)
lcd.drawLine(70, 100, 150, 110, 0x07E0)
lcd.drawLine(70, 110, 150, 90, 0x001F)
-- 绘制矩形
lcd.drawRectangle(170, 90, 220, 120, 0x7296)
lcd.fill(230, 90, 280, 120, 0x07E0)
-- 绘制圆
lcd.drawCircle(100, 180, 25, 0x001F)
lcd.drawCircle(180, 180, 25, 0xFCC0)
-- 显示图片示例文字
-- 注意, jpg需要是常规格式, 不能是渐进式JPG
-- 如果无法解码, 可以用画图工具另存为,新文件就能解码了
lcd.drawStr(20, 220 + 12, "图片显示区域", 0x0000)
lcd.drawRectangle(20, 240, 150, 370, 0x0000)
lcd.showImage(45, 265, "/luadb/logo.jpg")
-- 显示二维码示例文字
lcd.drawStr(170, 220 + 12, "二维码区域", 0x0000)
lcd.drawRectangle(170, 240, 300, 370, 0x0000)
lcd.drawQrcode(185, 255, "https://docs.openluat.com/air8101/", 100)
-- 显示颜色示例
lcd.drawStr(20, 390 + 12, "颜色示例:", 0x0000)
lcd.fill(100, 390, 120, 410, 0xF800)
lcd.fill(130, 390, 150, 410, 0x07E0)
lcd.fill(160, 390, 180, 410, 0x001F)
lcd.fill(190, 390, 210, 410, 0xFCC0)
lcd.fill(220, 390, 240, 410, 0x0000)
-- 位图示例
lcd.drawStr(420, 60 + 12, "绘制 XBM 格式位图:", 0x0000)
-- 在位置(520,82)绘制一个16x16的位图,内容依次为“上”,“海”,“合”,“宙”
-- 位图数据使用字符串格式表示
lcd.drawXbm(420, 88, 16, 16, string.char(
0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x3F, 0x80, 0x00,
0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFE, 0x7F, 0x00, 0x00))
lcd.drawXbm(420 + 18, 88, 16, 16, string.char(
0x00, 0x00, 0x80, 0x00, 0xC4, 0x7F, 0x28, 0x00, 0x10, 0x00, 0xD0, 0x3F, 0x42, 0x20, 0x44, 0x22,
0x40, 0x24, 0xF0, 0xFF, 0x24, 0x20, 0x24, 0x22, 0x24, 0x20, 0xE2, 0x7F, 0x02, 0x20, 0x02, 0x1E))
lcd.drawXbm(420 + 36, 88, 16, 16, string.char(
0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0x40, 0x02, 0x20, 0x04, 0x18, 0x18, 0xF4, 0x6F, 0x02, 0x00,
0x00, 0x00, 0xF8, 0x1F, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0xF8, 0x1F, 0x08, 0x10))
lcd.drawXbm(420 + 54, 88, 16, 16, string.char(
0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0xFE, 0x7F, 0x02, 0x40, 0x02, 0x40, 0x00, 0x01, 0xFC, 0x3F,
0x04, 0x21, 0x04, 0x21, 0xFC, 0x3F, 0x04, 0x21, 0x04, 0x21, 0x04, 0x21, 0xFC, 0x3F, 0x04, 0x20))
-- 英文字体示例
lcd.setFont(lcd.font_opposansm12_chinese)
lcd.drawStr(420, 220 + 12, "英文字体示例:", 0x0000)
lcd.setFont(lcd.font_opposansm12)
lcd.drawStr(420, 249, "ABC abc 0123456789") --显示字符
lcd.setFont(lcd.font_opposansm16)
lcd.drawStr(420, 266, "ABC abc 0123456789") --显示字符
lcd.setFont(lcd.font_opposansm18)
lcd.drawStr(420, 287, "ABC abc 0123456789") --显示字符
lcd.setFont(lcd.font_opposansm20)
lcd.drawStr(420, 310, "ABC abc 0123456789") --显示字符
lcd.setFont(lcd.font_opposansm22)
lcd.drawStr(420, 337, "ABC abc 0123456789") --显示字符
lcd.setFont(lcd.font_opposansm24)
lcd.drawStr(420, 366, "ABC abc 0123456789") --显示字符
lcd.setFont(lcd.font_opposansm32)
lcd.drawStr(420, 403, "ABC abc 0123456789") --显示字符
end
--[[
处理LCD页面触摸事件;
@api lcd_page.handle_touch(x, y, switch_page)
@number x 触摸点X坐标,范围0-799
@number y 触摸点Y坐标,范围0-479
@function switch_page 页面切换回调函数
@return boolean 事件处理成功返回true,否则返回false
]]
function lcd_page.handle_touch(x, y, switch_page)
-- 检查返回按钮
if x >= back_button.x1 and x <= back_button.x2 and
y >= back_button.y1 and y <= back_button.y2 then
switch_page("home")
return true
end
return false
end
return lcd_page
7.11 customer_font_page.lua
本模块为自定义字体演示功能模块,主要功能包括:
1、展示外部自定义字体文件的使用方法;
2、演示不同颜色的字体显示效果;
3、提供字体文件路径和使用接口说明;
4、支持页面离开时恢复系统默认字体;
local customer_font_page = {}
-- 屏幕尺寸
local width, height
local center_x
-- 按钮区域定义
local back_button = { x1 = 10, y1 = 10, x2 = 80, y2 = 50 }
--[[
绘制自定义字体演示页面;
@api customer_font_page.draw()
@summary 绘制自定义字体演示页面的所有UI元素和字体内容
@return nil
]]
function customer_font_page.draw()
width, height = lcd.getSize()
center_x = math.floor(width / 2)
lcd.clear()
lcd.setFont(lcd.font_opposansm12_chinese)
-- 绘制返回按钮
lcd.fill(back_button.x1, back_button.y1, back_button.x2, back_button.y2, 0xC618)
lcd.setColor(0xFFFF, 0x0000)
lcd.drawStr(35, 35, "返回", 0x0000)
-- 设置默认颜色
lcd.setColor(0xFFFF, 0x0000)
-- 显示标题(居中显示)
-- 后续V2020版本以上支持lcd核心库的固件会新增lcd.getStrWidth(title)接口获取文本宽度,对齐、居中、换行可使用
-- lcd.drawStr(center_x - lcd.getStrWidth(title) / 2, 50, title, 0x0000) -- 自动居中
lcd.drawStr(center_x - 80, 30, "自定义点阵字体Air8101正在开发中...", 0x0000)
end
--[[
处理自定义字体页面触摸事件;
@api customer_font_page.handle_touch(x, y, switch_page)
@number x 触摸点X坐标,范围0-799
@number y 触摸点Y坐标,范围0-479
@function switch_page 页面切换回调函数
@return boolean 事件处理成功返回true,否则返回false
]]
function customer_font_page.handle_touch(x, y, switch_page)
-- 检查返回按钮
if x >= back_button.x1 and x <= back_button.x2 and
y >= back_button.y1 and y <= back_button.y2 then
switch_page("home")
return true
end
return false
end
--[[
页面离开时恢复系统字体;
@api customer_font_page.on_leave()
@summary 恢复系统默认字体设置
@return nil
]]
function customer_font_page.on_leave()
-- 恢复使用12号中文字体
lcd.setFont(lcd.font_opposansm12_chinese)
end
return customer_font_page
八、显示效果展示
8.1 硬件准备
- 按照硬件接线表连接所有设备
- 确保电源连接正确,通过TYPE-C USB口供电
- 检查所有接线无误,避免短路
8.2 软件配置
在main.lua中选择加载对应的驱动模块:
-- 加载显示屏驱动管理功能模块,有以下两种:
-- 1、使用lcd核心库驱动的lcd_drv.lua
-- 2、使用exlcd扩展库驱动的exlcd_drv.lua
-- 根据自己的需求,启用两者中的任何一种都可以
-- 也可以不启用任何一种,不使用显示屏功能
lcd_drv = require "lcd_drv"
-- lcd_drv = require "exlcd_drv"
-- 加载触摸面板驱动管理功能模块,有以下两种:
-- 1、使用tp核心库驱动的tp_drv.lua
-- 2、使用extp扩展库驱动的extp_drv.lua
-- 根据自己的需求,启用两者中的任何一种都可以
-- 也可以不启用任何一种,不使用触摸面板功能
tp_drv = require "tp_drv"
-- tp_drv = require "extp_drv"
-- 加载字库驱动管理功能模块,有以下两种:
-- 1、使用hzfont核心库驱动内核固件中支持的软件矢量字库的hzfont_drv.lua(正在开发中,后续补充)
-- 2、使用自定义字体(正在开发中,后续补充)
-- 根据自己的需求,启用两者中的任何几种都可以
-- 也可以不启用任何一种,只使用内核固件中自带的点阵字库
-- 加载输入法驱动管理功能模块(正在开发中,后续补充)
-- 加载lcd核心库实现的用户界面功能模块
-- 实现多页面切换、触摸事件分发和界面渲染功能
-- 包含主页、lcd核心库功能演示页和自定义字体演示页
require "ui_main"
8.3 软件烧录
- 使用Luatools烧录最新内核固件
- 下载并烧录本项目所有脚本文件
- 将字体文件和图片文件随脚本文件一起烧录到脚本分区
- 烧录成功后设备自动重启后开始运行
8.4 功能测试
8.4.1 主页面操作
- 设备启动后显示主页面,包含三个功能按钮
- 查看系统功能概览信息
- 点击各功能按钮进入对应演示页面

8.4.2 LCD演示页面
- 查看基本图形绘制示例(点、线、矩形、圆形)
- 查看图片显示区域(显示logo图片)
- 查看二维码区域(合宙文档二维码)
- 查看颜色填充示例展示
- 查看位图和英文字体演示
- 点击"返回"按钮回到主页

8.5 预期效果
- 主页面:正常显示,三个功能按钮响应灵敏
- LCD演示页面:图形绘制清晰,图片和二维码显示正常,颜色示例完整
- 触摸交互:所有触摸操作响应及时准确,页面切换流畅
九、常见问题
- 显示异常:检查LCD接线是否正确,确认电源供电稳定
- 触摸无响应:检查I2C接线,确认触摸芯片初始化成功
- 图片无法显示:确认图片文件已正确烧录到指定路径
- 系统卡顿:检查内存使用情况,适当调整刷新频率