327 lines
8.4 KiB
Lua
327 lines
8.4 KiB
Lua
-- 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-100,0表示关闭背光
|
||
@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 |