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

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

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

+ 0 - 230
module/Air780EHM_Air780EHV_Air780EGH/demo/accessory_board/AirLCD_1000/AirLCD_1000.lua

@@ -1,230 +0,0 @@
---[[
-@module  AirLCD_1000
-@summary AirLCD_1000显示驱动模块
-@version 1.0
-@date    2025.09.4
-@author  江访
-@usage
-
-核心业务逻辑为:
-1、初始化AirLCD_1000显示屏
-2、管理屏幕背光亮度及开关状态
-3、管理屏幕休眠和唤醒状态
-4、提供屏幕状态管理功能
-
-本文件的对外接口有5个:
-1、AirLCD_1000.lcd_init()           --LCD初始化函数,
-2、AirLCD_1000.set_backlight(level) -- 设置背光亮度接口,level 亮度级别(0-100)
-3、AirLCD_1000.lcd_on()             -- 开启LCD背光
-4、AirLCD_1000.lcd_off()            -- 关闭LCD背光
-5、AirLCD_1000.set_sleep(sleep)     -- 设置休眠状态接口,sleep:true进入休眠, false唤醒
-]]
-
--- AirLCD_1000.lua - LCD显示驱动模块
--- 此文件负责初始化LCD显示屏,管理背光及休眠状态
-local AirLCD_1000 = {}
-
--- 屏幕状态管理表
-local screen_state = {
-    lcd_pin_pwr = 1,        -- 屏幕背光引脚GPIO号
-    lcd_pwm_id = 0,         -- 屏幕背光引脚PWM端口号
-    is_sleeping = false,    -- 是否休眠中标识
-    last_brightness = 50,   -- 默认亮度50%
-    backlight_on = true     -- 背光默认开启
-}
-
--- LCD初始化函数
--- @param LCD_MODEL   显示屏型号型号
--- @param lcd_vcc     屏幕供电引脚GPIO号
--- @param lcd_pin_rst 复位引脚GPIO号
--- @param lcd_pin_pwr 背光引脚GPIO号
--- @param lcd_pwm_id  背光引脚PWM端口号
-
-function AirLCD_1000.lcd_init(LCD_MODEL, lcd_vcc, lcd_pin_rst, lcd_pin_pwr,lcd_pwm_id)
-    -- 根据接线设置AirLCD_1000初始化参数
-    local LCD_MODEL, lcd_vcc, lcd_pin_rst, lcd_pin_pwr,lcd_pwm_id = "AirLCD_1000" or LCD_MODEL, lcd_vcc or 29, lcd_pin_rst or 36, lcd_pin_pwr or 1, lcd_pwm_id or 0
-
-    -- 设置屏幕尺寸
-    local width, height = 320, 480
-
-    -- LCD参数配置表
-    local lcd_param = {
-        port = lcd.HWID_0,       -- 使用SPI设备模式
-        pin_dc = 0xff,           -- DC引脚,无需设置
-        pin_rst = lcd_pin_rst,   -- 复位引脚,对应GPIO号
-        pin_pwr = lcd_pin_pwr,   -- 背光引脚(可选)
-        direction = 0,           -- 屏幕默认0°方向
-                                 -- 0:0°, 1:90°, 2:180°, 3:270°
-        w = width,               -- 屏幕宽度(像素)
-        h = height,              -- 屏幕高度(像素)
-        xoffset = 0,             -- X方向偏移量
-        yoffset = 0,             -- Y方向偏移量
-        sleepcmd = 0x10,         -- 睡眠命令
-        wakecmd = 0x11           -- 唤醒命令
-    }
-
-    -- 初始化SPI设备
-    spi.deviceSetup(
-        lcd.HWID_0,  -- LCD端口号
-        nil,         -- CS片选脚,可选
-        0,           -- CPHA=0
-        0,           -- CPOL=0
-        8,           -- 8位数据宽度
-        20000000,    -- 20MHz波特率
-        spi.MSB,     -- 高位先传
-        1,           -- 主机模式
-        1            -- 全双工模式
-    )
-
-    -- 设置VCC/RST/背光引脚为输出模式,并启用上拉电阻
-    gpio.setup(lcd_vcc, 1, gpio.PULLUP)
-    gpio.setup(lcd_pin_rst, 0, gpio.PULLUP)
-    gpio.setup(lcd_pin_pwr, 1, gpio.PULLUP)
-    
-    -- 开启屏幕VCC供电
-    gpio.set(lcd_vcc, 1)
-
-    -- 拉低屏幕复位引脚
-    gpio.set(lcd_pin_rst, 0)  -- 拉低复位引脚
-    sys.wait(20)                    -- 等待20ms(ST7796复位拉低大于10ms生效)
-    gpio.set(lcd_pin_rst, 1)  -- 拉高复位引脚
-    sys.wait(150)                   -- 等待150ms(ST7796复位拉高大于120ms重置)
-    gpio.set(lcd_pin_pwr, 1)
-
-    -- 初始化ST7796显示芯片
-    lcd.init("st7796", lcd_param)
-
-    -- 通用显示设置
-    lcd.setupBuff(nil,false)     -- 设置帧缓冲区
-    lcd.autoFlush(false)         -- 禁止自动刷新
-
-    screen_state.lcd_pin_pwr = lcd_pin_pwr
-    screen_state.lcd_pwm_id = lcd_pwm_id
-
-    log.info("AirLCD_1000", "LCD初始化成功,尺寸:", width, "x", height)
-    -- return true
-end
-
--- 设置背光亮度接口
--- 使用背光PWM模式控制亮度,休眠和关闭背光使用背光引脚GPIO模式
--- @param level 亮度级别(0-100)
--- @return 设置成功状态
-function AirLCD_1000.set_backlight(level)
-
-    -- 检查屏幕状态和PWM配置
-    if screen_state.is_sleeping then
-        log.warn("AirLCD_1000", "屏幕处于休眠状态,无法调节背光")
-        return false
-    end
-    if not screen_state.lcd_pin_pwr then
-        log.error("AirLCD_1000", "PWM配置不存在,无法调节背光")
-        return false
-    end
-
-    -- 确保GPIO已关闭 
-    gpio.close(screen_state.lcd_pin_pwr)
-
-    -- 设置并开启PWM
-    pwm.stop(screen_state.lcd_pwm_id)
-    pwm.close(screen_state.lcd_pwm_id)
-    pwm.setup(screen_state.lcd_pwm_id, 1000, 100)
-    pwm.open(screen_state.lcd_pwm_id, 1000, level)
-
-    -- 修改默认背光亮度为当前设置
-    screen_state.last_brightness = level
-    screen_state.backlight_on = (level > 0)
-    log.info("AirLCD_1000", "背光设置为", level, "%")
-    return true
-end
-
--- 开启LCD显示屏背光
--- @return 操作成功状态
-function AirLCD_1000.lcd_on()
-    if screen_state.is_sleeping then
-        log.warn("AirLCD_1000", "屏幕处于休眠状态,无法开启背光")
-        return false
-    end
-
-    pwm.stop(screen_state.lcd_pwm_id)
-    pwm.close(screen_state.lcd_pwm_id)
-
-    -- 设置GPIO控制电源(如果存在)
-    if screen_state.lcd_pin_pwr then
-        gpio.setup(screen_state.lcd_pin_pwr, 1, gpio.PULLUP)
-    end
-
-    lcd.on()
-    log.info("AirLCD_1000", "LCD背光已开启")
-end
-
--- 关闭LCD显示屏背光
--- @return 操作成功状态
-function AirLCD_1000.lcd_off()
-    if screen_state.is_sleeping then
-        log.warn("AirLCD_1000", "屏幕处于休眠状态,无法关闭背光")
-        return false
-    end
-    pwm.stop(screen_state.lcd_pwm_id)
-    pwm.close(screen_state.lcd_pwm_id)
-        -- 设置GPIO控制电源(如果存在)
-    if screen_state.lcd_pin_pwr then
-        gpio.setup(screen_state.lcd_pin_pwr, 1, gpio.PULLUP)
-    end
-    lcd.off()
-    log.info("AirLCD_1000", "LCD背光已关闭")
-end
-
--- 设置休眠状态接口
--- @param sleep true进入休眠, false唤醒
--- @return 操作成功状态
-function AirLCD_1000.set_sleep(sleep)
-    if sleep then
-        -- 进入休眠模式
-        if not screen_state.is_sleeping then
-            -- 关闭PWM(如果存在)
-            if screen_state.lcd_pwm_id then
-                pwm.stop(screen_state.lcd_pwm_id)
-                pwm.close(screen_state.lcd_pwm_id)
-            end
-
-            -- 设置GPIO控制电源(如果存在)
-            if screen_state.lcd_pin_pwr then
-                gpio.setup(screen_state.lcd_pin_pwr, 1, gpio.PULLUP)
-                gpio.set(screen_state.lcd_pin_pwr, 0)
-            end
-
-            -- 执行LCD睡眠
-            lcd.sleep()
-            screen_state.is_sleeping = true
-            log.info("AirLCD_1000", "LCD进入休眠状态")
-        end
-    else
-        -- 退出休眠模式
-        if screen_state.is_sleeping then
-            -- 唤醒LCD
-            lcd.wakeup()
-
-            -- 关闭GPIO控制(如果存在)
-            if screen_state.lcd_pin_pwr then
-                gpio.close(screen_state.lcd_pin_pwr)
-            end
-
-            -- 恢复之前的背光设置(如果PWM存在)
-            if screen_state.lcd_pin_pwr then
-                if screen_state.backlight_on then
-                    AirLCD_1000.set_backlight(screen_state.last_brightness)
-                else
-                    -- 如果背光原本是关闭状态,保持关闭
-                    pwm.stop(screen_state.lcd_pwm_id)
-                    pwm.close(screen_state.lcd_pwm_id)
-                end
-            end
-
-            screen_state.is_sleeping = false
-            log.info("AirLCD_1000", "LCD唤醒")
-        end
-    end
-    return true
-end
-
-return AirLCD_1000

