S&B Volcano vaporizer remote control with Pi Pico W
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

lcd.py 7.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. # https://www.waveshare.com/wiki/Pico-LCD-1.3
  2. from machine import Pin, SPI, PWM
  3. import framebuf
  4. import time
  5. import os
  6. class KeyCheck:
  7. def __init__(self, new, old):
  8. self.new = new
  9. self.old = old
  10. def once(self, k):
  11. return self.new[k] and not self.old[k]
  12. class LCD(framebuf.FrameBuffer):
  13. def __init__(self):
  14. self.width = 240
  15. self.height = 240
  16. self.cs = Pin(9, Pin.OUT)
  17. self.rst = Pin(12, Pin.OUT)
  18. self.cs(1)
  19. #self.spi = SPI(1)
  20. #self.spi = SPI(1, 1_000_000)
  21. self.spi = SPI(1, 100_000_000, polarity=0, phase=0, sck=Pin(10), mosi=Pin(11), miso=None)
  22. self.dc = Pin(8, Pin.OUT)
  23. self.dc(1)
  24. self.buffer = bytearray(self.height * self.width * 2)
  25. super().__init__(self.buffer, self.width, self.height, framebuf.RGB565)
  26. self.init_display()
  27. self.red = 0x07E0
  28. self.green = 0x001f
  29. self.blue = 0xf800
  30. self.white = 0xffff
  31. self.black = 0x0000
  32. self.fill(self.black)
  33. self.show()
  34. self.pwm = PWM(Pin(13))
  35. self.pwm.freq(1000)
  36. self.brightness(0.0)
  37. self.keyA = Pin(15,Pin.IN,Pin.PULL_UP)
  38. self.keyB = Pin(17,Pin.IN,Pin.PULL_UP)
  39. self.keyX = Pin(19 ,Pin.IN,Pin.PULL_UP)
  40. self.keyY= Pin(21 ,Pin.IN,Pin.PULL_UP)
  41. self.up = Pin(2,Pin.IN,Pin.PULL_UP)
  42. self.down = Pin(18,Pin.IN,Pin.PULL_UP)
  43. self.left = Pin(16,Pin.IN,Pin.PULL_UP)
  44. self.right = Pin(20,Pin.IN,Pin.PULL_UP)
  45. self.ctrl = Pin(3,Pin.IN,Pin.PULL_UP)
  46. self.keys_old = {
  47. "a": False,
  48. "b": False,
  49. "x": False,
  50. "y": False,
  51. "up": False,
  52. "down": False,
  53. "left": False,
  54. "right": False,
  55. "enter": False,
  56. }
  57. def buttons(self):
  58. keys = {
  59. "a": self.keyA.value() == 0,
  60. "b": self.keyB.value() == 0,
  61. "x": self.keyX.value() == 0,
  62. "y": self.keyY.value() == 0,
  63. "up": self.up.value() == 0,
  64. "down": self.down.value() == 0,
  65. "left": self.left.value() == 0,
  66. "right": self.right.value() == 0,
  67. "enter": self.ctrl.value() == 0,
  68. }
  69. kc = KeyCheck(keys, self.keys_old)
  70. self.keys_old = keys.copy()
  71. return kc
  72. def brightness(self, v):
  73. self.pwm.duty_u16(int(v * 65535))
  74. def write_cmd(self, cmd):
  75. self.cs(1)
  76. self.dc(0)
  77. self.cs(0)
  78. self.spi.write(bytearray([cmd]))
  79. self.cs(1)
  80. def write_data(self, buf):
  81. self.cs(1)
  82. self.dc(1)
  83. self.cs(0)
  84. self.spi.write(bytearray([buf]))
  85. self.cs(1)
  86. def init_display(self):
  87. self.rst(1)
  88. self.rst(0)
  89. self.rst(1)
  90. self.write_cmd(0x36)
  91. self.write_data(0x70)
  92. self.write_cmd(0x3A)
  93. self.write_data(0x05)
  94. self.write_cmd(0xB2)
  95. self.write_data(0x0C)
  96. self.write_data(0x0C)
  97. self.write_data(0x00)
  98. self.write_data(0x33)
  99. self.write_data(0x33)
  100. self.write_cmd(0xB7)
  101. self.write_data(0x35)
  102. self.write_cmd(0xBB)
  103. self.write_data(0x19)
  104. self.write_cmd(0xC0)
  105. self.write_data(0x2C)
  106. self.write_cmd(0xC2)
  107. self.write_data(0x01)
  108. self.write_cmd(0xC3)
  109. self.write_data(0x12)
  110. self.write_cmd(0xC4)
  111. self.write_data(0x20)
  112. self.write_cmd(0xC6)
  113. self.write_data(0x0F)
  114. self.write_cmd(0xD0)
  115. self.write_data(0xA4)
  116. self.write_data(0xA1)
  117. self.write_cmd(0xE0)
  118. self.write_data(0xD0)
  119. self.write_data(0x04)
  120. self.write_data(0x0D)
  121. self.write_data(0x11)
  122. self.write_data(0x13)
  123. self.write_data(0x2B)
  124. self.write_data(0x3F)
  125. self.write_data(0x54)
  126. self.write_data(0x4C)
  127. self.write_data(0x18)
  128. self.write_data(0x0D)
  129. self.write_data(0x0B)
  130. self.write_data(0x1F)
  131. self.write_data(0x23)
  132. self.write_cmd(0xE1)
  133. self.write_data(0xD0)
  134. self.write_data(0x04)
  135. self.write_data(0x0C)
  136. self.write_data(0x11)
  137. self.write_data(0x13)
  138. self.write_data(0x2C)
  139. self.write_data(0x3F)
  140. self.write_data(0x44)
  141. self.write_data(0x51)
  142. self.write_data(0x2F)
  143. self.write_data(0x1F)
  144. self.write_data(0x1F)
  145. self.write_data(0x20)
  146. self.write_data(0x23)
  147. self.write_cmd(0x21)
  148. self.write_cmd(0x11)
  149. self.write_cmd(0x29)
  150. def show(self):
  151. self.write_cmd(0x2A)
  152. self.write_data(0x00)
  153. self.write_data(0x00)
  154. self.write_data(0x00)
  155. self.write_data(0xef)
  156. self.write_cmd(0x2B)
  157. self.write_data(0x00)
  158. self.write_data(0x00)
  159. self.write_data(0x00)
  160. self.write_data(0xEF)
  161. self.write_cmd(0x2C)
  162. self.cs(1)
  163. self.dc(1)
  164. self.cs(0)
  165. self.spi.write(self.buffer)
  166. self.cs(1)
  167. if __name__ == '__main__':
  168. lcd = LCD()
  169. lcd.brightness(1.0)
  170. try:
  171. while True:
  172. lcd.fill(lcd.white)
  173. if lcd.keyA.value() == 0:
  174. lcd.fill_rect(208,15,30,30,lcd.red)
  175. else:
  176. lcd.fill_rect(208,15,30,30,lcd.white)
  177. lcd.rect(208,15,30,30,lcd.red)
  178. if lcd.keyB.value() == 0:
  179. lcd.fill_rect(208,75,30,30,lcd.red)
  180. else:
  181. lcd.fill_rect(208,75,30,30,lcd.white)
  182. lcd.rect(208,75,30,30,lcd.red)
  183. if lcd.keyX.value() == 0:
  184. lcd.fill_rect(208,135,30,30,lcd.red)
  185. else:
  186. lcd.fill_rect(208,135,30,30,lcd.white)
  187. lcd.rect(208,135,30,30,lcd.red)
  188. if lcd.keyY.value() == 0:
  189. lcd.fill_rect(208,195,30,30,lcd.red)
  190. else:
  191. lcd.fill_rect(208,195,30,30,lcd.white)
  192. lcd.rect(208,195,30,30,lcd.red)
  193. if lcd.up.value() == 0:
  194. lcd.fill_rect(60,60,30,30,lcd.red)
  195. else:
  196. lcd.fill_rect(60,60,30,30,lcd.white)
  197. lcd.rect(60,60,30,30,lcd.red)
  198. if lcd.down.value() == 0:
  199. lcd.fill_rect(60,150,30,30,lcd.red)
  200. else:
  201. lcd.fill_rect(60,150,30,30,lcd.white)
  202. lcd.rect(60,150,30,30,lcd.red)
  203. if lcd.left.value() == 0:
  204. lcd.fill_rect(15,105,30,30,lcd.red)
  205. else:
  206. lcd.fill_rect(15,105,30,30,lcd.white)
  207. lcd.rect(15,105,30,30,lcd.red)
  208. if lcd.right.value() == 0:
  209. lcd.fill_rect(105,105,30,30,lcd.red)
  210. else:
  211. lcd.fill_rect(105,105,30,30,lcd.white)
  212. lcd.rect(105,105,30,30,lcd.red)
  213. if lcd.ctrl.value() == 0:
  214. lcd.fill_rect(60,105,30,30,lcd.red)
  215. else:
  216. lcd.fill_rect(60,105,30,30,lcd.white)
  217. lcd.rect(60,105,30,30,lcd.red)
  218. lcd.show()
  219. time.sleep(0.1)
  220. except KeyboardInterrupt:
  221. pass
  222. lcd.fill(lcd.black)
  223. lcd.show()
  224. lcd.brightness(0.0)