exlcd.lua 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  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 = "nv3052c"
  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. -- 检查屏幕状态和PWM配置
  89. if screen_state.is_sleeping then
  90. log.warn("exlcd", "屏幕处于休眠状态,无法调节背光")
  91. return false
  92. end
  93. if not screen_state.lcd_config.pin_pwm then
  94. log.error("exlcd", "PWM配置不存在,无法调节背光")
  95. return false
  96. end
  97. -- 确保GPIO已关闭
  98. gpio.close(screen_state.lcd_config.pin_pwr)
  99. -- 设置并开启PWM
  100. pwm.stop(screen_state.lcd_config.pin_pwm)
  101. pwm.close(screen_state.lcd_config.pin_pwm)
  102. pwm.setup(screen_state.lcd_config.pin_pwm, 1000, 100)
  103. pwm.open(screen_state.lcd_config.pin_pwm, 1000, level)
  104. screen_state.last_brightness = level
  105. screen_state.backlight_on = (level > 0)
  106. log.info("exlcd", "背光设置为", level, "%")
  107. return true
  108. end
  109. -- function exlcd.bkl(level)
  110. -- -- 检查屏幕状态
  111. -- if screen_state.is_sleeping then
  112. -- log.warn("exlcd", "屏幕处于休眠状态,无法调节背光")
  113. -- return
  114. -- end
  115. -- -- 确保亮度在有效范围内
  116. -- -- level = level or screen_state.last_brightness
  117. -- -- level = math.max(0, math.min(100, level or 0))
  118. -- if screen_state.lcd_config.pin_pwr then
  119. -- gpio.close(screen_state.lcd_config.pin_pwr)
  120. -- end
  121. -- -- 设置PWM背光 (如果配置了PWM引脚)
  122. -- if screen_state.lcd_config and screen_state.lcd_config.pin_pwm then
  123. -- --pwm.setup(screen_state.lcd_config.pin_pwm, 1000, level)
  124. -- pwm.open(screen_state.lcd_config.pin_pwm, 1000, level)
  125. -- -- 如果没有PWM但配置了电源引脚,则通过开关控制
  126. -- elseif screen_state.lcd_config and screen_state.lcd_config.pin_pwr then
  127. -- gpio.set(screen_state.lcd_config.pin_pwr, level > 0 and 1 or 0)
  128. -- end
  129. -- screen_state.last_brightness = level
  130. -- screen_state.backlight_on = (level > 0)
  131. -- log.info("exlcd", "背光设置为", level, "%")
  132. -- end
  133. -- 屏幕休眠
  134. function exlcd.sleep()
  135. if not screen_state.is_sleeping then
  136. -- 关闭PWM背光 (如果配置了)
  137. if screen_state.lcd_config and screen_state.lcd_config.pin_pwm then
  138. pwm.close(screen_state.lcd_config.pin_pwm)
  139. end
  140. -- 关闭背光电源 (如果配置了)
  141. if screen_state.lcd_config and screen_state.lcd_config.pin_pwr then
  142. gpio.setup(screen_state.lcd_config.pin_pwr, 1, gpio.PULLUP)
  143. gpio.set(screen_state.lcd_config.pin_pwr, 0)
  144. end
  145. -- 执行LCD睡眠
  146. lcd.sleep()
  147. screen_state.is_sleeping = true
  148. log.info("exlcd", "LCD进入休眠状态")
  149. end
  150. end
  151. -- 屏幕唤醒
  152. function exlcd.wakeup()
  153. if screen_state.is_sleeping then
  154. -- 开启背光电源 (如果配置了)
  155. if screen_state.lcd_config and screen_state.lcd_config.pin_pwr then
  156. gpio.set(screen_state.lcd_config.pin_pwr, 1)
  157. end
  158. -- 唤醒LCD
  159. lcd.wakeup()
  160. sys.wait(100) -- 等待100ms稳定
  161. -- 恢复背光设置 (如果配置了PWM引脚)
  162. if screen_state.lcd_config and screen_state.lcd_config.pin_pwm then
  163. pwm.setup(screen_state.lcd_config.pin_pwm, 1000, screen_state.last_brightness)
  164. pwm.open(screen_state.lcd_config.pin_pwm, 1000, screen_state.last_brightness)
  165. end
  166. screen_state.is_sleeping = false
  167. log.info("exlcd", "LCD唤醒")
  168. end
  169. end
  170. function exlcd.get_brightness()
  171. return screen_state.last_brightness
  172. end
  173. -- 获取当前休眠状态
  174. function exlcd.is_sleeping()
  175. return screen_state.is_sleeping
  176. end
  177. return exlcd