exlcd.lua 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. -- exlcd.lua
  2. --[[
  3. @module exlcd
  4. @summary LCD显示拓展库
  5. @version 1.0
  6. @date 2025.09.17
  7. @author 江访
  8. @usage
  9. 核心业务逻辑为:
  10. 1、初始化LCD显示屏,支持多种显示芯片
  11. 2、管理屏幕背光亮度及开关状态
  12. 3、管理屏幕休眠和唤醒状态
  13. 4、提供屏幕状态管理功能
  14. 本文件的对外接口有4个:
  15. 1、exlcd.init(args) -- LCD初始化函数
  16. 2、exlcd.bkl(level) -- 设置背光亮度接口,level 亮度级别(0-100)
  17. 3、exlcd.sleep() -- 屏幕休眠
  18. 4、exlcd.wakeup() -- 屏幕唤醒
  19. ]]
  20. local exlcd = {}
  21. -- 屏幕状态管理表
  22. local screen_state = {
  23. is_sleeping = false, -- 是否休眠中标识
  24. last_brightness = 100, -- 默认亮度100%
  25. backlight_on = true, -- 背光默认开启
  26. lcd_config = nil -- 存储LCD配置
  27. }
  28. -- LCD初始化函数
  29. -- @param args LCD参数配置表
  30. -- @return 初始化成功状态
  31. function exlcd.init(args)
  32. if type(args) ~= "table" then
  33. log.error("exlcd", "参数必须为表")
  34. return false
  35. end
  36. -- 检查必要参数
  37. if not args.LCD_MODEL then
  38. log.error("exlcd", "缺少必要参数: LCD_MODEL")
  39. return false
  40. end
  41. -- LCD型号映射表
  42. local lcd_models = {
  43. AirLCD_1000 = "st7796",
  44. AirLCD_1001 = "st7796",
  45. Air780EHM_LCD_1 = "st7796",
  46. Air780EHM_LCD_2 = "st7796",
  47. Air780EHM_LCD_3 = "st7796",
  48. Air780EHM_LCD_4 = "st7796",
  49. AirLCD_1020 = "custom"
  50. }
  51. -- 确定LCD型号
  52. local lcd_model = lcd_models[args.LCD_MODEL] or args.LCD_MODEL
  53. -- 存储LCD配置供其他函数使用
  54. screen_state.lcd_config = {
  55. pin_pwr = args.pin_pwr,
  56. pin_pwm = args.pin_pwm,
  57. model = lcd_model
  58. }
  59. -- 设置电源引脚 (可选)
  60. if args.pin_vcc then
  61. gpio.setup(args.pin_vcc, 1, gpio.PULLUP)
  62. gpio.set(args.pin_vcc, 1)
  63. end
  64. -- 设置背光电源引脚 (可选)
  65. if args.pin_pwr then
  66. gpio.setup(args.pin_pwr, 1, gpio.PULLUP)
  67. gpio.set(args.pin_pwr, 1) -- 默认开启背光
  68. end
  69. -- 设置PWM背光引脚 (可选)
  70. if args.pin_pwm then
  71. pwm.setup(args.pin_pwm, 1000, screen_state.last_brightness)
  72. pwm.open(args.pin_pwm, 1000, screen_state.last_brightness)
  73. end
  74. -- 屏幕初始化 (spi_dev和init_in_service为可选参数)
  75. local lcd_init = lcd.init(
  76. lcd_model,
  77. args,
  78. args.spi_dev and args.spi_dev or nil,
  79. args.init_in_service and args.init_in_service or nil
  80. )
  81. log.info("exlcd", "LCD初始化", lcd_init)
  82. return lcd_init
  83. end
  84. -- 设置背光亮度接口
  85. -- 使用背光PWM模式控制亮度
  86. -- @param level 亮度级别(0-100)
  87. function exlcd.bkl(level)
  88. -- 检查屏幕状态
  89. if screen_state.is_sleeping then
  90. log.warn("exlcd", "屏幕处于休眠状态,无法调节背光")
  91. return
  92. end
  93. -- 确保亮度在有效范围内
  94. level = level or screen_state.last_brightness
  95. level = math.max(0, math.min(100, level or 0))
  96. -- 设置PWM背光 (如果配置了PWM引脚)
  97. if screen_state.lcd_config and screen_state.lcd_config.pin_pwm then
  98. pwm.setup(screen_state.lcd_config.pin_pwm, 1000, level)
  99. pwm.open(screen_state.lcd_config.pin_pwm, 1000, level)
  100. -- 如果没有PWM但配置了电源引脚,则通过开关控制
  101. elseif screen_state.lcd_config and screen_state.lcd_config.pin_pwr then
  102. gpio.set(screen_state.lcd_config.pin_pwr, level > 0 and 1 or 0)
  103. end
  104. screen_state.last_brightness = level
  105. screen_state.backlight_on = (level > 0)
  106. log.info("exlcd", "背光设置为", level, "%")
  107. end
  108. -- 屏幕休眠
  109. function exlcd.sleep()
  110. if not screen_state.is_sleeping then
  111. -- 关闭PWM背光 (如果配置了)
  112. if screen_state.lcd_config and screen_state.lcd_config.pin_pwm then
  113. pwm.close(screen_state.lcd_config.pin_pwm)
  114. end
  115. -- 关闭背光电源 (如果配置了)
  116. if screen_state.lcd_config and screen_state.lcd_config.pin_pwr then
  117. gpio.set(screen_state.lcd_config.pin_pwr, 0)
  118. end
  119. -- 执行LCD睡眠
  120. lcd.sleep()
  121. screen_state.is_sleeping = true
  122. log.info("exlcd", "LCD进入休眠状态")
  123. end
  124. end
  125. -- 屏幕唤醒
  126. function exlcd.wakeup()
  127. if screen_state.is_sleeping then
  128. -- 开启背光电源 (如果配置了)
  129. if screen_state.lcd_config and screen_state.lcd_config.pin_pwr then
  130. gpio.set(screen_state.lcd_config.pin_pwr, 1)
  131. end
  132. -- 唤醒LCD
  133. lcd.wakeup()
  134. sys.wait(100) -- 等待100ms稳定
  135. -- 恢复背光设置 (如果配置了PWM引脚)
  136. if screen_state.lcd_config and screen_state.lcd_config.pin_pwm then
  137. pwm.setup(screen_state.lcd_config.pin_pwm, 1000, screen_state.last_brightness)
  138. pwm.open(screen_state.lcd_config.pin_pwm, 1000, screen_state.last_brightness)
  139. end
  140. screen_state.is_sleeping = false
  141. log.info("exlcd", "LCD唤醒")
  142. end
  143. end
  144. return exlcd