Просмотр исходного кода

add:新增Air8000系列搭配AirLCD_1000使用exeasyui开发和按键操控demo

江访 1 месяц назад
Родитель
Сommit
911f9fa41c
20 измененных файлов с 2037 добавлено и 0 удалено
  1. 1 0
      module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/hw_drv/hw_customer_font_drv.lua
  2. 62 0
      module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/hw_drv/hw_default_font_drv.lua
  3. 65 0
      module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/hw_drv/hw_gtfont_drv.lua
  4. 65 0
      module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/hw_drv/hw_hzfont_drv.lua
  5. BIN
      module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/images/1.jpg
  6. BIN
      module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/images/2.jpg
  7. BIN
      module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/images/3.jpg
  8. BIN
      module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/images/4.jpg
  9. BIN
      module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/images/5.jpg
  10. BIN
      module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/images/logo.jpg
  11. 104 0
      module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/main.lua
  12. 202 0
      module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/readme.md
  13. 70 0
      module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/tp_key_drv/key_drv.lua
  14. 214 0
      module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/ui/component_page.lua
  15. 156 0
      module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/ui/default_font_page.lua
  16. 165 0
      module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/ui/gtfont_page.lua
  17. 129 0
      module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/ui/home_page.lua
  18. 293 0
      module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/ui/hzfont_page.lua
  19. 333 0
      module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/ui/key_handler.lua
  20. 178 0
      module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/ui/ui_main.lua

+ 1 - 0
module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/hw_drv/hw_customer_font_drv.lua

@@ -0,0 +1 @@
+-- hw_customer_font_drv是用户外部自定义外部点阵字体、lcd显示驱动配置和tp触摸驱动配置的驱动配置文件,目前exeasyui自定义字体功能正在开发中。

+ 62 - 0
module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/hw_drv/hw_default_font_drv.lua

@@ -0,0 +1,62 @@
+--[[
+@module  hw_default_font_drv
+@summary 默认字体、lcd和tp驱动模块,使用内置12号点阵字体
+@version 1.0
+@date    2025.12.3
+@author  江访
+@usage
+本文件为默认字体、lcd和tp驱动模块,核心业务逻辑为:
+1、使用lcd内核固件中自带的12号中文字体;
+2、根据配置的字体、lcd和tp参数,初始化exEasyUI默认使用的字体、硬件显示和触摸;
+3、提供无需外部硬件的字体显示能力;
+
+本文件的对外接口有0个:
+1、require加载后自动执行初始化;
+
+@api ui.hw_init(config)
+@summary 初始化exEasyUI硬件系统
+@table config 硬件配置参数表,包含LCD配置和触摸配置
+@field lcd_config table LCD显示配置参数
+@field tp_config table 触摸屏配置参数
+@return nil
+
+@usage
+
+]]
+
+-- 使用默认12号中文字体初始化exEasyUI硬件
+ui.hw_init({
+    -- lcd_config参数填写可以参考合宙exlcd显示扩展库exlcd.init(param)接口说明:https://docs.openluat.com/osapi/ext/exlcd/#31-exlcdinitparam
+    lcd_config = {
+        lcd_model = "AirLCD_1000", -- LCD型号
+        -- pin_vcc = 24,           -- 供电引脚,使用GPIO控制屏幕供电可配置
+        pin_rst = 36,              -- 复位引脚
+        pin_pwr = 1,               -- 背光控制引脚GPIO ID号
+        pin_pwm = 0,               -- 背光控制引脚PWM D号
+        port = lcd.HWID_0,         -- 驱动端口
+        -- pin_dc = nil,          -- lcd数据/命令选择引脚GPIO ID号,使用lcd 专用 SPI 接口 lcd.HWID_0不需要填此参数,使用通用SPI接口需要赋值
+        direction = 0,             -- lcd屏幕方向 0:0° 1:90° 2:180° 3:270°,屏幕方向和分辨率保存一致
+        w = 320,                   -- lcd 水平分辨率
+        h = 480,                   -- lcd 竖直分辨率
+        xoffset = 0,               -- x偏移(不同屏幕ic 不同屏幕方向会有差异)
+        yoffset = 0,               -- y偏移(不同屏幕ic 不同屏幕方向会有差异)
+        sleepcmd = 0X10,           -- 睡眠命令,默认0X10
+        wakecmd = 0X11,            -- 唤醒命令,默认0X11
+        -- bus_speed = 50*1000*1000,                            -- SPI总线速度,不填默认50M,若速率要求更高需要进行设置
+        -- interface_mode = lcd.WIRE_4_BIT_8_INTERFACE_I,       -- lcd模式,默认lcd.WIRE_4_BIT_8_INTERFACE_I
+        -- direction0 = {0x36,0x00},                            -- 0°方向的命令,(不同屏幕ic会有差异)
+        -- direction90 = {0x36,0x60},                           -- 90°方向的命令,(不同屏幕ic会有差异)
+        -- direction180 ={0x36,0xc0} ,                          -- 180°方向的命令,(不同屏幕ic会有差异)
+        -- direction270 = {0x36,0xA0},                          -- 270°方向的命令,(不同屏幕ic会有差异)
+        -- hbp = nil,                                           -- 水平后廊
+        -- hspw = nil,                                          -- 水平同步脉冲宽度
+        -- hfp = 0,                                             -- 水平前廊
+        -- vbp = 0,                                             -- 垂直后廊
+        -- vspw = 0,                                            -- 垂直同步脉冲宽度
+        -- vfp = 0,                                             -- 垂直前廊
+        -- initcmd = nil,                                       -- 自定义屏幕初始化命令表
+        -- flush_rate = nil,                                    -- 刷新率
+        -- spi_dev = nil,                                       -- spi设备,当port = "device"时有效,当port ≠ "device"时可不填或者填nil
+        -- init_in_service = false,                             -- 允许初始化在lcd service里运行,在后台初始化LCD,默认是false,Air8000/G/W/T/A、Air780EHM/EGH/EHV 支持填true,可加快初始化速度,默认SPI总线速度80M
+    }
+})

+ 65 - 0
module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/hw_drv/hw_gtfont_drv.lua

@@ -0,0 +1,65 @@
+--[[
+@module  hw_gtfont_drv
+@summary GTFont矢量字体驱动模块,使用AirFONTS_1000配件板
+@version 1.0
+@date    2025.12.3
+@author  江访
+@usage
+本文件为GTFont矢量字体、lcd和tp驱动模块,核心业务逻辑为:
+1、使用gtfont核心库驱动AirFONTS_1000矢量字库配件板;
+2、根据配置的字体、lcd和tp参数,初始化exEasyUI默认使用的字体、硬件显示和触摸;
+3、提供高质量矢量字体显示能力;
+
+本文件的对外接口有0个:
+1、require加载后自动执行初始化;
+
+@api ui.hw_init(config)
+@summary 初始化exEasyUI硬件系统
+@table config 硬件配置参数表,包含字体配置、LCD配置和触摸配置
+@field font_config table 字体配置参数
+@field lcd_config table LCD显示配置参数
+@field tp_config table 触摸屏配置参数
+@return nil
+
+@usage
+
+]]
+
+-- 使用gtfont矢量字库初始化exEasyUI硬件
+ui.hw_init({
+    font_config = { type = "gtfont", spi = { id = 1, cs = 12 }, size = 32 },
+
+    -- lcd_config参数填写可以参考合宙exlcd显示扩展库exlcd.init(param)接口说明:https://docs.openluat.com/osapi/ext/exlcd/#31-exlcdinitparam
+    lcd_config = {
+        lcd_model = "AirLCD_1000", -- LCD型号
+        -- pin_vcc = 24,                  -- 供电引脚,使用GPIO控制屏幕供电可配置
+        pin_rst = 36,              -- 复位引脚
+        pin_pwr = 1,               -- 背光控制引脚GPIO ID号
+        pin_pwm = 0,               -- 背光控制引脚PWM D号
+        port = lcd.HWID_0,         -- 驱动端口
+        -- pin_dc = 0xFF,          -- lcd数据/命令选择引脚GPIO ID号,使用lcd 专用 SPI 接口 lcd.HWID_0不需要填此参数,使用通用SPI接口需要赋值
+        direction = 0,             -- lcd屏幕方向 0:0° 1:90° 2:180° 3:270°,屏幕方向和分辨率保存一致
+        w = 320,                   -- lcd 水平分辨率
+        h = 480,                   -- lcd 竖直分辨率
+        xoffset = 0,               -- x偏移(不同屏幕ic 不同屏幕方向会有差异)
+        yoffset = 0,               -- y偏移(不同屏幕ic 不同屏幕方向会有差异)
+        sleepcmd = 0X10,           -- 睡眠命令,默认0X10
+        wakecmd = 0X11,            -- 唤醒命令,默认0X11
+        -- bus_speed = 50*1000*1000,                            -- SPI总线速度,不填默认50M,若速率要求更高需要进行设置
+        -- interface_mode = lcd.WIRE_4_BIT_8_INTERFACE_I,       -- lcd模式,默认lcd.WIRE_4_BIT_8_INTERFACE_I
+        -- direction0 = {0x36,0x00},                            -- 0°方向的命令,(不同屏幕ic会有差异)
+        -- direction90 = {0x36,0x60},                           -- 90°方向的命令,(不同屏幕ic会有差异)
+        -- direction180 ={0x36,0xc0} ,                          -- 180°方向的命令,(不同屏幕ic会有差异)
+        -- direction270 = {0x36,0xA0},                          -- 270°方向的命令,(不同屏幕ic会有差异)
+        -- hbp = nil,                                           -- 水平后廊
+        -- hspw = nil,                                          -- 水平同步脉冲宽度
+        -- hfp = 0,                                             -- 水平前廊
+        -- vbp = 0,                                             -- 垂直后廊
+        -- vspw = 0,                                            -- 垂直同步脉冲宽度
+        -- vfp = 0,                                             -- 垂直前廊
+        -- initcmd = nil,                                       -- 自定义屏幕初始化命令表
+        -- flush_rate = nil,                                    -- 刷新率
+        -- spi_dev = nil,                                       -- spi设备,当port = "device"时有效,当port ≠ "device"时可不填或者填nil
+        -- init_in_service = false,                             -- 允许初始化在lcd service里运行,在后台初始化LCD,默认是false,Air8000/G/W/T/A、Air780EHM/EGH/EHV 支持填true,可加快初始化速度,默认SPI总线速度80M
+    }
+})

