工程提交

This commit is contained in:
2026-03-31 15:46:04 +08:00
parent 75f512a5b4
commit da4e944bca
2841 changed files with 4822938 additions and 1 deletions

View File

@@ -0,0 +1,327 @@
-- exlcd.lua
--[[
@module exlcd
@summary LCD显示拓展库
@version 1.0.5
@date 2025.12.23
@author 江访
@usage
本文件为LCD显示拓展库核心业务逻辑为
1、初始化LCD显示屏支持多种显示芯片
2、管理屏幕背光亮度及开关状态
3、提供屏幕状态管理功能
4、支持根据lcd_model自动配置参数
本文件的对外接口有6个
1、exlcd.init(param)LCD初始化函数
2、exlcd.set_bl(level)设置背光亮度接口level为亮度级别(0-100)
3、exlcd.get_bl():当前设置背光亮度级别查询
4、exlcd.sleep():屏幕休眠
5、exlcd.wakeup():屏幕唤醒
6、exlcd.get_sleep():休眠状态查询
]]
local exlcd = {}
-- 屏幕状态管理表
local screen_state = {
last_brightness = 100, -- 默认亮度100%
backlight_on = true, -- 背光默认开启
lcd_config = nil -- 存储LCD配置
}
-- 预定义屏幕配置表
local predefined_configs = {
Air780EHM_LCD_4 = {
lcd_model = "Air780EHM_LCD_4",
pin_vcc = 24,
pin_rst = 36,
pin_pwr = 25,
pin_pwm = 2,
port = lcd.HWID_0,
direction = 3,
w = 480,
h = 320,
xoffset = 0,
yoffset = 0,
sleepcmd = 0X10,
wakecmd = 0X11,
},
AirLCD_1000 = {
lcd_model = "AirLCD_1000",
pin_vcc = 29,
pin_rst = 36,
pin_pwr = 30,
pin_pwm = 1,
port = lcd.HWID_0,
direction = 0,
w = 320,
h = 480,
xoffset = 0,
yoffset = 0,
sleepcmd = 0X10,
wakecmd = 0X11,
},
AirLCD_1010 = {
lcd_model = "AirLCD_1010",
pin_vcc = 141,
pin_rst = 36,
pin_pwr = 1,
pin_pwm = 0,
port = lcd.HWID_0,
direction = 0,
w = 320,
h = 480,
xoffset = 0,
yoffset = 0,
sleepcmd = 0X10,
wakecmd = 0X11,
},
AirLCD_1020 = {
lcd_model = "AirLCD_1020",
pin_pwr = 8,
pin_pwm = 0,
port = lcd.RGB,
direction = 0,
w = 800,
h = 480,
xoffset = 0,
yoffset = 0,
}
}
--[[
初始化LCD显示屏
@api exlcd.init(param)
@table param LCD配置参数参考库的说明及demo用法
@return bool 初始化成功返回true失败返回false
@usage
-- 使用预定义配置初始化
exlcd.init({lcd_model = "Air780EHM_LCD_4"})
-- 自定义参数初始化
exlcd.init({
lcd_model = "st7796",
port = lcd.HWID_0,
pin_rst = 36,
pin_pwr = 25,
pin_pwm = 2,
w = 480,
h = 320,
direction = 0
})
]]
function exlcd.init(param)
if type(param) ~= "table" then
log.error("exlcd", "参数必须为表")
return false
end
-- 检查必要参数
if not param.lcd_model then
log.error("exlcd", "缺少必要参数: lcd_model")
return false
end
local config = {}
-- 根据lcd_model选择配置策略
if param.lcd_model == "Air780EHM_LCD_4" then
-- Air780EHM_LCD_4: 只使用lcd_model其他参数固定
config = predefined_configs.Air780EHM_LCD_4
log.info("exlcd", "使用Air780EHM_LCD_4固定配置")
elseif predefined_configs[param.lcd_model] then
-- 其他预定义型号: 使用预定义配置作为基础,传入参数覆盖预定义配置
config = {}
-- 复制预定义配置
for k, v in pairs(predefined_configs[param.lcd_model]) do
config[k] = v
end
-- 用传入参数覆盖预定义配置
for k, v in pairs(param) do
if k ~= "lcd_model" or v ~= param.lcd_model then -- 避免重复设置lcd_model
config[k] = v
end
end
log.info("exlcd", "使用" .. param.lcd_model .. "基础配置,传入参数已覆盖")
else
-- 未知型号: 直接使用传入参数
config = param
log.info("exlcd", "使用传入参数配置")
end
-- LCD型号映射表
local lcd_models = {
AirLCD_1000 = "st7796",
Air780EHM_LCD_4 = "st7796",
AirLCD_1010 = "st7796",
AirLCD_1020 = "h050iwv"
}
-- 确定LCD型号
local lcd_model = lcd_models[config.lcd_model] or config.lcd_model
-- 存储LCD配置供其他函数使用
screen_state.lcd_config = {
pin_pwr = config.pin_pwr,
pin_pwm = config.pin_pwm,
model = lcd_model,
lcd_model = config.lcd_model
}
-- 设置电源引脚 (可选)
if config.pin_vcc then
gpio.setup(config.pin_vcc, 1, gpio.PULLUP)
gpio.set(config.pin_vcc, 1)
end
-- 设置背光电源引脚 (可选)
if config.pin_pwr then
gpio.setup(config.pin_pwr, 1, gpio.PULLUP)
gpio.set(config.pin_pwr, 1) -- 默认开启背光
end
-- 设置PWM背光引脚 (可选)
if config.pin_pwm then
pwm.setup(config.pin_pwm, 1000, screen_state.last_brightness)
pwm.open(config.pin_pwm, 1000, screen_state.last_brightness)
end
-- 屏幕初始化 (spi_dev和init_in_service为可选参数)
local lcd_init = lcd.init(
lcd_model,
config,
config.spi_dev and config.spi_dev or nil,
config.init_in_service and config.init_in_service or nil
)
log.info("exlcd", "LCD初始化", lcd_init)
-- 自定义初始化完成确认
if lcd_model == "custom" then
lcd.user_done()
end
return lcd_init
end
--[[
设置背光亮度
@api exlcd.set_bl(level)
@number level 亮度级别0-1000表示关闭背光
@return bool 设置成功返回true失败返回false
@usage
-- 设置50%亮度
exlcd.set_bl(50)
-- 关闭背光
exlcd.set_bl(0)
]]
function exlcd.set_bl(level)
-- 检查PWM配置
if not screen_state.lcd_config.pin_pwm then
log.error("exlcd", "PWM配置不存在无法调节背光")
return false
end
-- 确保GPIO已关闭
if screen_state.lcd_config.pin_pwr then
gpio.close(screen_state.lcd_config.pin_pwr)
end
-- 设置并开启PWM
pwm.stop(screen_state.lcd_config.pin_pwm)
pwm.close(screen_state.lcd_config.pin_pwm)
pwm.setup(screen_state.lcd_config.pin_pwm, 1000, 100)
pwm.open(screen_state.lcd_config.pin_pwm, 1000, level)
screen_state.last_brightness = level
screen_state.backlight_on = (level > 0)
log.info("exlcd", "背光设置为", level, "%")
return true
end
--[[
获取当前背光亮度
@api exlcd.get_bl()
@return number 当前背光亮度级别(0-100)
@usage
local brightness = exlcd.get_bl()
log.info("当前背光亮度", brightness)
]]
function exlcd.get_bl()
return screen_state.last_brightness
end
--[[
屏幕进入休眠状态
@api exlcd.sleep()
@usage
exlcd.sleep()
]]
function exlcd.sleep()
if not screen_state.is_sleeping then
-- 关闭PWM背光 (如果配置了)
if screen_state.lcd_config and screen_state.lcd_config.pin_pwm then
pwm.close(screen_state.lcd_config.pin_pwm)
end
-- 关闭背光电源 (如果配置了)
if screen_state.lcd_config and screen_state.lcd_config.pin_pwr then
gpio.setup(screen_state.lcd_config.pin_pwr, 1, gpio.PULLUP)
gpio.set(screen_state.lcd_config.pin_pwr, 0)
end
-- 执行LCD睡眠
lcd.sleep()
screen_state.is_sleeping = true
log.info("exlcd", "LCD进入休眠状态")
end
end
--[[
屏幕从休眠状态唤醒
@api exlcd.wakeup()
@usage
exlcd.wakeup()
]]
function exlcd.wakeup()
if screen_state.is_sleeping then
-- 开启背光电源 (如果配置了)
if screen_state.lcd_config and screen_state.lcd_config.pin_pwr then
gpio.set(screen_state.lcd_config.pin_pwr, 1)
end
-- 唤醒LCD
lcd.wakeup()
sys.wait(100) -- 等待100ms稳定
-- 恢复背光设置 (如果配置了PWM引脚)
if screen_state.lcd_config and screen_state.lcd_config.pin_pwm then
pwm.setup(screen_state.lcd_config.pin_pwm, 1000, screen_state.last_brightness)
pwm.open(screen_state.lcd_config.pin_pwm, 1000, screen_state.last_brightness)
end
screen_state.is_sleeping = false
log.info("exlcd", "LCD唤醒")
end
end
--[[
获取屏幕休眠状态
@api exlcd.get_sleep()
@return bool true表示屏幕处于休眠状态false表示屏幕处于工作状态
@usage
if exlcd.get_sleep() then
log.info("屏幕处于休眠状态")
end
]]
function exlcd.get_sleep()
return screen_state.is_sleeping
end
return exlcd