+ 1 - 0
module/Air780EHM_Air780EHV_Air780EGH/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/Air780EHM_Air780EHV_Air780EGH/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/Air780EHM_Air780EHV_Air780EGH/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 = 0, cs = 8 }, 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/Air780EHM_Air780EHV_Air780EGH/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/Air780EHM_Air780EHV_Air780EGH/demo/accessory_board/AirLCD_1000/exeasyui/images/1.jpg


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


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


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


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


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


+ 39 - 17
module/Air780EHM_Air780EHV_Air780EGH/demo/accessory_board/AirLCD_1000/main.lua → module/Air780EHM_Air780EHV_Air780EGH/demo/accessory_board/AirLCD_1000/exeasyui/main.lua

@@ -2,20 +2,20 @@
 @module  main
 @summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
 @version 1.0
-@date    2025.09.04
+@date    2025.12.3
 @author  江访
 @usage
-
 本demo演示的核心功能为:
-1、点亮AirLCD_1000屏幕
-2、通过屏幕显示图片、字符、色块等内容
-3、演示背光亮度5%-100%变化
-4、演示使屏幕进入休眠和唤醒屏幕
+1、加载exeasyui扩展库,初始化用户界面系统;
+2、根据选择的字体类型驱动,进行显示硬件以及字体的初始化,
+   支持默认字体、外部矢量字库、内部软件矢量字库和外部自定义点阵字库四选一;
+3、初始化按键驱动系统,实现按键控制界面导航;
+4、启动用户界面主循环,实现多页面切换和按键事件处理;
+5、配置系统看门狗,确保系统稳定运行;
 
 更多说明参考本目录下的readme.md文件
 ]]
 