+ 65 - 0
module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/hw_drv/hw_hzfont_drv.lua

@@ -0,0 +1,65 @@
+--[[
+@module  hw_hzfont_drv
+@summary HZFont矢量字体驱动模块,使用合宙内置矢量字库
+@version 1.0
+@date    2025.12.3
+@author  江访
+@usage
+本文件为HZFont矢量字体、lcd和tp驱动模块,核心业务逻辑为:
+1、使用Air780EHM/EHV/EGH V2020版本以上14号固件或114号固件内置的hzfont合宙矢量字库;
+2、根据配置的字体、lcd和tp参数,初始化exEasyUI默认使用的字体、硬件显示和触摸;
+3、提供动态字体大小调整和高质量字体显示能力;
+
+本文件的对外接口有0个:
+1、require加载后自动执行初始化;
+
+@api ui.hw_init(config)
+@summary 初始化exEasyUI硬件系统
+@table config 硬件配置参数表,包含字体配置、LCD配置和触摸配置
+@field font_config table 字体配置参数
+@field lcd_config table LCD显示配置参数
+@field tp_config table 触摸屏配置参数
+@return nil
+
+@usage
+
+]]
+
+-- 使用Air780EHM/EHV/EGH V2020版本以上14号固件内置的hzfont合宙矢量字库初始化exEasyUI硬件
+ui.hw_init({
+    font_config = { type = "hzfont", size = 24, antialias = -1 }, -- 默认-1,表示自动抗锯齿
+
+    -- lcd_config参数填写可以参考合宙exlcd显示扩展库exlcd.init(param)接口说明:https://docs.openluat.com/osapi/ext/exlcd/#31-exlcdinitparam
+    lcd_config = {
+        lcd_model = "AirLCD_1000", -- LCD型号
+        -- pin_vcc = 24,           -- 供电引脚,使用GPIO控制屏幕供电可配置
+        pin_rst = 36,              -- 复位引脚
+        pin_pwr = 1,               -- 背光控制引脚GPIO ID号
+        pin_pwm = 0,               -- 背光控制引脚PWM D号
+        port = lcd.HWID_0,         -- 驱动端口
+        -- pin_dc = 0xFF,          -- lcd数据/命令选择引脚GPIO ID号,使用lcd 专用 SPI 接口 lcd.HWID_0不需要填此参数,使用通用SPI接口需要赋值
+        direction = 0,             -- lcd屏幕方向 0:0° 1:90° 2:180° 3:270°,屏幕方向和分辨率保存一致
+        w = 320,                   -- lcd 水平分辨率
+        h = 480,                   -- lcd 竖直分辨率
+        xoffset = 0,               -- x偏移(不同屏幕ic 不同屏幕方向会有差异)
+        yoffset = 0,               -- y偏移(不同屏幕ic 不同屏幕方向会有差异)
+        sleepcmd = 0X10,           -- 睡眠命令,默认0X10
+        wakecmd = 0X11,            -- 唤醒命令,默认0X11
+        -- bus_speed = 50*1000*1000,                            -- SPI总线速度,不填默认50M,若速率要求更高需要进行设置
+        -- interface_mode = lcd.WIRE_4_BIT_8_INTERFACE_I,       -- lcd模式,默认lcd.WIRE_4_BIT_8_INTERFACE_I
+        -- direction0 = {0x36,0x00},                            -- 0°方向的命令,(不同屏幕ic会有差异)
+        -- direction90 = {0x36,0x60},                           -- 90°方向的命令,(不同屏幕ic会有差异)
+        -- direction180 ={0x36,0xc0} ,                          -- 180°方向的命令,(不同屏幕ic会有差异)
+        -- direction270 = {0x36,0xA0},                          -- 270°方向的命令,(不同屏幕ic会有差异)
+        -- hbp = nil,                                           -- 水平后廊
+        -- hspw = nil,                                          -- 水平同步脉冲宽度
+        -- hfp = 0,                                             -- 水平前廊
+        -- vbp = 0,                                             -- 垂直后廊
+        -- vspw = 0,                                            -- 垂直同步脉冲宽度
+        -- vfp = 0,                                             -- 垂直前廊
+        -- initcmd = nil,                                       -- 自定义屏幕初始化命令表
+        -- flush_rate = nil,                                    -- 刷新率
+        -- spi_dev = nil,                                       -- spi设备,当port = "device"时有效,当port ≠ "device"时可不填或者填nil
+        -- init_in_service = false,                             -- 允许初始化在lcd service里运行,在后台初始化LCD,默认是false,Air8000/G/W/T/A、Air780EHM/EGH/EHV 支持填true,可加快初始化速度,默认SPI总线速度80M
+    }
+})

BIN
module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/images/1.jpg


BIN
module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/images/2.jpg


BIN
module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/images/3.jpg


BIN
module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/images/4.jpg


BIN
module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/images/5.jpg


BIN
module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/images/logo.jpg


+ 104 - 0
module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/main.lua

@@ -0,0 +1,104 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
+@version 1.0
+@date    2025.12.3
+@author  江访
+@usage
+本demo演示的核心功能为:
+1、加载exeasyui扩展库,初始化用户界面系统;
+2、根据选择的字体类型驱动,进行显示硬件以及字体的初始化,
+   支持默认字体、外部矢量字库、内部软件矢量字库和外部自定义点阵字库四选一;
+3、初始化按键驱动系统,实现按键控制界面导航;
+4、启动用户界面主循环,实现多页面切换和按键事件处理;
+5、配置系统看门狗,确保系统稳定运行;
+
+更多说明参考本目录下的readme.md文件
+]]
+
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
+
+-- main.lua - 程序入口文件
+
+-- 定义项目名称和版本号
+PROJECT = "ui_demo" -- 项目名称
+VERSION = "001.000.000"   -- 版本号
+
+-- 在日志中打印项目名和项目版本号
+log.info("ui_demo", PROJECT, VERSION)
+
+-- 设置日志输出风格为样式2(建议调试时开启)
+-- log.style(2)
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
+end
+
+
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
+
+-- 必须加载才能启用exeasyui的功能
+ui = require("exeasyui")
+
+
+-- 加载lcd、tp和字库驱动管理功能模块,有以下四种:
+-- 1、使用lcd内核固件中自带的12号中文字体的hw_default_font_drv,并按lcd显示驱动配置进行初始化
+-- 2、使用hzfont核心库驱动内核固件中支持的软件矢量字库的hw_hzfont_drv.lua,并按lcd显示驱动配置初始化
+-- 3、使用gtfont核心库驱动AirFONTS_1000矢量字库配件板的hw_gtfont_drv.lua,并按lcd显示驱动配置初始化
+-- 4、使用自定义字体的hw_customer_font_drv(目前开发中)
+-- 最新情况可查看模组选型手册中对应型号的固件列表内,支持的核心库是否包含lcd、tp、12号中文、gtfont、hzfont,链接https://docs.openluat.com/air8000/common/product/
+-- 目前exeasyui V1.7.0版本支持使用已经实现的四种功能中的一种进行初始化,同时支持多种字体初始化功能正在开发中
+require("hw_default_font_drv")
+-- require("hw_hzfont_drv")
+-- require("hw_gtfont_drv")
+-- require("hw_customer_font_drv")开发中
+
+-- 加载按键驱动模块
+require("key_drv")
+
+-- 加载exeassyui扩展库实现的用户界面功能模块
+-- 实现多页面切换、触摸事件分发和界面渲染功能
+-- 包含主页、组件演示页、默认字体演示页、HZfont演示页、GTFont演示页和自定义字体演示页
+require("ui_main")
+
+
+-- 用户代码已结束
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行

+ 202 - 0
module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/readme.md

