AirLCD_1000.lua 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. --[[
  2. @module AirLCD_1000
  3. @summary AirLCD_1000显示驱动模块
  4. @version 1.0
  5. @date 2025.09.4
  6. @author 江访
  7. @usage
  8. 核心业务逻辑为:
  9. 1、初始化AirLCD_1000显示屏
  10. 2、管理屏幕背光亮度及开关状态
  11. 3、管理屏幕休眠和唤醒状态
  12. 4、提供屏幕状态管理功能
  13. 本文件的对外接口有5个:
  14. 1、AirLCD_1000.lcd_init() --LCD初始化函数,
  15. 2、AirLCD_1000.set_backlight(level) -- 设置背光亮度接口,level 亮度级别(0-100)
  16. 3、AirLCD_1000.lcd_on() -- 开启LCD背光
  17. 4、AirLCD_1000.lcd_off() -- 关闭LCD背光
  18. 5、AirLCD_1000.set_sleep(sleep) -- 设置休眠状态接口,sleep:true进入休眠, false唤醒
  19. ]]
  20. -- AirLCD_1000.lua - LCD显示驱动模块
  21. -- 此文件负责初始化LCD显示屏,管理背光及休眠状态
  22. local AirLCD_1000 = {}
  23. -- 屏幕状态管理表
  24. local screen_state = {
  25. lcd_pin_pwr = 1, -- 屏幕背光引脚GPIO号
  26. lcd_pwm_id = 0, -- 屏幕背光引脚PWM端口号
  27. is_sleeping = false, -- 是否休眠中标识
  28. last_brightness = 50, -- 默认亮度50%
  29. backlight_on = true -- 背光默认开启
  30. }
  31. -- LCD初始化函数
  32. -- @param LCD_MODEL 显示屏型号型号
  33. -- @param lcd_vcc 屏幕供电引脚GPIO号
  34. -- @param lcd_pin_rst 复位引脚GPIO号
  35. -- @param lcd_pin_pwr 背光引脚GPIO号
  36. -- @param lcd_pwm_id 背光引脚PWM端口号
  37. function AirLCD_1000.lcd_init(LCD_MODEL, lcd_vcc, lcd_pin_rst, lcd_pin_pwr,lcd_pwm_id)
  38. -- 根据接线设置AirLCD_1000初始化参数
  39. 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
  40. -- 设置屏幕尺寸
  41. local width, height = 320, 480
  42. -- LCD参数配置表
  43. local lcd_param = {
  44. port = lcd.HWID_0, -- 使用SPI设备模式
  45. pin_dc = 0xff, -- DC引脚,无需设置
  46. pin_rst = lcd_pin_rst, -- 复位引脚,对应GPIO号
  47. pin_pwr = lcd_pin_pwr, -- 背光引脚(可选)
  48. direction = 0, -- 屏幕默认0°方向
  49. -- 0:0°, 1:90°, 2:180°, 3:270°
  50. w = width, -- 屏幕宽度(像素)
  51. h = height, -- 屏幕高度(像素)
  52. xoffset = 0, -- X方向偏移量
  53. yoffset = 0, -- Y方向偏移量
  54. sleepcmd = 0x10, -- 睡眠命令
  55. wakecmd = 0x11 -- 唤醒命令
  56. }
  57. -- 初始化SPI设备
  58. spi.deviceSetup(
  59. lcd.HWID_0, -- LCD端口号
  60. nil, -- CS片选脚,可选
  61. 0, -- CPHA=0
  62. 0, -- CPOL=0
  63. 8, -- 8位数据宽度
  64. 20000000, -- 20MHz波特率
  65. spi.MSB, -- 高位先传
  66. 1, -- 主机模式
  67. 1 -- 全双工模式
  68. )
  69. -- 设置VCC/RST/背光引脚为输出模式,并启用上拉电阻
  70. gpio.setup(lcd_vcc, 1, gpio.PULLUP)
  71. gpio.setup(lcd_pin_rst, 0, gpio.PULLUP)
  72. gpio.setup(lcd_pin_pwr, 1, gpio.PULLUP)
  73. -- 开启屏幕VCC供电
  74. gpio.set(lcd_vcc, 1)
  75. -- 拉低屏幕复位引脚
  76. gpio.set(lcd_pin_rst, 0) -- 拉低复位引脚
  77. sys.wait(20) -- 等待20ms(ST7796复位拉低大于10ms生效)
  78. gpio.set(lcd_pin_rst, 1) -- 拉高复位引脚
  79. sys.wait(150) -- 等待150ms(ST7796复位拉高大于120ms重置)
  80. gpio.set(lcd_pin_pwr, 1)
  81. -- 初始化ST7796显示芯片
  82. lcd.init("st7796", lcd_param)
  83. -- 通用显示设置
  84. lcd.setupBuff(nil,false) -- 设置帧缓冲区
  85. lcd.autoFlush(false) -- 禁止自动刷新
  86. screen_state.lcd_pin_pwr = lcd_pin_pwr
  87. screen_state.lcd_pwm_id = lcd_pwm_id
  88. log.info("AirLCD_1000", "LCD初始化成功,尺寸:", width, "x", height)
  89. -- return true
  90. end
  91. -- 设置背光亮度接口
  92. -- 使用背光PWM模式控制亮度,休眠和关闭背光使用背光引脚GPIO模式
  93. -- @param level 亮度级别(0-100)
  94. -- @return 设置成功状态
  95. function AirLCD_1000.set_backlight(level)
  96. -- 检查屏幕状态和PWM配置
  97. if screen_state.is_sleeping then
  98. log.warn("AirLCD_1000", "屏幕处于休眠状态,无法调节背光")
  99. return false
  100. end
  101. if not screen_state.lcd_pin_pwr then
  102. log.error("AirLCD_1000", "PWM配置不存在,无法调节背光")
  103. return false
  104. end
  105. -- 确保GPIO已关闭
  106. gpio.close(screen_state.lcd_pin_pwr)
  107. -- 设置并开启PWM
  108. pwm.stop(screen_state.lcd_pwm_id)
  109. pwm.close(screen_state.lcd_pwm_id)
  110. pwm.setup(screen_state.lcd_pwm_id, 1000, 100)
  111. pwm.open(screen_state.lcd_pwm_id, 1000, level)
  112. -- 修改默认背光亮度为当前设置
  113. screen_state.last_brightness = level
  114. screen_state.backlight_on = (level > 0)
  115. log.info("AirLCD_1000", "背光设置为", level, "%")
  116. return true
  117. end
  118. -- 开启LCD显示屏背光
  119. -- @return 操作成功状态
  120. function AirLCD_1000.lcd_on()
  121. if screen_state.is_sleeping then
  122. log.warn("AirLCD_1000", "屏幕处于休眠状态,无法开启背光")
  123. return false
  124. end
  125. pwm.stop(screen_state.lcd_pwm_id)
  126. pwm.close(screen_state.lcd_pwm_id)
  127. -- 设置GPIO控制电源(如果存在)
  128. if screen_state.lcd_pin_pwr then
  129. gpio.setup(screen_state.lcd_pin_pwr, 1, gpio.PULLUP)
  130. end
  131. lcd.on()
  132. log.info("AirLCD_1000", "LCD背光已开启")
  133. end
  134. -- 关闭LCD显示屏背光
  135. -- @return 操作成功状态
  136. function AirLCD_1000.lcd_off()
  137. if screen_state.is_sleeping then
  138. log.warn("AirLCD_1000", "屏幕处于休眠状态,无法关闭背光")
  139. return false
  140. end
  141. pwm.stop(screen_state.lcd_pwm_id)
  142. pwm.close(screen_state.lcd_pwm_id)
  143. -- 设置GPIO控制电源(如果存在)
  144. if screen_state.lcd_pin_pwr then
  145. gpio.setup(screen_state.lcd_pin_pwr, 1, gpio.PULLUP)
  146. end
  147. lcd.off()
  148. log.info("AirLCD_1000", "LCD背光已关闭")
  149. end
  150. -- 设置休眠状态接口
  151. -- @param sleep true进入休眠, false唤醒
  152. -- @return 操作成功状态
  153. function AirLCD_1000.set_sleep(sleep)
  154. if sleep then
  155. -- 进入休眠模式
  156. if not screen_state.is_sleeping then
  157. -- 关闭PWM(如果存在)
  158. if screen_state.lcd_pwm_id then
  159. pwm.stop(screen_state.lcd_pwm_id)
  160. pwm.close(screen_state.lcd_pwm_id)
  161. end
  162. -- 设置GPIO控制电源(如果存在)
  163. if screen_state.lcd_pin_pwr then
  164. gpio.setup(screen_state.lcd_pin_pwr, 1, gpio.PULLUP)
  165. gpio.set(screen_state.lcd_pin_pwr, 0)
  166. end
  167. -- 执行LCD睡眠
  168. lcd.sleep()
  169. screen_state.is_sleeping = true
  170. log.info("AirLCD_1000", "LCD进入休眠状态")
  171. end
  172. else
  173. -- 退出休眠模式
  174. if screen_state.is_sleeping then
  175. -- 唤醒LCD
  176. lcd.wakeup()
  177. -- 关闭GPIO控制(如果存在)
  178. if screen_state.lcd_pin_pwr then
  179. gpio.close(screen_state.lcd_pin_pwr)
  180. end
  181. -- 恢复之前的背光设置(如果PWM存在)
  182. if screen_state.lcd_pin_pwr then
  183. if screen_state.backlight_on then
  184. AirLCD_1000.set_backlight(screen_state.last_brightness)
  185. else
  186. -- 如果背光原本是关闭状态,保持关闭
  187. pwm.stop(screen_state.lcd_pwm_id)
  188. pwm.close(screen_state.lcd_pwm_id)
  189. end
  190. end
  191. screen_state.is_sleeping = false
  192. log.info("AirLCD_1000", "LCD唤醒")
  193. end
  194. end
  195. return true
  196. end
  197. return AirLCD_1000