-
 --[[
 必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
 PROJECT:项目名,ascii string类型
@@ -27,14 +27,14 @@ VERSION:项目版本号,ascii string类型
         如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
 ]]
 
-
+-- main.lua - 程序入口文件
 
 -- 定义项目名称和版本号
-PROJECT = "AirLCD_1000_demo"     -- 项目名称
-VERSION = "1.0.0"                -- 版本号
+PROJECT = "ui_demo" -- 项目名称
+VERSION = "001.000.000"   -- 版本号
 
--- 打印项目名和版本号咋看    
-log.info("AirLCD_demo", PROJECT, VERSION)
+-- 在日志中打印项目名和项目版本号
+log.info("ui_demo", PROJECT, VERSION)
 
 -- 设置日志输出风格为样式2(建议调试时开启)
 -- log.style(2)
@@ -73,10 +73,32 @@ end
 -- end, 3000)
 
 
--- 加载用户界面系统主模块
-require "ui_main"
+-- 必须加载才能启用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/air780epm/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()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行
+-- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行

+ 222 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/accessory_board/AirLCD_1000/exeasyui/readme.md

@@ -0,0 +1,222 @@
+# 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 硬件清单
+
+- Air780EHM/Air780EHV/Air780EGH 核心板 × 1
+- AirLCD_1000 配件板 × 1
+- GTFont 矢量字库,使用的是 AirFONTS_1000 配件板 × 1
+- 母对母杜邦线 × 14,杜邦线太长的话,会出现 spi 通信不稳定的现象;
+- TYPE-C 数据线 × 1
+- Air780EHM/Air780EHV/Air780EGH 核心板和 AirLCD_1000配件板以及AirFONTS_1000 配件板的硬件接线方式为
+
+  - Air780EHM/Air780EHV/Air780EGH 核心板通过 TYPE-C USB 口供电(核心板正面开关拨到 ON 一端),此种供电方式下,VDD_EXT 引脚为 3.3V,可以直接给 AirLCD_1000配件板和AirFONTS_1000 配件板供电;
+  - 为了演示方便,所以 Air780EHM/Air780EHV/Air780EGH 核心板上电后直接通过 VBAT 引脚给 AirLCD_1000配件板,VDD-EXT引脚给AirFONTS_1000 配件板供电;
+  - 客户在设计实际项目时,一般来说,需要通过一个 GPIO 来控制 LDO 给配件板供电,这样可以灵活地控制配件板的供电,可以使项目的整体功耗降到最低;
+
+### 3.2 接线配置
+
+#### 3.2.1 LCD 显示屏接线
+
+<table>
+<tr>
+<td>Air780EHM/Air780EHV/Air780EGH 核心板<br/></td><td>AirLCD_1000配件板<br/></td></tr>
+<tr>
+<td>53/LCD_CLK<br/></td><td>SCLK/CLK<br/></td></tr>
+<tr>
+<td>52/LCD_CS<br/></td><td>CS<br/></td></tr>
+<tr>
+<td>49/LCD_RST<br/></td><td>RES/RST<br/></td></tr>
+<tr>
+<td>50/LCD_SDA<br/></td><td>SDA/MOS<br/></td></tr>
+<tr>
+<td>51/LCD_RS<br/></td><td>DC/RS<br/></td></tr>
+<tr>
+<td>22/GPIO1<br/></td><td>BLK<br/></td></tr>
+<tr>
+<td>VBAT<br/></td><td>VCC<br/></td></tr>
+<tr>
+<td>GND<br/></td><td>GND<br/></td></tr>
+</table>
+
+#### 3.2.2 GTFont 字库接线
+
+<table>
+<tr>
+<td>Air780EHM/Air780EHV/Air780EGH 核心板<br/></td><td>AirFONTS_1000配件板<br/></td></tr>
+<tr>
+<td>83/SPI0_CS<br/></td><td>CS<br/></td></tr>
+<tr>
+<td>84/SPI0_MISO<br/></td><td>MISO<br/></td></tr>
+<tr>
+<td>85/SPI0_MOSI<br/></td><td>MOSI<br/></td></tr>
+<tr>
+<td>86/SPI0_CLK<br/></td><td>CLK<br/></td></tr>
+<tr>
+<td>24/VDD_EXT<br/></td><td>VCC<br/></td></tr>
+<tr>
+<td>GND<br/></td><td>GND<br/></td></tr>
+</table>
+
+#### 3.2.3 接线图
+![](https://docs.openLuat.com/cdn/image/Air780EHV核心板_AirLCD_1000_AirFONTS_1000接线图.jpg)
+
+## 四、演示软件环境
+
+### 4.1 开发工具
+
+- [Luatools下载调试工具](https://docs.openluat.com/air780egh/luatos/common/download/) - 固件烧录和代码调试
+
+### 4.2 内核固件
+
+- [点击下载Air780EHM系列最新版本内核固件](https://docs.openluat.com/air780epm/luatos/firmware/version/),demo所使用的是LuatOS-SoC_V2018_Air780EHM 1号固件
+  
+- [点击下载Air780EHV系列最新版本内核固件](https://docs.openluat.com/air780ehv/luatos/firmware/version/),demo所使用的是LuatOS-SoC_V2018_Air780EHV 1号固件
+  
+- [点击下载Air780EGH系列最新版本内核固件](https://docs.openluat.com/air780egh/luatos/firmware/version/),demo所使用的是LuatOS-SoC_V2018_Air780EGH 1号固件
+
+
+使用 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/air780epm/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/air780epm/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/Air780EHM_Air780EHV_Air780EGH/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/Air780EHM_Air780EHV_Air780EGH/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/Air780EHM_Air780EHV_Air780EGH/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

+ 164 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/accessory_board/AirLCD_1000/exeasyui/ui/gtfont_page.lua

@@ -0,0 +1,164 @@
+--[[
+@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/Air780EHM_Air780EHV_Air780EGH/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/Air780EHM_Air780EHV_Air780EGH/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/Air780EHM_Air780EHV_Air780EGH/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/Air780EHM_Air780EHV_Air780EGH/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)

BIN
module/Air780EHM_Air780EHV_Air780EGH/demo/accessory_board/AirLCD_1000/logo.jpg


+ 0 - 207
module/Air780EHM_Air780EHV_Air780EGH/demo/accessory_board/AirLCD_1000/readme.md

@@ -1,207 +0,0 @@
-# AirLCD_1000_Air780EHM 演示 demo
-
-
-## 一、功能模块介绍
-
-1. main.lua:主程序入口;
-
-2. ui_main.lua:UI应用模块,负责UI启动初始和UI主循环
-
-3. AirLCD_1000.lua:显示驱动模块,负责执行AirLCD_1000初始化,背光亮度调节和屏幕休眠和唤醒
-
-## 二、演示功能概述
-
-1. 屏幕接线引脚配置在AirLCD_1000.lua内进行设置
-
-2. 设置好后,启动主循环屏幕初始化程序,点亮屏幕
-
-3. 进入UI主task,循环显示显示图片、字符、色块等内容,并通过接口设置背光亮度和对屏幕进行休眠和唤醒。
-
-## 三、演示硬件环境
-
-### 3.1 硬件准备
-
-1. AirLCD_1000 显示屏*1
-
-2. Air780EHM或EGH或EHV 核心板*1
-
-3. 母对母杜邦线*8
-
-4. TYPE-C 数据线*1
-
-5. 按照硬件接线图正确连接 LCD 显示屏
-
-6. 将核心板正面开关打到 ON 位置
-
-7. 本demo使用的背光引脚,既是GPIO_1也是PWM_0引脚
-
-8. 调节屏幕亮度需要确保背光控制引脚(如 demo 中 GPIO1)支持 PWM 功能
-
-9. 背光引脚通过切换到PWM模式,通过调节占空比实现背光亮度调节
-
-10. 背光引脚通过切换到GPIO模式,再调用休眠/唤醒接口使屏幕进入休眠/唤醒
-
-### 3.2接线说明
-
-<table>
-<tr>
-<td>引脚说明<br/></td><td>核心开发板<br/></td><td>屏幕<br/></td><td>引脚说明<br/></td></tr>
-<tr>
-<td>屏幕供电<br/></td><td>VDD-EXT<br/><br/></td><td>VCC<br/><br/></td><td>显示屏电源供电脚<br/><br/></td></tr>
-<tr>
-<td>电源地<br/></td><td>GND<br/></td><td>GND<br/></td><td>电源地<br/></td></tr>
-<tr>
-<td>LCD SPI 串口的时钟信号<br/></td><td>LCD_CLK<br/></td><td>CLK<br/></td><td>SPI 串口的时钟信号<br/></td></tr>
-<tr>
-<td>LCD SPI 串口的数据脚<br/></td><td>LCD_SDA<br/></td><td>MOS<br/></td><td>SPI 串口的数据输入脚<br/></td></tr>
-<tr>
-<td>LCD 复位脚<br/></td><td>LCD_RST<br/></td><td>RES<br/></td><td>显示屏复位脚<br/></td></tr>
-<tr>
-<td>LCD 数据/寄存器控制脚<br/></td><td>LCD_RS<br/><br/></td><td>DC<br/></td><td>4 线 SPI 串口的显示数据/寄存器指令<br/></td></tr>
-<tr>
-<td>LCD SPI片选,同一个SPI接口上有多个设备才使用<br/></td><td>LCD_CS<br/></td><td>CS<br/></td><td>LCD驱动芯片片选脚<br/></td></tr>
-<tr>
-<td>LCD 背光控制引脚<br/></td><td>GPIO_1/PWM0<br/></td><td>BKL<br/></td><td>背光使能引脚<br/></td></tr>
-</table>
-
-![](https://docs.openLuat.com/cdn/image/Air780EHM_AirLCD_1000.jpg)
-
-注意:模组GPIO供电能力弱,所以使用VDD-EXT供电。
-
-
-## 四、演示软件环境
-
-### 4.1 底层固件准备
-
-固件版本,推荐使用 V2015 及以后最新固件版本:
-
-  [Air780EHM固件下载链接](https://docs.openluat.com/air780epm/luatos/firmware/version/)
-
-  [Air780EHV固件下载链接](https://docs.openluat.com/air780ehv/luatos/firmware/version/)
-
-  [Air780EGH固件下载链接](https://docs.openluat.com/air780egh/luatos/firmware/version/)
-
-
-
-### 4.2Luatools下载调试工具
-[demo下载调试工具:Luatools](https://docs.openluat.com/air780egh/luatos/common/download/?h=luatools#33-luatools)
-
-### 4.2演示emo下载
-下载本 demo中除readme外的所有的代码文件以及图片文件
-
-## 五、演示核心步骤
-
-### 5.1 烧录程序
-
-1. 下载 luatools 烧录工具:[luatools下载链接及使用说明](https://docs.openluat.com/air780epm/common/Luatools/)
-
-2. 按照操作说明,将本 demo 内除 readme.md 外的全部文件通过 luatools 下载到模块内**(按住 BOOT 键开机,选择下载底层和脚本)**
-
-3. 如需显示图片,如 demo 中显示的 logo,确保 `logo.jpg` 图片文件存在,下载时会放在模组 `/luadb/` 目录下
-   ![](https://docs.openluat.com/air8000/luatos/app/AirLCD_1000%E6%BC%94%E7%A4%BAdemo/imges/UdWZbZ0tXoYPK5xG2Kbcx2y7nSc.png)
-
-
-### 5.2、演示 demo 效果
-
-1. 通过 demo 了解屏幕连接、配置、初始化过程,为显示做好准备
-
-2. 通过 demo 将图片、12 号中文、英文、点、线、圆形、矩形、颜色填充、二维码显示在屏幕上
-
-3. 通过 demo 了解如何使用接口对屏幕进行背光亮度调节、屏幕休眠、屏幕唤醒
-
-4. 实现效果图
-
-![](https://docs.openLuat.com/cdn/image/AirLCD_1000.jpg)
-
-![](https://docs.openluat.com/air8000/luatos/app/AirLCD_1000%E6%BC%94%E7%A4%BAdemo/imges/BaH5b9WnKomL4SxNJxvc5rZKnIg.png)
-
-
-
-
-## 六、程序对外接口
-
-### 6.1 AirLCD_1000 模块接口
-
-#### `AirLCD_1000.lcd_init()`
-
-- 功能:初始化 AirLCD_1000LCD 显示屏
-- 参数:
-
-  - LCD_MODEL: LCD 型号字符串(如"AirLCD_1000")
-  - lcd_pin_dc: 数据/命令引脚号
-  - lcd_pin_rst: 复位引脚号
-  - lcd_pin_pwr: 背光控制引脚号
-- 返回值:初始化成功状态(true/false), 屏幕宽度, 屏幕高度
-
-#### `AirLCD_1000.set_backlight(level)`
-
-- 功能:设置背光亮度
-- 参数:level - 亮度级别(0-100)
-- 返回值:设置成功状态(true/false)
-
-#### `AirLCD_1000.set_sleep(sleep)`
-
-- 功能:设置屏幕休眠或唤醒
-- 参数:sleep - true 进入休眠, false 唤醒
-- 返回值:设置成功状态(true/false)
-- **注意事项:目前在屏幕休眠模式下,仅 AIR780EPM 支持模组设置 pm.power(pm.WORK_MODE, 1),其他型号暂时不支持,唤醒模组会导致模组死机**
-
-### 6.2 screen_data_table 配置参数
-
-- `lcd_models`: 支持的 LCD 型号及其参数
-- `default`: 默认配置(滑动阈值、点击时间阈值等)预留后续扩展功能使用
-
-### 6.3 更多显示接口
-
-- 可以参考合宙 docs 上 LCD 库进行扩展使用:[https://docs.openluat.com/osapi/core/lcd/](https://docs.openluat.com/osapi/core/lcd/)
-
-## 七、扩展说明
-
-1. 目前支持 ST7796、ST7789、CO5300 显示芯片,其他 st7735 、st7735v、st7735s、gc9a01、gc9106l、gc9306x、ili9486 也同样支持,
-
-2. 模组字体支持有限,需要使用其他字体可以搭配合宙 AirFONTS_1000 矢量字库使用
-
-3. Air780EPM/EHM/EGH/EHV、Air8000 系列、Air8101,按正确的接口接线并修改 screen_data_table.lua 都可以使用此 demo
-
-4. 其他屏幕可以参考 custom 的方式自定义屏幕初始化配置
-
-```lua
--- 配置接口参数
-local lcd_param = {
-        port = lcd.HWID_0,        -- 使用的spi id 号
-        pin_dc = 0xff,            -- 命令选择引脚
-        pin_rst = 36,             -- 复位引脚  
-        direction = 0,            -- 屏幕方向
-        w = width,                -- 屏幕宽度
-        h = height,               -- 屏幕高度
-        xoffset = 0,              -- X轴偏移像素
-        yoffset = 0,              -- Y轴偏移像素
-        sleepcmd = 0x10,          -- LCD睡眠命令
-        wakecmd = 0x11,           -- LCD唤醒命令
-    }
-    
-  -- 初始化SPI设备
-        spi.deviceSetup(
-            lcd.HWID_0,  -- LCD端口号
-            nil,         -- CS片选脚,可选
-            0,           -- CPHA=0
-            0,           -- CPOL=0
-            8,           -- 8位数据宽度
-            20000000,    -- 20MHz波特率
-            spi.MSB,     -- 高位先传
-            1,           -- 主机模式
-            1            -- 全双工模式
-        )
-        
-    -- QSPI如有特殊配置,需要在lcd.init前配置好
-    --lcd.qspi(0x02, 0x32, 0x12)
-        
-    -- 初始化屏幕 
-    lcd.init("custom", lcd_param)
-    
-    -- 如有其他参数需要配置,可使用lcd.cmd命令
-    --lcd.cmd(0x53, 0x20)
-        
-    -- 自定义初始化后必须运行该程序
-    lcd.user_done()
-```

+ 0 - 187
module/Air780EHM_Air780EHV_Air780EGH/demo/accessory_board/AirLCD_1000/ui_main.lua

@@ -1,187 +0,0 @@
---[[
-@module  ui_main
-@summary UI子模块的主程序
-@version 1.0
-@date    2025.09.04
-@author  江访
-@usage
-
-本demo演示的核心功能为:
-1、依据显示屏配置参数初始化显示屏,点亮AirLCD_1000屏幕
-2、循环显示显示图片、字符、色块等内容
-3、通过接口设置背光亮度和对屏幕进行休眠和唤醒。
-4、本demo使用的背光引脚,既是GPIO_1也是PWM_0引脚
-5、背光引脚通过切换到PWM模式,通过调节占空比实现背光亮度调节
-6、背光引脚通过切换到GPIO模式,再调用休眠/唤醒接口使屏幕进入休眠/唤醒
-]]
-
-
--- 加载AirLCD_1000驱动模块
-local AirLCD_1000 = require "AirLCD_1000"           -- 显示初始化执行程序
-
--- 配置AirLCD_1000接线引脚
-local LCD_MODEL = "AirLCD_1000" -- 显示屏型号
-local lcd_vcc = 29              -- 屏幕供电引脚GPIO号,VDD-EXT供电可填255
-local lcd_pin_rst = 36          -- 复位引脚GPIO号
-local lcd_pin_pwr = 1           -- 背光引脚GPIO号
-local lcd_pwm_id = 0            -- 背光引脚PWM端口号
-
--- UI主task,所有UI相关的代码都会通过该task进行调度
-local function ui_main()
-
-    AirLCD_1000.lcd_init(LCD_MODEL, lcd_vcc, lcd_pin_rst, lcd_pin_pwr,lcd_pwm_id)
-
-    -- 设置字体为模组自带的opposansm12中文字体
-    lcd.setFont(lcd.font_opposansm12_chinese)
-
-    -- 清除屏幕显示
-    -- lcd.clear()
-
-    -- 主循环
-    while true do
-        -- 获取并打印屏幕尺寸信息,实际是初始化传入的信息
-        -- log.info("屏幕尺寸", lcd.getSize())
-        
-        ------------------------------------------以下为图片/位图/英文显示设置------------------------------------------
-        --设置前景色和背景色(RGB565格式)
-        --需要放在循环内部,因为是一次性设置
-        lcd.setColor(0xFFFF, 0x0000)  -- 白底黑字,背景色:白色(0xFFFF), 前景色:黑色(0x0000),
-
-        -- 在屏幕左上角(0,0)显示一张图片
-        -- 图片路径为/luadb/logo.jpg
-        lcd.showImage(0, 0, "/luadb/logo.jpg")
-
-        -- 在位置(0,82)绘制一个16x16的位图,内容依次为“上”,“海”,“合”,“宙”
-        -- 位图数据使用字符串格式表示
-        lcd.drawXbm(0, 82, 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(18, 82, 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(36, 82, 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(54, 82, 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))
-
-        -- 在位置(120,40)绘制一个蓝色点
-        lcd.drawPoint(120, 40, 0x001F)
-
-        -- 以(120,40)为圆心,40为半径绘制一个蓝色圆
-        lcd.drawCircle(120, 40, 40, 0x001F)
-
-        -- 从(170,40)到(280,40)绘制一条蓝色水平线
-        lcd.drawLine(170, 40, 280, 40, 0x001F)
-
-        -- 从(170,50)到(280,80)绘制一个蓝色矩形框
-        lcd.drawRectangle(170, 50, 280, 80, 0x001F)
-
-
-        -- 在位置(200,170)绘制一个100x100的二维码,内容为指定URL
-        lcd.drawQrcode(200, 170, "https://docs.openluat.com/air8000/", 100)
-
-        lcd.setFont(lcd.font_opposansm12)
-        lcd.drawStr(20,172,"hello hezhou") --显示字符
-        lcd.setFont(lcd.font_opposansm16)
-        lcd.drawStr(20,189,"hello hezhou") --显示字符
-        lcd.setFont(lcd.font_opposansm18)
-        lcd.drawStr(20,210,"hello hezhou") --显示字符
-        lcd.setFont(lcd.font_opposansm20)
-        lcd.drawStr(20,233,"hello hezhou") --显示字符
-        lcd.setFont(lcd.font_opposansm22)
-        lcd.drawStr(20,258,"hello hezhou") --显示字符
-        lcd.setFont(lcd.font_opposansm24)
-        lcd.drawStr(20,285,"hello hezhou") --显示字符
-        lcd.setFont(lcd.font_opposansm32)
-        lcd.drawStr(20,316,"hello hezhou") --显示字符
-
-        lcd.fill(10, 380, 150, 460, 0xF800)  -- 绘制红色矩形区域(0xF800是红色)
-        lcd.fill(170, 380, 310, 460, 0x07E0)  -- 绘制绿色矩形区域(0x07E0是绿色)
-
-        -- 主动刷新数据到屏幕
-        lcd.flush()
-        sys.wait(5000)
-
-        --------------------------------------------以下为显示中文设置--------------------------------------------
-        -- Air780EPM不支持中文显示
-        -- Air780EHM/EGH/EHV/Air8000支持12号中文字体
-        -- 中文以左下角为坐标显示与位图左上角方式不同
-
-        -- 设置字体为opposansm12中文字体,从英文显示切换到中文前一定要设置
-        lcd.setFont(lcd.font_opposansm12_chinese)
-        lcd.setColor(0xFFFF, 0x0000)  -- 白底黑字,背景色:白色(0xFFFF), 前景色:黑色(0x0000),
-
-        -- 显示重拍按钮(左侧)
-        lcd.drawStr(70, 420, "重拍", 0xFFFF)  -- 在按钮上绘制白色文字"重拍"
-
-        -- 显示返回按钮(右侧)
-        lcd.drawStr(230, 420, "返回", 0xFFFF)  -- 在按钮上绘制白色文字"返回"
-
-        -- 在位置(160,155)绘制文本
-        -- 不设置字体颜色,默认会使用lcd.setColor所设置的字体颜色
-        lcd.drawStr(160, 155, "扫码进入Air8000资料站",0x0000)
-
-        -- 主动刷新数据到屏幕
-        lcd.flush()
-        sys.wait(5000)
-        --------------------------------------------以下为背光亮度设置--------------------------------------------
-        -- 背光引脚使用PWM模式控制,pwm_id正确配置后可以实现背光控制
-        -- 参数 level: 亮度级别(0-100)
-        AirLCD_1000.set_backlight(5)  -- 设置背光为5%
-        sys.wait(5000)
-        AirLCD_1000.set_backlight(10)  -- 设置背光为10%
-        sys.wait(5000)
-        AirLCD_1000.set_backlight(20)  -- 设置背光为20%
-        sys.wait(5000)
-        AirLCD_1000.set_backlight(30)  -- 设置背光为30%
-        sys.wait(5000)
-        AirLCD_1000.set_backlight(40)  -- 设置背光为40%
-        sys.wait(5000)
-        AirLCD_1000.set_backlight(50)  -- 设置背光为50%
-        sys.wait(5000)
-        AirLCD_1000.set_backlight(60)  -- 设置背光为60%
-        sys.wait(5000)
-        AirLCD_1000.set_backlight(70)  -- 设置背光为70%
-        sys.wait(5000)
-        AirLCD_1000.set_backlight(80)  -- 设置背光为80%
-        sys.wait(5000)
-        AirLCD_1000.set_backlight(90)  -- 设置背光为90%
-        sys.wait(5000)
-        AirLCD_1000.set_backlight(100)  -- 设置背光为100%
-
-        --------------------------------------------以下为屏幕休眠设置--------------------------------------------
-        -- 背光引脚使用GPIO模式控制,pin_pwr正确配置可以实现背光控制
-
-        -- 进入休眠,功耗13ma
-        AirLCD_1000.set_sleep(true)    -- 进入休眠状态,此时屏幕供电需要稳定,若不稳定,唤醒后需要重新初始化屏幕
-        pm.power(pm.WORK_MODE, 1)
-        sys.wait(10000)
-        pm.power(pm.WORK_MODE, 0)
-        AirLCD_1000.set_sleep(false)   -- 唤醒屏幕,自动恢复之前的背光设置
-
-        -- 主动刷新数据到屏幕
-        lcd.flush()
-        sys.wait(5000)
-        ----------------------------------------以下为屏幕关闭/打开背光设置----------------------------------------
-        -- --关闭LCD背光,功耗20ma
-        -- AirLCD_1000.lcd_off()
-        -- pm.power(pm.WORK_MODE, 1)
-        -- sys.wait(15000)
-        -- -- 唤醒
-        -- pm.power(pm.WORK_MODE, 0)
-        -- sys.wait(5000)
-        -- AirLCD_1000.lcd_on()
-
-        -- 主动刷新数据到屏幕
-        -- lcd.flush()
-        -- sys.wait(50)
-    end
-end
-
--- 创建UI主循环ui_main的task
-sys.taskInit(ui_main)