@@ -0,0 +1,202 @@
+# exEasyUI 演示
+
+## 一、功能模块介绍
+
+### 1.1 核心主程序模块
+
+1. **main.lua** - 主程序入口,负责系统初始化和任务调度
+2. **ui_main.lua** - exeasyui 主程序,负责页面管理和按键事件分发和执行exeasyui的任务调度
+
+### 1.2 显示页面模块
+
+1. **home_page.lua** - 主页模块,提供应用入口和导航功能
+2. **component_page.lua** - UI 组件演示模块
+3. **default_font_page.lua** - 默认字体演示模块
+4. **gtfont_page.lua** - GTFont 矢量字体演示模块
+5. **hzfont_page.lua** - HZFont 矢量字体演示模块
+
+### 1.3 硬件驱动模块
+
+1. **hw_default_font_drv.lua** - LCD显示驱动配置和默认字体驱动模块,使用内置 12 号点阵字体
+2. **hw_gtfont_drv.lua** - LCD显示驱动配置和GTFont 矢量字库驱动模块
+3. **hw_hzfont_drv.lua** - LCD显示驱动配置和HZFont 矢量字体驱动模块
+4. **hw_customer_font_drv.lua** - LCD显示驱动配置和自定义外部字体驱动模块(开发中)
+5. **key_drv.lua** - 按键硬件驱动模块,负责GPIO初始化和按键事件发布
+
+当前演示的exeasyui V1.7.0版本还不支持同时启用多种字体,仅支持选择一种字体初始化,同时启用多种字体功能正在开发中
+
+使用 HZfont 需要使用 V2020 版本以上的 14 号或者114号固件,且 14 号或114号固件仅支持 HZfont,不支持内置12号中文字体和GTfont核心库
+
+### 1.4 按键处理模块
+
+1. **key_handler.lua** - 按键逻辑处理模块,负责光标管理和界面导航
+- BOOT键 在可点击区域间循环切换
+- 开机键 模拟点击当前中心区域
+
+## 二、演示效果
+
+<table>
+<tr>
+<td>主页<br/></td><td>组件演示页<br/></td><td>默认字体页<br/></td><td>HZFont页<br/></td><td>GTFont页<br/></td></tr>
+<tr>
+<td><img src="https://docs.openluat.com/cdn/image/exeasyui_home_gage.png" width="80" /><br/></td><td><img src="https://docs.openluat.com/cdn/image/exeasyui_AirLCD_1000组件页面.jpg" width="80" /><br/></td><td><img src="https://docs.openluat.com/cdn/image/exeasyui_default_font_page.png" width="80" /><br/></td><td><img src="https://docs.openluat.com/cdn/image/exeasyui_hzfont_page.png" width="80" /><br/></td><td><img src="https://docs.openluat.com/cdn/image/exeasyui_gtfont_page.png" width="80" /><br/></td></tr>
+</table>
+
+
+## 三、演示硬件环境
+
+### 3.1 硬件清单
+
+- Air8000核心板 × 1
+- AirLCD_1000 配件板 × 1
+- GTFont 矢量字库,使用的是 AirFONTS_1000 配件板 × 1
+- 母对母杜邦线 × 17,杜邦线太长的话,会出现 spi 通信不稳定的现象;
+- TYPE-C 数据线 × 1
+- Air8000核心板和 AirLCD_1000 配件板以及 AirFONTS_1000 配件板的硬件接线方式为
+
+  - Air8000核心板通过 TYPE-C USB 口供电(核心板背面的开关拨到 USB ON 一端,正面开关拨到 供电 一端),此种供电方式下,VBAT和VDD-EXT 引脚为 3.3V,可以直接给 AirLCD_1000 配件板和 AirFONTS_1000 配件板供电;
+  - 为了演示方便,所以 Air8000核心板上电后直接通过 VBAT 引脚给 AirLCD_1000 配件板供电,通过复用VDD_EXT引脚给 AirFONTS_1000 配件板供电;
+  - 客户在设计实际项目时,一般来说,需要通过一个 GPIO 来控制 LDO 给配件板供电,这样可以灵活地控制配件板的供电,可以使项目的整体功耗降到最低;
+### 3.2 接线配置
+
+#### 3.2.1 LCD 显示屏接线
+
+<table>
+<tr> <td>Air8000核心板</td><td>AirLCD_1010配件板</td></tr>
+<tr> <td>LCD_CLK</td><td>SCLK/CLK</td></tr>
+<tr> <td>LCD_CS</td><td>CS</td></tr>
+<tr> <td>LCD_RST</td><td>RES/RST</td></tr>
+<tr> <td>LCD_SDA</td><td>SDA/MOS</td></tr>
+<tr> <td>LCD_RS</td><td>DC/RS</td></tr>
+<tr> <td>GPIO1</td><td>BLK</td></tr>
+<tr> <td>VBAT</td><td>VCC</td></tr>
+<tr> <td>GND</td><td>GND</td></tr>
+</table>
+
+#### 3.2.2 GTFont 字库接线
+
+<table>
+<tr> <td>Air8000核心板</td><td>AirFONTS_1000配件板</td></tr>
+<tr> <td>SPI0_CS</td><td>CS</td></tr>
+<tr> <td>SPI0_MISO</td><td>MISO</td></tr>
+<tr> <td>SPI0_MOSI</td><td>MOSI</td></tr>
+<tr> <td>SPI0_CLK</td><td>CLK</td></tr>
+<tr> <td>VDD_EXT</td><td>VCC</td></tr>
+<tr> <td>GND</td><td>GND</td></tr>
+</table>
+
+#### 3.2.3 接线图
+![](https://docs.openLuat.com/cdn/image/Air8000核心板_AirLCD_1000_AirFONTS_1000接线图.jpg)
+
+![](https://docs.openLuat.com/cdn/image/Air8000引脚定义背面图.png)
+
+## 四、演示软件环境
+
+### 4.1 开发工具
+
+- [Luatools 下载调试工具](https://docs.openluat.com/air8000/luatos/common/download/) - 固件烧录和代码调试
+
+### 4.2 内核固件
+
+- [点击下载 Air8000 系列最新版本内核固件](https://docs.openluat.com/air8000/luatos/firmware/)
+
+使用 HZfont 需要使用 V2020 版本以上的 14 号固件或114号固件,且 14 号固件或114号固件仅支持 HZfont
+使用其他字体,demo 所使用的是 LuatOS-SoC_V2018 1 号固件
+
+## 五、演示核心步骤
+
+### 5.1 硬件准备
+
+1. 按照硬件接线表连接所有设备
+2. 如使用 GTFont,需要连接 AirFONTS_1000 配件板
+3. 通过 TYPE-C USB 口供电
+4. 检查所有接线无误
+
+### 5.2 软件配置
+
+在 `main.lua` 中配置系统参数:
+
+```lua
+-- 必须加载才能启用exeasyui的功能
+ui = require("exeasyui")
+
+
+-- 加载lcd、tp和字库驱动管理功能模块,有以下四种:
+-- 1、使用lcd内核固件中自带的12号中文字体的hw_default_font_drv,并按lcd显示驱动配置进行初始化
+-- 2、使用hzfont核心库驱动内核固件中支持的软件矢量字库的hw_hzfont_drv.lua,并按lcd显示驱动配置初始化
+-- 3、使用gtfont核心库驱动AirFONTS_1000矢量字库配件板的hw_gtfont_drv.lua,并按lcd显示驱动配置初始化
+-- 4、使用自定义字体的hw_customer_font_drv(目前开发中)
+-- 最新情况可查看模组选型手册中对应型号的固件列表内,支持的核心库是否包含lcd、tp、12号中文、gtfont、hzfont,链接https://docs.openluat.com/air8000/common/product/
+-- 目前exeasyui V1.7.0版本支持使用已经实现的四种功能中的一种进行初始化,同时支持多种字体初始化功能正在开发中
+require("hw_default_font_drv")
+-- require("hw_hzfont_drv")
+-- require("hw_gtfont_drv")
+-- require("hw_customer_font_drv")开发中
+
+-- 加载按键驱动模块
+require("key_drv")
+
+-- 加载exeassyui扩展库实现的用户界面功能模块
+-- 实现多页面切换、触摸事件分发和界面渲染功能
+-- 包含主页、组件演示页、默认字体演示页、HZfont演示页、GTFont演示页和自定义字体演示页
+require("ui_main")
+```
+
+### 5.3 驱动参数配置
+
+在对应的驱动文件中根据实际硬件调整硬件参数:
+
+1. **hw_default_font_drv.lua** - LCD显示驱动配置和默认字体驱动模块,使用内置 12 号点阵字体
+2. **hw_gtfont_drv.lua** - LCD显示驱动配置和GTFont 矢量字库驱动模块
+3. **hw_hzfont_drv.lua** - LCD显示驱动配置和HZFont 矢量字体驱动模块
+4. **hw_customer_font_drv.lua** - LCD显示驱动配置和自定义外部字体驱动模块(开发中)
+5. **key_drv.lua** - 按键硬件驱动模块,负责GPIO初始化和按键事件发布
+
+### 5.4 软件烧录
+
+1. 使用 Luatools 烧录对应型号的最新内核固件
+2. 下载并烧录本项目所有脚本文件
+3. 将图片文件随脚本文件一起烧录到脚本分区
+4. 设备自动重启后开始运行
+5. [点击查看Luatools 下载和详细使用](https://docs.openluat.com/air8000/common/Luatools/)
+
+### 5.5 功能测试
+
+#### 5.5.1 主页面操作
+
+1. 设备启动后显示主页面,光标自动定位在第一个按钮
+2. 按BOOT键在不同按钮间切换焦点
+3. 按PWR键进入对应演示页面
+4. 使用返回按钮返回主页面
+
+#### 5.5.2 组件演示页面
+
+1. 测试进度条组件的动态更新
+2. 体验复选框的状态变化
+3. 查看图片轮播效果(如有图片文件)
+4. 使用按键在不同组件间切换焦点
+
+#### 5.5.3 字体演示页面
+
+1. **默认字体页**:查看固定 12 号字体的颜色和中英文显示
+2. **HZFont 页**:测试动态字体大小调整功能
+3. **GTFont 页**:体验多尺寸矢量字体显示效果
+4. 在各页面使用按键操作界面按钮
+
+### 5.6 预期效果
+
+- **系统启动**:正常初始化,显示主页面
+- **字体显示**:各字体页面正常显示,动态调整功能正常
+- **按键操作**:在各页面使用按键操作界面按钮
+
+### 5.7 故障排除
+
+1. **显示异常**:检查 LCD 接线,确认对应驱动文件中的硬件参数正确
+2. **触摸无响应**:检查 I2C 接线,确认触摸芯片型号配置正确
+3. **字体显示异常**:确认选择的字体驱动与硬件匹配
+4. **图片无法显示**:确认图片文件已正确烧录到指定路径
+5. **系统卡顿**:调整 `ui_main.lua` 中的刷新率参数
+
+## 六、扩展开发
+
+本演示 demo 所有接口都在 [exeasyUI UI 扩展库](https://docs.openluat.com/osapi/ext/exeasyui/)内有详细说明,如需实现更丰富的自定义功能可按接口说明实现。

+ 70 - 0
module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/tp_key_drv/key_drv.lua

@@ -0,0 +1,70 @@
+--[[
+@module  key_drv
+@summary 按键驱动模块
+@version 1.0
+@date    2025.12.3
+@author  江访
+@usage
+本文件为按键驱动功能模块,核心业务逻辑为:
+1、初始化BOOT键和PWR键的GPIO;
+2、配置按键事件的中断处理函数;
+3、实现按键防抖功能,防止误触发;
+4、对外发布按键消息;
+
+本文件的对外接口有1个:
+1、key_drv.init():初始化按键驱动;
+]]
+
+local key_drv = {}
+
+-- 按键定义
+local key_boot = 0           -- GPIO0按键(BOOT键)
+local key_pwr = gpio.PWR_KEY -- 电源按键
+
+
+-- 按键事件处理函数
+local function handle_boot_key(val)
+
+    if val == 1 then
+        sys.publish("KEY_EVENT", "boot_down")
+    else
+        sys.publish("KEY_EVENT", "boot_up")
+    end
+end
+
+local function handle_pwr_key(val)
+
+    if val == 1 then
+        sys.publish("KEY_EVENT", "pwr_up")
+    else
+        sys.publish("KEY_EVENT", "pwr_down")
+    end
+end
+
+--[[
+初始化按键GPIO;
+配置BOOT键和PWR键的GPIO中断;
+
+@api key_drv.init()
+@summary 配置BOOT键和PWR键的GPIO中断
+@return bool 初始化只会返回true
+
+@usage
+local result = key_drv.init()
+if result then
+    log.info("按键驱动初始化成功")
+end
+]]
+function key_drv.init()
+    gpio.setup(key_boot, handle_boot_key, gpio.PULLDOWN, gpio.BOTH)
+    gpio.debounce(key_boot, 50, 0)     -- 防抖,防止频繁触发
+
+    gpio.setup(key_pwr, handle_pwr_key, gpio.PULLUP, gpio.BOTH)
+    gpio.debounce(key_pwr, 50, 0)     -- 防抖,防止频繁触发
+
+    log.info("key_drv", "按键初始化完成")
+    return true
+end
+
+key_drv.init()
+return key_drv

+ 214 - 0
module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/ui/component_page.lua

@@ -0,0 +1,214 @@
+--[[
+@module  component_page
+@summary exEasyUI组件演示页面模块
+@version 1.0
+@date    2025.12.3
+@author  江访
+@usage
+本文件为组件演示页面功能模块,核心业务逻辑为:
+1、创建带上下滚动功能的演示窗口;
+2、展示进度条、按钮、复选框、图片轮播等UI组件;
+3、演示组件的交互功能和事件处理;
+4、提供返回主页的导航功能;
+
+本文件的对外接口有1个:
+1、component_page.create(ui):创建组件演示页面;
+]]
+
+local component_page = {}
+
+--[[
+创建组件演示页面;
+
+@api component_page.create(ui)
+@summary 创建组件演示页面界面
+@table ui UI库对象
+@return table 组件演示窗口对象
+
+@usage
+-- 在子页面工厂中调用创建组件演示页面
+local component_page = require("component_page").create(ui)
+]]
+
+function component_page.create(ui)
+    local win = ui.window({
+        background_color = ui.COLOR_WHITE,
+        x = 0,
+        y = 0,
+        w = 320,
+        h = 480
+    })
+
+
+    -- 标题
+    local title = ui.label({
+        x = 120,
+        y = 25,
+        text = "组件演示",
+        color = ui.COLOR_BLACK,
+        size = 16
+    })
+
+    -- 返回按钮
+    local btn_back = ui.button({
+        x = 20,
+        y = 20,
+        w = 60,
+        h = 30,
+        text = "返回",
+        on_click = function()
+            win:back()
+        end
+    })
+
+    -- ==================== 1. 进度条组件演示 ====================
+    local progress_label = ui.label({
+        x = 20,
+        y = 70,
+        text = "1. 进度条组件:",
+        color = ui.COLOR_BLACK,
+        size = 14
+    })
+
+    local progress_value = 0
+    local progress_bar = ui.progress_bar({
+        x = 20,
+        y = 100,
+        w = 180,
+        h = 26,
+        progress = progress_value
+    })
+
+    local btn_progress = ui.button({
+        x = 210,
+        y = 100,
+        w = 70,
+        h = 26,
+        text = "+10%",
+        on_click = function()
+            progress_value = progress_value + 10
+            if progress_value > 100 then
+                progress_value = 0
+            end
+            progress_bar:set_progress(progress_value)
+            progress_bar:set_text("进度: " .. progress_value .. "%")
+        end
+    })
+
+    -- ==================== 2. 复选框组件演示 ====================
+    local checkbox_label = ui.label({
+        x = 20,
+        y = 140,
+        text = "2. 复选框组件:",
+        color = ui.COLOR_BLACK,
+        size = 14
+    })
+
+    local checkbox1 = ui.check_box({
+        x = 20,
+        y = 170,
+        text = "选项A",
+        checked = false,
+        on_change = function(checked)
+            log.info("component_page", "选项A:", checked)
+        end
+    })
+
+    local checkbox2 = ui.check_box({
+        x = 120,
+        y = 170,
+        text = "选项B",
+        checked = true,
+        on_change = function(checked)
+            log.info("component_page", "选项B:", checked)
+        end
+    })
+
+    -- -- ==================== 3. 图片轮播组件演示 ====================
+    local picture_label = ui.label({
+        x = 20,
+        y = 220,
+        text = "3. 图片轮播组件:",
+        color = ui.COLOR_BLACK,
+        size = 14
+    })
+
+    local picture = ui.picture({
+        x = 20,
+        y = 250,
+        w = 128,
+        h = 128,
+        sources = { "/luadb/1.jpg", "/luadb/2.jpg", "/luadb/3.jpg" },
+        autoplay = true,
+        interval = 2000
+    })
+
+    -- ==================== 4. 按钮组件演示 ====================
+    local button_label = ui.label({
+        x = 20,
+        y = 400,
+        text = "4. 按钮组件:",
+        color = ui.COLOR_BLACK,
+        size = 14
+    })
+
+    -- 普通按钮
+    local normal_btn = ui.button({
+        x = 20,
+        y = 430,
+        w = 80,
+        h = 30,
+        text = "普通按钮",
+        on_click = function()
+            log.info("component_page", "普通按钮被点击")
+        end
+    })
+
+    -- 带颜色的按钮
+    local colored_btn = ui.button({
+        x = 110,
+        y = 430,
+        w = 80,
+        h = 30,
+        text = "蓝色按钮",
+        bg_color = ui.COLOR_BLUE,
+        text_color = ui.COLOR_WHITE,
+        on_click = function()
+            log.info("component_page", "蓝色按钮被点击")
+        end
+    })
+
+    -- 图片按钮
+    local image_btn = ui.button({
+        x = 200,
+        y = 413,
+        w = 64,
+        h = 64,
+        src = "/luadb/4.jpg",
+        src_toggled = "/luadb/5.jpg",
+        toggle = true,
+        on_click = function()
+            log.info("component_page", "图片按钮被点击")
+        end
+    })
+
+    -- 添加所有组件到窗口
+    win:add(title)
+    win:add(btn_back)
+    win:add(progress_label)
+    win:add(progress_bar)
+    win:add(btn_progress)
+    win:add(checkbox_label)
+    win:add(checkbox1)
+    win:add(checkbox2)
+    win:add(picture_label)
+    win:add(picture)
+    win:add(button_label)
+    win:add(normal_btn)
+    win:add(colored_btn)
+    win:add(image_btn)
+
+    return win
+end
+
+return component_page

+ 156 - 0
module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/ui/default_font_page.lua

@@ -0,0 +1,156 @@
+--[[
+@module  default_font_page
+@summary 默认字体演示页面模块
+@version 1.0
+@date    2025.12.3
+@author  江访
+@usage
+本文件为默认字体演示页面功能模块,核心业务逻辑为:
+1、创建演示窗口,展示内置12号点阵字体的固定大小特性;
+2、演示数字、符号、中英文混排的显示效果;
+3、展示默认字体的特性和限制说明;
+4、提供返回主页的导航功能;
+
+本文件的对外接口有1个:
+1、default_font_page.create(ui):创建默认字体演示页面;
+]]
+
+local default_font_page = {}
+
+--[[
+创建默认字体演示页面;
+
+@api default_font_page.create(ui)
+@summary 创建默认字体演示页面界面
+@table ui UI库对象
+@return table 默认字体演示窗口对象
+
+@usage
+-- 在子页面工厂中调用创建默认字体演示页面
+local default_font_page = require("default_font_page").create(ui)
+]]
+
+function default_font_page.create(ui)
+    local win = ui.window({
+        background_color = ui.COLOR_WHITE,
+        x = 0,
+        y = 0,
+        w = 320,
+        h = 480
+    })
+
+    -- 标题
+    local title = ui.label({
+        x = 120,
+        y = 25,
+        text = "默认字体演示",
+        color = ui.COLOR_BLACK,
+        size = 12
+    })
+
+    -- 返回按钮
+    local btn_back = ui.button({
+        x = 20,
+        y = 20,
+        w = 60,
+        h = 30,
+        text = "返回",
+        on_click = function()
+            win:back()
+        end
+    })
+
+    -- 字体演示标题
+    local demo_title = ui.label({
+        x = 20,
+        y = 70,
+        text = "字体演示 (固定12号):",
+        color = ui.COLOR_BLACK,
+        size = 12
+    })
+
+    -- 数字演示
+    local number_demo = ui.label({
+        x = 20,
+        y = 100,
+        text = "1、数字: 0123456789",
+        color = ui.COLOR_BLUE,
+        size = 12
+    })
+
+    -- 符号演示
+    local symbol_demo = ui.label({
+        x = 20,
+        y = 130,
+        text = "2、符号: !@#$%^&*()_+-=[]",
+        color = ui.COLOR_ORANGE,
+        size = 12
+    })
+
+    -- 中英文演示
+    local text_demo = ui.label({
+        x = 20,
+        y = 160,
+        text = "3、中英文: Hello 世界 ABC",
+        color = ui.COLOR_RED,
+        size = 12
+    })
+
+    -- 默认字体特性说明
+    local feature_title = ui.label({
+        x = 20,
+        y = 200,
+        text = "默认字体特性:",
+        color = ui.COLOR_BLACK,
+        size = 12
+    })
+
+    local feature1 = ui.label({
+        x = 20,
+        y = 230,
+        text = "- 内置12号点阵字体",
+        color = ui.COLOR_GRAY,
+        size = 12
+    })
+
+    local feature2 = ui.label({
+        x = 20,
+        y = 260,
+        text = "- 无需外部硬件支持",
+        color = ui.COLOR_GRAY,
+        size = 12
+    })
+
+    local feature3 = ui.label({
+        x = 20,
+        y = 290,
+        text = "- 启动快速,资源占用小",
+        color = ui.COLOR_GRAY,
+        size = 12
+    })
+
+    local feature4 = ui.label({
+        x = 20,
+        y = 320,
+        text = "- 字体大小固定为12号",
+        color = ui.COLOR_GRAY,
+        size = 12
+    })
+
+    -- 添加所有组件到窗口
+    win:add(title)
+    win:add(btn_back)
+    win:add(demo_title)
+    win:add(number_demo)
+    win:add(symbol_demo)
+    win:add(text_demo)
+    win:add(feature_title)
+    win:add(feature1)
+    win:add(feature2)
+    win:add(feature3)
+    win:add(feature4)
+
+    return win
+end
+
+return default_font_page

+ 165 - 0
module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/ui/gtfont_page.lua

@@ -0,0 +1,165 @@
+--[[
+@module  gtfont_page
+@summary GTFont矢量字体演示页面模块
+@version 1.0
+@date    2025.12.3
+@author  江访
+@usage
+本文件为GTFont矢量字体演示页面功能模块,核心业务逻辑为:
+1、创建带上下滚动功能的演示窗口,展示GTFont矢量字体特性;
+2、演示动态字体大小调整功能,展示的是12-32号字体切换,
+   GTFont支持10-192号字体,demo以展示GTFont特性为主;
+3、展示不同大小和颜色的数字、符号、中英文显示效果;
+4、提供GTFont特性说明和返回主页的导航功能;
+
+本文件的对外接口有1个:
+1、gtfont_page.create(ui):创建GTFont演示页面;
+]]
+
+local gtfont_page = {}
+local demo_state = {
+    current_size = 16
+}
+
+function gtfont_page.create(ui)
+    local win = ui.window({
+        background_color = ui.COLOR_WHITE,
+        x = 0,
+        y = 0,
+        w = 320,
+        h = 480
+    })
+
+    -- 标题
+    local title = ui.label({
+        x = 85,
+        y = 25,
+        text = "GTFont矢量字体演示",
+        color = ui.COLOR_BLACK,
+        size = 16
+    })
+
+    -- 返回按钮
+    local btn_back = ui.button({
+        x = 20,
+        y = 20,
+        w = 60,
+        h = 30,
+        text = "返回",
+        on_click = function()
+            win:back()
+        end
+    })
+
+    -- 动态字体大小演示区域
+    local dynamic_title = ui.label({
+        x = 20,
+        y = 70,
+        text = "动态字体大小调整:",
+        color = ui.COLOR_BLACK,
+        size = 16
+    })
+
+    local size_display = ui.label({
+        x = 20,
+        y = 100,
+        text = "当前字体: 16号 蓝色",
+        color = ui.COLOR_BLUE,
+        size = 16
+    })
+
+    local btn_change = ui.button({
+        x = 20,
+        y = 140,
+        w = 120,
+        h = 30,
+        text = "切换字体大小",
+        on_click = function()
+            demo_state.current_size = demo_state.current_size + 4
+            if demo_state.current_size > 32 then
+                demo_state.current_size = 12
+            end
+            size_display:set_text("当前字体: " .. demo_state.current_size .. "号 蓝色")
+            size_display:set_size(demo_state.current_size)
+        end
+    })
+
+    -- 字体演示标题
+    local demo_title = ui.label({
+        x = 20,
+        y = 180,
+        text = "字体演示:",
+        color = ui.COLOR_BLACK,
+        size = 16
+    })
+
+    -- 数字演示
+    local number_demo = ui.label({
+        x = 20,
+        y = 210,
+        text = "数字: 0123456789",
+        color = ui.COLOR_BLUE,
+        size = 14
+    })
+
+    -- 符号演示
+    local symbol_demo = ui.label({
+        x = 20,
+        y = 250,
+        text = "符号: !@#$%^&*()_+-=[]",
+        color = ui.COLOR_ORANGE,
+        size = 20
+    })
+
+    -- 中英文演示
+    local text_demo = ui.label({
+        x = 20,
+        y = 300,
+        text = "中英文: LuatOS",
+        color = ui.COLOR_RED,
+        size = 28
+    })
+
+    -- 特性说明
+    local feature_title = ui.label({
+        x = 20,
+        y = 350,
+        text = "GTFont特性:",
+        color = ui.COLOR_BLACK,
+        size = 14
+    })
+
+    local feature1 = ui.label({
+        x = 20,
+        y = 380,
+        text = "- 使用AirFONTS_1000配件板",
+        color = ui.COLOR_GRAY,
+        size = 12
+    })
+
+    local feature2 = ui.label({
+        x = 20,
+        y = 410,
+        text = "- 支持10到192号黑体字体",
+        color = ui.COLOR_GRAY,
+        size = 12
+    })
+
+    -- 添加所有组件到窗口
+    win:add(title)
+    win:add(btn_back)
+    win:add(dynamic_title)
+    win:add(size_display)
+    win:add(btn_change)
+    win:add(demo_title)
+    win:add(number_demo)
+    win:add(symbol_demo)
+    win:add(text_demo)
+    win:add(feature_title)
+    win:add(feature1)
+    win:add(feature2)
+
+    return win
+end
+
+return gtfont_page

+ 129 - 0
module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/ui/home_page.lua

@@ -0,0 +1,129 @@
+--[[
+@module  home_page
+@summary 主页模块,提供应用主界面和页面导航功能
+@version 1.0
+@date    2025.12.3
+@author  江访
+@usage
+本文件为主页功能模块,核心业务逻辑为:
+1、创建应用主窗口并配置背景颜色;
+2、配置子页面工厂函数,管理各演示页面的创建;
+3、创建标题和功能按钮,提供页面导航功能;
+4、处理按钮点击事件,实现页面切换;
+
+本文件的对外接口有1个:
+1、home_page.create():创建主页界面;
+]]
+
+local home_page = {}
+
+--[[
+创建主页界面;
+
+@api home_page.create()
+@summary 创建并配置应用主页面
+@return nil
+
+@usage
+-- 在UI主程序中调用创建主页
+home_page.create()
+]]
+
+function home_page.create()
+    -- 创建主页
+    local home = ui.window({ background_color = ui.COLOR_WHITE })
+    home.visible = true
+
+    -- 配置子页面工厂
+    home:configure_subpages({
+        component = function() return require("component_page").create(ui) end,
+        default_font = function() return require("default_font_page").create(ui) end,
+        gtfont = function() return require("gtfont_page").create(ui) end,
+        hzfont = function() return require("hzfont_page").create(ui) end
+    })
+
+    -- 标题
+    local title = ui.label({
+        x = 80,
+        y = 30,
+        text = "exEasyUI v1.7.0演示系统",
+        color = ui.COLOR_BLACK,
+        size = 16
+    })
+
+    local subtitle = ui.label({
+        x = 80,
+        y = 60,
+        text = "boot键:选择 pwr键:确认",
+        color = ui.COLOR_GRAY,
+        size = 12
+    })
+
+    -- 组件演示按钮
+    local btn_component = ui.button({
+        x = 20,
+        y = 100,
+        w = 280,
+        h = 50,
+        text = "组件演示",
+        bg_color = ui.COLOR_BLUE,
+        text_color = ui.COLOR_WHITE,
+        on_click = function()
+            home:show_subpage("component")
+        end
+    })
+
+    -- 默认字体演示按钮
+    local btn_default_font = ui.button({
+        x = 20,
+        y = 170,
+        w = 280,
+        h = 50,
+        text = "默认字体演示",
+        bg_color = ui.COLOR_RED,
+        text_color = ui.COLOR_WHITE,
+        on_click = function()
+            home:show_subpage("default_font")
+        end
+    })
+
+    -- GTFont演示按钮
+    local btn_gtfont = ui.button({
+        x = 20,
+        y = 240,
+        w = 280,
+        h = 50,
+        text = "GTFont演示",
+        bg_color = ui.COLOR_GREEN,
+        text_color = ui.COLOR_WHITE,
+        on_click = function()
+            home:show_subpage("gtfont")
+        end
+    })
+
+    -- HZFont演示按钮
+    local btn_hzfont = ui.button({
+        x = 20,
+        y = 310,
+        w = 280,
+        h = 50,
+        text = "HZFont演示",
+        bg_color = ui.COLOR_ORANGE,
+        text_color = ui.COLOR_WHITE,
+        on_click = function()
+            home:show_subpage("hzfont")
+        end
+    })
+
+    -- 添加所有组件到窗口
+    home:add(title)
+    home:add(subtitle)
+    home:add(btn_component)
+    home:add(btn_default_font)
+    home:add(btn_gtfont)
+    home:add(btn_hzfont)
+
+    ui.add(home)
+end
+
+return home_page

+ 293 - 0
module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/ui/hzfont_page.lua

@@ -0,0 +1,293 @@
+--[[
+@module  hzfont_page
+@summary HZFont矢量字体演示页面模块
+@version 1.0
+@date    2025.12.3
+@author  江访
+@usage
+本文件为HZFont矢量字体演示页面模块,核心业务逻辑为:
+1、创建HZFont矢量字体演示页面,展示矢量字体的动态调整能力;
+2、演示多种字体大小和颜色的文本显示效果;
+3、提供字体大小动态切换功能,展示矢量字体的缩放优势;
+4、展示HZFont矢量字体的特性和应用场景;
+
+本文件的对外接口有1个:
+1、hzfont_page.create(ui):创建并返回HZFont演示窗口;
+]]
+
+local hzfont_page = {}
+
+--[[
+页面演示状态记录表
+
+@table demo_state
+@field current_size number 当前演示字体大小,初始值为16号
+]]
+local demo_state = {
+    current_size = 16  -- 当前字体大小,从16号开始
+}
+
+--[[
+创建HZFont矢量字体演示页面窗口;
+
+@api hzfont_page.create(ui)
+
+@summary 创建HZFont矢量字体演示页面
+
+@param ui table exEasyUI库对象,用于创建UI组件
+
+@return table 返回创建的窗口对象
+
+@usage
+-- 在页面切换逻辑中调用
+local hzfont_win = hzfont_page.create(ui)
+return hzfont_win
+]]
+function hzfont_page.create(ui)
+    --[[
+    创建主窗口
+    @param background_color number 窗口背景颜色,白色
+    @param x number 窗口左上角X坐标,0
+    @param y number 窗口左上角Y坐标,0
+    @param w number 窗口宽度,320像素
+    @param h number 窗口高度,480像素
+    ]]
+    local win = ui.window({
+        background_color = ui.COLOR_WHITE,
+        x = 0,
+        y = 0,
+        w = 320,
+        h = 480
+    })
+
+    --[[
+    页面标题标签
+    @param x number 标签左上角X坐标,85像素
+    @param y number 标签左上角Y坐标,25像素
+    @param text string 标签文本内容
+    @param color number 文本颜色,黑色
+    @param size number 字体大小,16号
+    ]]
+    local title = ui.label({
+        x = 85,
+        y = 25,
+        text = "HZFont矢量字体演示",
+        color = ui.COLOR_BLACK,
+        size = 16
+    })
+
+    --[[
+    返回按钮
+    @param x number 按钮左上角X坐标,20像素
+    @param y number 按钮左上角Y坐标,20像素
+    @param w number 按钮宽度,60像素
+    @param h number 按钮高度,30像素
+    @param text string 按钮文本
+    @param on_click function 按钮点击回调函数,调用窗口的back方法返回上一页
+    ]]
+    local btn_back = ui.button({
+        x = 20,
+        y = 20,
+        w = 60,
+        h = 30,
+        text = "返回",
+        on_click = function()
+            win:back()
+        end
+    })
+
+    --[[
+    动态字体大小调整标题
+    @param x number 标签左上角X坐标,20像素
+    @param y number 标签左上角Y坐标,70像素
+    @param text string 标签文本内容
+    @param color number 文本颜色,黑色
+    @param size number 字体大小,16号
+    ]]
+    local dynamic_title = ui.label({
+        x = 20,
+        y = 70,
+        text = "动态字体大小调整:",
+        color = ui.COLOR_BLACK,
+        size = 16
+    })
+
+    --[[
+    字体大小信息显示标签
+    @param x number 标签左上角X坐标,20像素
+    @param y number 标签左上角Y坐标,100像素
+    @param text string 标签文本内容,显示当前字体大小
+    @param color number 文本颜色,蓝色
+    @param size number 字体大小,16号
+    ]]
+    local size_info = ui.label({
+        x = 20,
+        y = 100,
+        text = "当前大小: 16号 (可调整)",
+        color = ui.COLOR_BLUE,
+        size = 16
+    })
+
+    --[[
+    字体大小切换按钮
+    @param x number 按钮左上角X坐标,20像素
+    @param y number 按钮左上角Y坐标,140像素
+    @param w number 按钮宽度,120像素
+    @param h number 按钮高度,30像素
+    @param text string 按钮文本
+    @param on_click function 按钮点击回调函数,切换字体大小
+    ]]
+    local btn_change_size = ui.button({
+        x = 20,
+        y = 140,
+        w = 120,
+        h = 30,
+        text = "切换字体大小",
+        on_click = function()
+            -- 每次点击增加4号字体大小
+            demo_state.current_size = demo_state.current_size + 4
+            
+            -- 当字体大小超过32号时,重置为12号
+            if demo_state.current_size > 32 then
+                demo_state.current_size = 12
+            end
+            
+            -- 更新标签文本和字体大小
+            size_info:set_text("当前字体大小: " .. demo_state.current_size .. "号")
+            size_info:set_size(demo_state.current_size)
+        end
+    })
+
+    --[[
+    字体演示区域标题
+    @param x number 标签左上角X坐标,20像素
+    @param y number 标签左上角Y坐标,180像素
+    @param text string 标签文本内容
+    @param color number 文本颜色,黑色
+    @param size number 字体大小,16号
+    ]]
+    local demo_title = ui.label({
+        x = 20,
+        y = 180,
+        text = "字体演示:",
+        color = ui.COLOR_BLACK,
+        size = 16
+    })
+
+    --[[
+    数字演示标签
+    @param x number 标签左上角X坐标,20像素
+    @param y number 标签左上角Y坐标,210像素
+    @param text string 标签文本内容,显示数字
+    @param color number 文本颜色,蓝色
+    @param size number 字体大小,14号
+    ]]
+    local number_demo = ui.label({
+        x = 20,
+        y = 210,
+        text = "数字: 0123456789",
+        color = ui.COLOR_BLUE,
+        size = 14
+    })
+
+    --[[
+    符号演示标签
+    @param x number 标签左上角X坐标,20像素
+    @param y number 标签左上角Y坐标,250像素
+    @param text string 标签文本内容,显示特殊符号
+    @param color number 文本颜色,橙色
+    @param size number 字体大小,20号
+    ]]
+    local symbol_demo = ui.label({
+        x = 20,
+        y = 250,
+        text = "符号: !@#$%^&*()_+-=[]",
+        color = ui.COLOR_ORANGE,
+        size = 20
+    })
+
+    --[[
+    中英文演示标签
+    @param x number 标签左上角X坐标,20像素
+    @param y number 标签左上角Y坐标,300像素
+    @param text string 标签文本内容,显示中英文混合文本
+    @param color number 文本颜色,红色
+    @param size number 字体大小,28号
+    ]]
+    local text_demo = ui.label({
+        x = 20,
+        y = 300,
+        text = "中英文: LuatOS",
+        color = ui.COLOR_RED,
+        size = 28
+    })
+
+    --[[
+    HZFont特性说明标题
+    @param x number 标签左上角X坐标,20像素
+    @param y number 标签左上角Y坐标,350像素
+    @param text string 标签文本内容
+    @param color number 文本颜色,黑色
+    @param size number 字体大小,14号
+    ]]
+    local feature_title = ui.label({
+        x = 20,
+        y = 350,
+        text = "HZFont特性:",
+        color = ui.COLOR_BLACK,
+        size = 14
+    })
+
+    --[[
+    HZFont特性说明第一条
+    @param x number 标签左上角X坐标,20像素
+    @param y number 标签左上角Y坐标,380像素
+    @param text string 标签文本内容,说明HZFont的内置特性
+    @param color number 文本颜色,灰色
+    @param size number 字体大小,12号
+    ]]
+    local feature1 = ui.label({
+        x = 20,
+        y = 380,
+        text = "- 内置矢量字体,无需外部硬件",
+        color = ui.COLOR_GRAY,
+        size = 12
+    })
+
+    --[[
+    HZFont特性说明第二条
+    @param x number 标签左上角X坐标,20像素
+    @param y number 标签左上角Y坐标,410像素
+    @param text string 标签文本内容,说明HZFont的动态调整能力
+    @param color number 文本颜色,灰色
+    @param size number 字体大小,12号
+    ]]
+    local feature2 = ui.label({
+        x = 20,
+        y = 410,
+        text = "- 支持10-100号字体动态调整",
+        color = ui.COLOR_GRAY,
+        size = 12
+    })
+
+    --[[
+    将创建的UI组件添加到窗口
+    按照从背景到前景的顺序添加,确保显示层次正确
+    ]]
+    win:add(title)
+    win:add(btn_back)
+    win:add(dynamic_title)
+    win:add(size_info)
+    win:add(btn_change_size)
+    win:add(demo_title)
+    win:add(number_demo)
+    win:add(symbol_demo)
+    win:add(text_demo)
+    win:add(feature_title)
+    win:add(feature1)
+    win:add(feature2)
+
+    return win
+end
+
+return hzfont_page

+ 333 - 0
module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/ui/key_handler.lua

@@ -0,0 +1,333 @@
+--[[
+@module  key_handler
+@summary 按键处理模块
+@version 1.0
+@date    2025.12.3
+@author  江访
+@usage
+本文件为按键处理功能模块,核心业务逻辑为:
+1、管理页面可点击区域列表,支持动态区域注册;
+2、处理按键事件,实现光标在可点击区域间的切换;
+3、提供光标绘制和清除功能,视觉上标记当前焦点;
+4、支持模拟点击操作,触发界面元素响应;
+5、实现页面切换时的区域列表更新;
+
+本文件的对外接口有8个:
+1、key_handler.register_page():注册页面区域回调函数;
+2、key_handler.switch_to_page():切换到指定页面;
+3、key_handler.clear_areas():清空当前区域列表;
+4、key_handler.add_area():添加可点击区域;
+5、key_handler.next_area():切换到下一个区域;
+6、key_handler.simulate_click():模拟点击当前区域;
+7、key_handler.set_visible():显示/隐藏光标;
+8、key_handler.get_current_area():获取当前区域信息;
+]]
+
+local key_handler = {}
+
+-- 模块内部状态
+local clickable_areas = {}
+local current_area_index = 0
+local page_callbacks = {}
+local config = {
+    cursor_thickness = 2,
+    cursor_color = 0xFF0000,
+    show_cursor = true,
+    last_switch_time = 0
+}
+local current_drawn_rect = nil
+
+
+--[[
+注册页面区域回调函数;
+
+@api key_handler.register_page(page_name, callback)
+
+@summary 注册页面的可点击区域回调函数
+
+@string
+page_name
+页面名称标识符,用于后续页面切换时引用;
+
+@function
+callback
+区域注册回调函数,函数内应调用key_handler.clear_areas()和key_handler.add_area()来定义页面的可点击区域;
+
+@return nil
+
+@usage
+key_handler.register_page("home", function()
+    key_handler.clear_areas()
+    key_handler.add_area(20, 100, 280, 50)  -- 主页按钮1
+    key_handler.add_area(20, 170, 280, 50)  -- 主页按钮2
+end)
+]]
+function key_handler.register_page(page_name, callback)
+    page_callbacks[page_name] = callback
+end
+
+--[[
+切换到指定页面并更新区域列表;
+
+@api key_handler.switch_to_page(page_name)
+
+@summary 切换到指定页面
+
+@string
+page_name
+目标页面名称,必须已通过key_handler.register_page()注册;
+
+@return boolean
+切换成功返回true,失败返回false;
+
+@usage
+local result = key_handler.switch_to_page("home")
+if result then
+    log.info("成功切换到主页")
+end
+]]
+function key_handler.switch_to_page(page_name)
+    key_handler.clear_cursor()
+
+    if page_callbacks[page_name] then
+        page_callbacks[page_name]()
+    else
+        clickable_areas = {}
+    end
+
+    if #clickable_areas > 0 then
+        current_area_index = 1
+        config.last_switch_time = mcu.ticks()
+        key_handler.draw_cursor()
+        return true
+    else
+        current_area_index = 0
+        return false
+    end
+end
+
+-- 清空区域
+function key_handler.clear_areas()
+    key_handler.clear_cursor()
+    clickable_areas = {}
+    current_area_index = 0
+end
+
+-- 添加区域
+function key_handler.add_area(x, y, w, h)
+    table.insert(clickable_areas, { x = x, y = y, w = w, h = h })
+
+    if #clickable_areas == 1 and current_area_index == 0 then
+        current_area_index = 1
+        config.last_switch_time = mcu.ticks()
+    end
+end
+
+-- 获取当前区域矩形
+local function get_current_area_rect()
+    if current_area_index < 1 or current_area_index > #clickable_areas then
+        return nil
+    end
+
+    local area = clickable_areas[current_area_index]
+    return {
+        x1 = area.x - 3,
+        y1 = area.y - 3,
+        x2 = area.x + area.w + 3,
+        y2 = area.y + area.h + 3
+    }
+end
+
+-- 获取当前区域中心
+local function get_current_area_center()
+    if current_area_index < 1 or current_area_index > #clickable_areas then
+        return 160, 240
+    end
+
+    local area = clickable_areas[current_area_index]
+    local center_x = area.x + math.floor(area.w / 2)
+    local center_y = area.y + math.floor(area.h / 2)
+
+    return center_x, center_y
+end
+
+-- 清除光标
+function key_handler.clear_cursor()
+    if current_drawn_rect then
+        lcd.setColor(0xFFFFFF, 0xFFFFFF)
+        local r = current_drawn_rect
+        for i = 1, config.cursor_thickness do
+            local offset = i - 1
+            lcd.drawRectangle(
+                r.x1 + offset,
+                r.y1 + offset,
+                r.x2 - offset,
+                r.y2 - offset
+            )
+        end
+        current_drawn_rect = nil
+    end
+end
+
+-- 绘制光标
+function key_handler.draw_cursor()
+    if not config.show_cursor then
+        return
+    end
+    if current_area_index < 1 or current_area_index > #clickable_areas then
+        return
+    end
+
+    key_handler.clear_cursor()
+
+    local rect = get_current_area_rect()
+    if not rect then return end
+
+    current_drawn_rect = rect
+    lcd.setColor(0xFFFFFF, config.cursor_color)
+
+    local thickness = config.cursor_thickness
+    for i = 1, thickness do
+        local offset = i - 1
+        lcd.drawRectangle(
+            rect.x1 + offset,
+            rect.y1 + offset,
+            rect.x2 - offset,
+            rect.y2 - offset
+        )
+    end
+
+    config.last_switch_time = mcu.ticks()
+end
+
+--[[
+切换到下一个可点击区域;
+
+@api key_handler.next_area()
+
+@summary 在可点击区域间循环切换焦点
+
+@return boolean
+切换成功返回true,失败返回false;
+
+@usage
+local result = key_handler.next_area()
+if result then
+    log.info("已切换到下一个区域")
+end
+]]
+function key_handler.next_area()
+    if #clickable_areas == 0 then
+        return false
+    end
+
+    local old_index = current_area_index
+    current_area_index = current_area_index + 1
+    if current_area_index > #clickable_areas then
+        current_area_index = 1
+    end
+
+    key_handler.draw_cursor()
+    return true
+end
+
+--[[
+模拟点击当前选中区域;
+
+@api key_handler.simulate_click()
+
+@summary 模拟点击当前焦点区域
+
+@return number, number
+返回点击的坐标X, Y;如果当前没有选中区域,返回0, 0;
+
+@usage
+local x, y = key_handler.simulate_click()
+log.info("点击坐标:", x, ",", y)
+]]
+function key_handler.simulate_click()
+    if #clickable_areas == 0 or current_area_index == 0 then
+        return 0, 0
+    end
+
+    local center_x, center_y = get_current_area_center()
+    -- exeasyui必须先按下再单击
+    sys.publish("BASE_TOUCH_EVENT", "TOUCH_DOWN", center_x, center_y)
+    sys.publish("BASE_TOUCH_EVENT", "SINGLE_TAP", center_x, center_y)
+
+    return center_x, center_y
+end
+
+--[[
+显示或隐藏光标;
+
+@api key_handler.set_visible(visible)
+
+@summary 设置光标可见性
+
+@boolean
+visible
+true表示显示光标,false表示隐藏光标;
+
+@return nil
+
+@usage
+key_handler.set_visible(true)   -- 显示光标
+key_handler.set_visible(false)  -- 隐藏光标
+]]
+function key_handler.set_visible(visible)
+    config.show_cursor = visible
+
+    if not visible then
+        key_handler.clear_cursor()
+    else
+        key_handler.draw_cursor()
+    end
+end
+
+--[[
+获取当前选中区域信息;
+
+@api key_handler.get_current_area()
+
+@summary 获取当前焦点区域的详细信息
+
+@return table or nil
+区域信息表,包含以下字段:
+- index: number 当前区域索引
+- total: number 总区域数
+- x: number 区域X坐标
+- y: number 区域Y坐标
+- w: number 区域宽度
+- h: number 区域高度
+- center_x: number 中心点X坐标
+- center_y: number 中心点Y坐标
+如果没有选中区域,返回nil;
+
+@usage
+local area = key_handler.get_current_area()
+if area then
+    log.info("当前区域:", area.index, "/", area.total)
+end
+]]
+function key_handler.get_current_area()
+    if current_area_index < 1 or current_area_index > #clickable_areas then
+        return nil
+    end
+
+    local area = clickable_areas[current_area_index]
+    local center_x, center_y = get_current_area_center()
+
+    return {
+        index = current_area_index,
+        total = #clickable_areas,
+        x = area.x,
+        y = area.y,
+        w = area.w,
+        h = area.h,
+        center_x = center_x,
+        center_y = center_y
+    }
+end
+
+return key_handler

+ 178 - 0
module/Air8000/demo/accessory_board/AirLCD_1000/exeasyui/ui/ui_main.lua

@@ -0,0 +1,178 @@
+--[[
+@module  ui_main
+@summary exEasyUI主程序模块
+@version 1.0
+@date    2025.12.3
+@author  江访
+@usage
+本文件为exEasyUI主程序模块,核心业务逻辑为:
+1、初始化UI主题和窗口系统;
+2、注册所有页面的可点击区域回调函数;
+3、包装窗口方法以捕获页面切换事件;
+4、订阅按键事件并分发到按键处理器;
+5、启动UI渲染主循环,维持界面刷新;
+
+本文件的对外接口有0个:
+1、require加载后自动启动UI主任务;
+]]
+
+local home_page = require("home_page")
+local key_handler = require("key_handler")
+
+-- 页面名称常量
+local PAGE_NAMES = {
+    HOME = "home",
+    COMPONENT = "component",
+    DEFAULT_FONT = "default_font",
+    GTFONT = "gtfont",
+    HZFONT = "hzfont"
+}
+
+-- 当前页面
+local current_page = nil
+
+-- 处理按键事件
+local function handle_key_event(event_type)
+    if event_type == "boot_down" then
+        key_handler.next_area()
+    elseif event_type == "pwr_down" then
+        key_handler.simulate_click()
+    end
+end
+
+-- 主页区域回调函数
+local function home_page_callback()
+    key_handler.clear_areas()
+    key_handler.add_area(20, 100, 280, 50) -- 组件按钮
+    key_handler.add_area(20, 170, 280, 50) -- 默认字体按钮
+    key_handler.add_area(20, 240, 280, 50) -- GTFont按钮
+    key_handler.add_area(20, 310, 280, 50) -- HZFont按钮
+    log.info("ui_main", "已注册主页区域,共4个区域")
+end
+
+-- 组件页面区域回调函数
+local function component_page_callback()
+    key_handler.clear_areas()
+    key_handler.add_area(20, 20, 60, 30)   -- 返回按钮
+    key_handler.add_area(210, 100, 70, 26) -- +10%按钮
+    key_handler.add_area(20, 170, 60, 30)  -- 复选框A
+    key_handler.add_area(120, 170, 60, 30) -- 复选框B
+    key_handler.add_area(20, 430, 80, 30)  -- 普通按钮
+    key_handler.add_area(110, 430, 80, 30) -- 蓝色按钮
+    key_handler.add_area(200, 430, 64, 30) -- 图片按钮
+    log.info("ui_main", "已注册组件页面区域,共7个区域")
+end
+
+-- 默认字体页面区域回调函数
+local function default_font_page_callback()
+    key_handler.clear_areas()
+    key_handler.add_area(20, 20, 60, 30) -- 返回
+    log.info("ui_main", "已注册默认字体页面区域,共1个区域")
+end
+
+-- GTFont页面区域回调函数
+local function gtfont_page_callback()
+    key_handler.clear_areas()
+    key_handler.add_area(20, 20, 60, 30)   -- 返回
+    key_handler.add_area(20, 140, 120, 30) -- 切换字体按钮
+    log.info("ui_main", "已注册GTFont页面区域,共2个区域")
+end
+
+-- HZFont页面区域回调函数
+local function hzfont_page_callback()
+    key_handler.clear_areas()
+    key_handler.add_area(20, 20, 60, 30)   -- 返回
+    key_handler.add_area(20, 140, 120, 30) -- 切换字体按钮
+    log.info("ui_main", "已注册HZFont页面区域,共2个区域")
+end
+
+-- 注册所有页面的回调函数
+local function register_all_pages()
+    key_handler.register_page(PAGE_NAMES.HOME, home_page_callback)
+    key_handler.register_page(PAGE_NAMES.COMPONENT, component_page_callback)
+    key_handler.register_page(PAGE_NAMES.DEFAULT_FONT, default_font_page_callback)
+    key_handler.register_page(PAGE_NAMES.GTFONT, gtfont_page_callback)
+    key_handler.register_page(PAGE_NAMES.HZFONT, hzfont_page_callback)
+end
+
+-- 页面切换处理
+local function handle_page_change(page_name)
+    if not page_name then
+        page_name = PAGE_NAMES.HOME
+    end
+
+    if page_name ~= current_page then
+        current_page = page_name
+        key_handler.switch_to_page(page_name)
+    end
+end
+
+-- 页面切换任务函数
+local function show_subpage_task(page_name)
+    handle_page_change(page_name)
+end
+
+local function back_task()
+    handle_page_change(PAGE_NAMES.HOME)
+end
+
+-- 包装的show_subpage方法
+local function wrapped_show_subpage(self, page_name)
+    -- 调用原始方法
+    local original_show_subpage = getmetatable(self).original_show_subpage
+    original_show_subpage(self, page_name)
+
+    if page_name then
+        sys.taskInit(show_subpage_task, page_name)
+    end
+end
+
+-- 包装的back方法
+local function wrapped_back(self)
+    -- 调用原始方法
+    local original_back = getmetatable(self).original_back
+    original_back(self)
+
+    sys.taskInit(back_task)
+end
+
+-- 包装窗口方法
+local function wrap_window_methods()
+    local test_win = ui.window({})
+    local window_meta = getmetatable(test_win)
+
+    -- 保存原始方法
+    window_meta.original_show_subpage = window_meta.show_subpage
+    window_meta.original_back = window_meta.back
+
+    -- 替换为包装的方法
+    window_meta.show_subpage = wrapped_show_subpage
+    window_meta.back = wrapped_back
+end
+
+-- 启动UI主任务
+local function ui_main()
+    -- 初始化UI主题
+    ui.sw_init({ theme = "light" })
+
+    -- 包装窗口方法
+    wrap_window_methods()
+    register_all_pages()
+
+    -- 创建主页
+    home_page.create()
+
+    -- 确保光标显示
+    key_handler.switch_to_page(PAGE_NAMES.HOME)
+
+    -- 订阅按键事件
+    sys.subscribe("KEY_EVENT", handle_key_event)
+
+    -- 主渲染循环
+    while true do
+        ui.refresh()
+        sys.wait(30)
+    end
+end
+
+sys.taskInit(ui_main)