__init__.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477
  1. """
  2. Author: Tobias Müller
  3. Date: 30.06.2023
  4. Version: 0.7
  5. This file contains classes for LCD, Button and Led control.
  6. """
  7. ############################## Modules ##############################
  8. from time import sleep_us
  9. from machine import Pin, PWM, I2C
  10. import re
  11. ############################## Code ##############################
  12. class LCD:
  13. ############################## Attributes ##############################
  14. __lcd_setting_para = {"LCD_PARA_EXT_FUNC": 0x09, # Extended Function (4 line mode)
  15. "LCD_PARA_BIAS_SET": 0x12, # Bias Setting (BS1 = 1)
  16. "LCD_PARA_INT_OSC": 0x1B, # Internal OSC (BS0 = 1, Bias = 1/6)
  17. "LCD_PARA_FOL_CON": 0x6E, # Follower Control (Devider on, Set Value)
  18. "LCD_PARA_DIS_CON": 0x0C} # Display on/off Control (Cursor off, Blink off)
  19. __lcd_contrast_para = {"LCD_PARA_POW_CON": 0x54, # Power Control (Booster on) and Contrast (C5, C4)
  20. "LCD_PARA_CONTRAST": 0x70} # Contrast (C3 - C0)
  21. __lcd_line_mode_para = {"LCD_PARA_LINES": 0x12} # Line Mode
  22. __lcd_direction_para = {"LCD_PARA_ENTRY_MODE": 0x04} # Display direction / orientation
  23. __lcd_control_para_priv = {"CONTROL_BYTE": 0x00, # Control Byte
  24. "CONTROL_BYTE_C0": 0x80, # Control Byte (C0 = 1)
  25. "CONTROL_BYTE_RS": 0x40, # Control Byte (RS = 1)
  26. "CONTROL_BYTE_C0_RS": 0xC0, # Control Byte (C0 = 1, RS = 1)
  27. "FUNCTION_SET": 0x38, # Function Set
  28. "FUNCTION_SET_RE": 0x3A, # Function Set (RE = 1)
  29. "FUNCTION_SET_IS": 0x39, # Function Set (IS = 1)
  30. "CLEAR_DISPLAY": 0x01, # Clear Display
  31. "DISPLAY_ROW_1": 0x80, # Display Row 1
  32. "DISPLAY_ROW_2": 0xA0, # Display Row 2
  33. "DISPLAY_ROW_3": 0xC0, # Display Row 3
  34. "DISPLAY_ROW_4": 0xE0, # Display Row 4
  35. "DISPLAY_COLUMN": 0x0A} # Columns per Display Row
  36. __lcd_rom_para = {"LCD_PARA_ROM_SEL": 0x72}
  37. __lcd_rom = {"ROM A": 0, "ROM B": 1, "ROM C": 2,
  38. "A": 0, "B": 1, "C": 2,
  39. 1: 0, 2: 1, 3: 2}
  40. __i2c_ports = {"I2C0": {"SDA_PINS": [0, 4 ,8 ,12 ,16 ,20],
  41. "SCL_PINS": [1, 5, 9, 13, 17, 21]},
  42. "I2C1": {"SDA_PINS": [2, 6, 10, 14, 18, 26],
  43. "SCL_PINS": [3, 7, 11, 15, 19, 27]}}
  44. __i2c_frequencies = {"STANDARD_MODE": 100000,
  45. "FAST_MODE": 400000}
  46. __i2c_address = 0x3c
  47. ############################## Constructor ##############################
  48. def __init__(self,
  49. i2c_sda_pin: int|str = 2,
  50. i2c_scl_pin: int|str = 3,
  51. i2c_frequency: int|str = "FAST_MODE",
  52. lcd_backlight_pin: int|str = 28,
  53. lcd_brightness: int = 100,
  54. lcd_contrast: int = 0x2A,
  55. lcd_ascii_table: int|str = "ROM B",
  56. lcd_line_mode: int = 0,
  57. lcd_direction_top: int|bool = False):
  58. # Check and store input values
  59. self.__i2c_bus, self.__i2c_sda_pin, self.__i2c_scl_pin = self.__check_i2c_ports(i2c_sda_pin,
  60. i2c_scl_pin)
  61. self.__i2c_frequency = self.__check_i2c_frequency(i2c_frequency)
  62. self.__lcd_backlight_pin = self.__check_lcd_backlight_pin(lcd_backlight_pin)
  63. self.__lcd_brightness = self.__check_lcd_brightness(lcd_brightness)
  64. self.__lcd_contrast = self.__check_lcd_contrast(lcd_contrast)
  65. self.__lcd_ascii_table = self.__check_lcd_ascii_table(lcd_ascii_table)
  66. self.__lcd_line_mode = self.__check_lcd_line_mode(lcd_line_mode)
  67. self.__lcd_direction_top = self.__check_lcd_direction_top(lcd_direction_top)
  68. # init i2c and backlight
  69. self.__init_i2c()
  70. self.__init_backlight_pwm()
  71. ############################## Properties private ##############################
  72. @property
  73. def __lcd_control_para(self):
  74. lcd_control_para = self.__lcd_control_para_priv.copy()
  75. if self.__lcd_line_mode:
  76. lcd_control_para["FUNCTION_SET"] = 0x3C
  77. if self.__lcd_direction_top:
  78. lcd_control_para["DISPLAY_ROW_1"] = 0x8A
  79. lcd_control_para["DISPLAY_ROW_2"] = 0xAA
  80. lcd_control_para["DISPLAY_ROW_3"] = 0xCA
  81. lcd_control_para["DISPLAY_ROW_4"] = 0xEA
  82. return lcd_control_para
  83. ############################## Properties ##############################
  84. @property
  85. def lcd_brightness(self):
  86. return self.__lcd_brightness
  87. @lcd_brightness.setter
  88. def lcd_brightness(self, lcd_brightness: int):
  89. self.__lcd_brightness = self.__check_lcd_brightness(lcd_brightness)
  90. self.__set_lcd_brightness()
  91. @property
  92. def lcd_ascii_table(self):
  93. return self.__lcd_ascii_table
  94. @lcd_ascii_table.setter
  95. def lcd_ascii_table(self, lcd_ascii_table: int|str):
  96. self.__lcd_ascii_table = self.__check_lcd_ascii_table(lcd_ascii_table)
  97. self.__set_lcd_ascii_table()
  98. @property
  99. def lcd_contrast(self):
  100. return self.__lcd_contrast
  101. @lcd_contrast.setter
  102. def lcd_contrast(self, lcd_contrast: int):
  103. self.__lcd_contrast = self.__check_lcd_contrast(lcd_contrast)
  104. self.__set_lcd_contrast()
  105. @property
  106. def lcd_direction_top(self):
  107. return self.__lcd_direction_top
  108. @lcd_direction_top.setter
  109. def lcd_direction_top(self, lcd_direction_top: int|bool):
  110. self.__lcd_direction_top = self.__check_lcd_direction_top(lcd_direction_top)
  111. self.__set_lcd_direction()
  112. self.clear()
  113. @property
  114. def lcd_line_mode(self):
  115. return self.__lcd_line_mode
  116. @lcd_line_mode.setter
  117. def lcd_line_mode(self, lcd_line_mode: int):
  118. self.__lcd_line_mode = self.__check_lcd_line_mode(lcd_line_mode)
  119. self.__set_lcd_line_mode()
  120. @property
  121. def lcd_backlight_pin(self):
  122. return self.__lcd_backlight_pin
  123. @lcd_backlight_pin.setter
  124. def lcd_backlight_pin(self, lcd_backlight_pin: int|str):
  125. self.__check_lcd_backlight_pin(lcd_backlight_pin)
  126. self.__deinit_backlight_pwm()
  127. self.lcd_backlight_pin = lcd_backlight_pin
  128. self.__init_backlight_pwm()
  129. @property
  130. def i2c_frequency(self):
  131. return self.__i2c_frequency
  132. @i2c_frequency.setter
  133. def i2c_frequency(self, i2c_frequency: int|str):
  134. self.__check_i2c_frequency(i2c_frequency)
  135. self.__deinit_i2c()
  136. self.__i2c_frequency = i2c_frequency
  137. self.__init_i2c()
  138. @property
  139. def i2c_sda_pin(self):
  140. return self.__i2c_sda_pin
  141. @i2c_sda_pin.setter
  142. def i2c_sda_pin(self, i2c_sda_pin: int|str):
  143. self.__check_i2c_ports(i2c_sda_pin, self.__i2c_scl_pin)
  144. self.__deinit_i2c()
  145. (self.__i2c_bus,
  146. self.__i2c_sda_pin,
  147. self.__i2c_scl_pin) = self.__check_i2c_ports(i2c_sda_pin, self.__i2c_scl_pin)
  148. self.__init_i2c()
  149. @property
  150. def i2c_scl_pin(self):
  151. return self.__i2c_scl_pin
  152. @i2c_scl_pin.setter
  153. def i2c_scl_pin(self, i2c_scl_pin: int|str):
  154. self.__check_i2c_ports(self.__i2c_sda_pin, i2c_scl_pin)
  155. self.__deinit_i2c()
  156. (self.__i2c_bus,
  157. self.__i2c_sda_pin,
  158. self.__i2c_scl_pin) = self.__check_i2c_ports(self.__i2c_sda_pin, i2c_scl_pin)
  159. self.__init_i2c()
  160. ############################## Methods private ##############################
  161. @staticmethod
  162. def __reset_pin(pin: int|str):
  163. Pin(pin, Pin.IN, None)
  164. @staticmethod
  165. def __check_lcd_brightness(lcd_brightness: int):
  166. if not isinstance(lcd_brightness, int):
  167. raise ValueError(f"Value \"{lcd_brightness}\" of \"lcd_brightness\" is not type \"int\"!")
  168. elif lcd_brightness < 0 or lcd_brightness > 100:
  169. raise ValueError(f"Value \"{lcd_brightness}\" of \"lcd_brightness\" is out of range!")
  170. else:
  171. return lcd_brightness
  172. @staticmethod
  173. def __check_lcd_backlight_pin(lcd_backlight_pin: int|str):
  174. if not isinstance(lcd_backlight_pin, int) and not isinstance(lcd_backlight_pin, str):
  175. raise ValueError(f"Value \"{lcd_backlight_pin}\" of \"lcd_backlight_pin\" is not type" +
  176. " \"int\" or \"str\"!")
  177. elif isinstance(lcd_backlight_pin, str) and not re.match(r"^GP\d\d?$",lcd_backlight_pin):
  178. raise ValueError(f"String value \"{lcd_backlight_pin}\" of \"lcd_backlight_pin\" has" +
  179. " wrong format!")
  180. else:
  181. return lcd_backlight_pin
  182. @staticmethod
  183. def __check_lcd_line_mode(lcd_line_mode: int):
  184. if not isinstance(lcd_line_mode, int):
  185. raise ValueError(f"Value \"{lcd_line_mode}\" of \"lcd_line_mode\" is not type \"int\"!")
  186. elif lcd_line_mode < 0 or lcd_line_mode > 4:
  187. raise ValueError(f"Value \"{lcd_line_mode}\" of \"lcd_line_mode\" is out of range!")
  188. else:
  189. return lcd_line_mode
  190. @staticmethod
  191. def __check_lcd_direction_top(lcd_direction_top: int|bool):
  192. if not isinstance(lcd_direction_top, int) and not isinstance(lcd_direction_top, bool):
  193. raise ValueError(f"Value \"{lcd_direction_top}\" of \"lcd_direction_top\" is not type" +
  194. " \"int\" or \"bool\"!")
  195. elif isinstance(lcd_direction_top, int) and (lcd_direction_top < 0 or lcd_direction_top > 1):
  196. raise ValueError(f"Value \"{lcd_direction_top}\" of \"lcd_direction_top\" is out of range!")
  197. else:
  198. return lcd_direction_top
  199. @staticmethod
  200. def __check_lcd_contrast(lcd_contrast: int):
  201. if not isinstance(lcd_contrast, int):
  202. raise ValueError(f"Value \"{lcd_contrast}\" of \"lcd_contrast\" is not type \"int\"!")
  203. elif lcd_contrast < 0 or lcd_contrast > 63:
  204. raise ValueError(f"Value \"{lcd_contrast}\" of \"lcd_contrast\" is out of range!")
  205. else:
  206. return lcd_contrast
  207. def __check_lcd_ascii_table(self, lcd_ascii_table: int|str):
  208. if not isinstance(lcd_ascii_table, int) and not isinstance(lcd_ascii_table, str):
  209. raise ValueError(f"Value \"{lcd_ascii_table}\" of \"lcd_ascii_table\" is not type" +
  210. " \"int\" or \"str\"!")
  211. elif lcd_ascii_table not in self.__lcd_rom.keys():
  212. raise ValueError(f"Value \"{lcd_ascii_table}\" of \"lcd_ascii_table\" is not supported!")
  213. else:
  214. return lcd_ascii_table
  215. def __check_i2c_ports(self, i2c_sda_pin: int|str, i2c_scl_pin: int|str):
  216. if not isinstance(i2c_sda_pin, int) and not isinstance(i2c_sda_pin, str):
  217. raise ValueError(f"Value \"{i2c_sda_pin}\" of \"i2c_sda_pin\" is not type \"int\"" +
  218. " or \"str\"!")
  219. elif not isinstance(i2c_scl_pin, int) and not isinstance(i2c_scl_pin, str):
  220. raise ValueError(f"Value \"{i2c_scl_pin}\" of \"i2c_scl_pin\" is not type \"int\"" +
  221. " or \"str\"!")
  222. elif isinstance(i2c_sda_pin, str) and not re.match(r"^GP\d\d?$",i2c_sda_pin):
  223. raise ValueError(f"String value \"{i2c_sda_pin}\" of \"i2c_sda_pin\" has wrong format!")
  224. elif isinstance(i2c_scl_pin, str) and not re.match(r"^GP\d\d?$",i2c_scl_pin):
  225. raise ValueError(f"String value \"{i2c_scl_pin}\" of \"i2c_scl_pin\" has wrong format!")
  226. elif ((isinstance(i2c_sda_pin, int) and
  227. not i2c_sda_pin in self.__i2c_ports["I2C0"]["SDA_PINS"] and
  228. not i2c_sda_pin in self.__i2c_ports["I2C1"]["SDA_PINS"]) or
  229. (isinstance(i2c_sda_pin, str) and
  230. not int(i2c_sda_pin[2:]) in self.__i2c_ports["I2C0"]["SDA_PINS"] and
  231. not int(i2c_sda_pin[2:]) in self.__i2c_ports["I2C1"]["SDA_PINS"])):
  232. raise ValueError(f"Value \"{i2c_sda_pin}\" of \"i2c_sda_pin\" is not an I2C SDA-Pin!")
  233. elif ((isinstance(i2c_scl_pin, int) and
  234. not i2c_scl_pin in self.__i2c_ports["I2C0"]["SCL_PINS"] and
  235. not i2c_scl_pin in self.__i2c_ports["I2C1"]["SCL_PINS"]) or
  236. (isinstance(i2c_scl_pin, str) and
  237. not int(i2c_scl_pin[2:]) in self.__i2c_ports["I2C0"]["SCL_PINS"] and
  238. not int(i2c_scl_pin[2:]) in self.__i2c_ports["I2C1"]["SCL_PINS"])):
  239. raise ValueError(f"Value \"{i2c_scl_pin}\" of \"i2c_scl_pin\" is not an I2C SCL-Pin!")
  240. elif ((((isinstance(i2c_sda_pin, int) and
  241. i2c_sda_pin in self.__i2c_ports["I2C0"]["SDA_PINS"]) or
  242. (isinstance(i2c_sda_pin, str) and
  243. int(i2c_sda_pin[2:]) in self.__i2c_ports["I2C0"]["SDA_PINS"])) and not
  244. ((isinstance(i2c_scl_pin, int) and
  245. i2c_scl_pin in self.__i2c_ports["I2C0"]["SCL_PINS"]) or
  246. (isinstance(i2c_scl_pin, str) and
  247. int(i2c_scl_pin[2:]) in self.__i2c_ports["I2C0"]["SCL_PINS"]))) or
  248. (((isinstance(i2c_sda_pin, int) and
  249. i2c_sda_pin in self.__i2c_ports["I2C1"]["SDA_PINS"]) or
  250. (isinstance(i2c_sda_pin, str) and
  251. int(i2c_sda_pin[2:]) in self.__i2c_ports["I2C1"]["SDA_PINS"])) and not
  252. ((isinstance(i2c_scl_pin, int) and
  253. i2c_scl_pin in self.__i2c_ports["I2C1"]["SCL_PINS"]) or
  254. (isinstance(i2c_scl_pin, str) and
  255. int(i2c_scl_pin[2:]) in self.__i2c_ports["I2C1"]["SCL_PINS"])))):
  256. raise ValueError(f"Value \"{i2c_scl_pin}\" of \"i2c_scl_pin\" and " +
  257. f"Value \"{i2c_sda_pin}\" of \"i2c_sda_pin\" " +
  258. "are not part of the same I2C Bus!")
  259. else:
  260. if ((isinstance(i2c_sda_pin, int) and
  261. i2c_sda_pin in self.__i2c_ports["I2C0"]["SDA_PINS"]) or
  262. (isinstance(i2c_sda_pin, str) and
  263. int(i2c_sda_pin[2:]) in self.__i2c_ports["I2C0"]["SDA_PINS"])):
  264. return 0, i2c_sda_pin, i2c_scl_pin
  265. else:
  266. return 1, i2c_sda_pin, i2c_scl_pin
  267. def __check_i2c_frequency(self, i2c_frequency: int|str):
  268. if not isinstance(i2c_frequency, int) and not isinstance(i2c_frequency, str):
  269. raise ValueError(f"Value \"{i2c_frequency}\" of \"i2c_frequency\" is not type \"int\"" +
  270. " or \"str\"!")
  271. elif (isinstance(i2c_frequency, int) and not i2c_frequency in self.__i2c_frequencies.values() or
  272. isinstance(i2c_frequency, str) and not i2c_frequency in self.__i2c_frequencies.keys()):
  273. raise ValueError(f"Value \"{i2c_frequency}\" of \"i2c_frequency\" is not supported!")
  274. else:
  275. return i2c_frequency
  276. def __init_i2c(self):
  277. self.__i2c = I2C(self.__i2c_bus,
  278. sda=Pin(self.__i2c_sda_pin),
  279. scl=Pin(self.__i2c_scl_pin),
  280. freq=(self.__i2c_frequency if isinstance(self.__i2c_frequency, int) else
  281. self.__i2c_frequencies[self.__i2c_frequency]))
  282. buffer = (self.__lcd_control_para["CONTROL_BYTE"],
  283. self.__lcd_control_para["FUNCTION_SET_RE"],
  284. self.__lcd_setting_para["LCD_PARA_EXT_FUNC"],
  285. self.__lcd_setting_para["LCD_PARA_BIAS_SET"],
  286. self.__lcd_control_para["FUNCTION_SET_IS"],
  287. self.__lcd_setting_para["LCD_PARA_INT_OSC"],
  288. self.__lcd_setting_para["LCD_PARA_FOL_CON"],
  289. self.__lcd_control_para["FUNCTION_SET"],
  290. self.__lcd_setting_para["LCD_PARA_DIS_CON"])
  291. self.__i2c.writeto(self.__i2c_address, bytes(buffer))
  292. self.__set_lcd_line_mode()
  293. self.__set_lcd_ascii_table()
  294. self.__set_lcd_contrast()
  295. self.__set_lcd_direction()
  296. self.clear()
  297. def __deinit_i2c(self):
  298. self.__reset_pin(self.__i2c_scl_pin)
  299. self.__reset_pin(self.__i2c_sda_pin)
  300. def __init_backlight_pwm(self):
  301. self.__backlight_pwm = PWM(Pin(self.__lcd_backlight_pin))
  302. self.__backlight_pwm.freq(1000)
  303. self.__set_lcd_brightness()
  304. def __deinit_backlight_pwm(self):
  305. self.__backlight_pwm.deinit()
  306. self.__reset_pin(self.__lcd_backlight_pin)
  307. def __set_lcd_brightness(self):
  308. self.__backlight_pwm.duty_u16(round(65635 * (self.__lcd_brightness / 100)))
  309. def __set_lcd_ascii_table(self):
  310. buffer = (self.__lcd_control_para["CONTROL_BYTE_C0"],
  311. self.__lcd_control_para["FUNCTION_SET_RE"],
  312. self.__lcd_control_para["CONTROL_BYTE_C0"],
  313. self.__lcd_rom_para["LCD_PARA_ROM_SEL"],
  314. self.__lcd_control_para["CONTROL_BYTE_C0_RS"],
  315. self.__lcd_rom[self.__lcd_ascii_table] << 0x02,
  316. self.__lcd_control_para["CONTROL_BYTE"],
  317. self.__lcd_control_para["FUNCTION_SET"])
  318. self.__i2c.writeto(self.__i2c_address, bytes(buffer))
  319. def __set_lcd_contrast(self):
  320. buffer = (self.__lcd_control_para["CONTROL_BYTE"],
  321. self.__lcd_control_para["FUNCTION_SET_IS"],
  322. self.__lcd_contrast_para["LCD_PARA_POW_CON"] | (self.__lcd_contrast >> 0x04),
  323. self.__lcd_contrast_para["LCD_PARA_CONTRAST"] | (self.__lcd_contrast & 0x0F),
  324. self.__lcd_control_para["FUNCTION_SET"])
  325. self.__i2c.writeto(self.__i2c_address, bytes(buffer))
  326. def __set_lcd_direction(self):
  327. buffer = [self.__lcd_control_para["CONTROL_BYTE"],
  328. self.__lcd_control_para["FUNCTION_SET_RE"]]
  329. if self.__lcd_direction_top:
  330. buffer.append(self.__lcd_direction_para["LCD_PARA_ENTRY_MODE"] | 0x01)
  331. else:
  332. buffer.append(self.__lcd_direction_para["LCD_PARA_ENTRY_MODE"] | 0x02)
  333. buffer.append(self.__lcd_control_para["FUNCTION_SET"])
  334. self.__i2c.writeto(self.__i2c_address, bytes(buffer))
  335. def __set_lcd_line_mode(self):
  336. buffer = [self.__lcd_control_para["CONTROL_BYTE"],
  337. self.__lcd_control_para["FUNCTION_SET_RE"]]
  338. if self.__lcd_line_mode:
  339. buffer.append(self.__lcd_line_mode_para["LCD_PARA_LINES"] |
  340. ((self.__lcd_line_mode - 1) << 0x02))
  341. else:
  342. buffer.append(self.__lcd_line_mode_para["LCD_PARA_LINES"])
  343. buffer.append(self.__lcd_control_para["FUNCTION_SET"])
  344. self.__i2c.writeto(self.__i2c_address, bytes(buffer))
  345. ############################## Methods public ##############################
  346. def change_i2c_port(self, i2c_sda_pin: int|str, i2c_scl_pin: int|str):
  347. self.__check_i2c_ports(i2c_sda_pin, i2c_scl_pin)
  348. self.__deinit_i2c()
  349. (self.__i2c_bus,
  350. self.__i2c_sda_pin,
  351. self.__i2c_scl_pin) = self.__check_i2c_ports(i2c_sda_pin, i2c_scl_pin)
  352. self.__init_i2c()
  353. def print(self, text: str, **keywords):
  354. def check_text(text: str):
  355. if not isinstance(text, str):
  356. raise ValueError(f"Value \"{text}\" of \"text\" is not type \"str\"!")
  357. elif len(text) == 0:
  358. raise ValueError(f"Value \"{text}\" of \"text\" is out of range!")
  359. def check_keywords(keywords):
  360. pass
  361. buffer = []
  362. char=0
  363. linefeed = ("\n","\r")
  364. column = 0
  365. line = 1
  366. lines = 4 if self.__lcd_line_mode == 0 else 2 if self.__lcd_line_mode == 3 else 3
  367. if len(keywords) == 0:
  368. check_text(text)
  369. for row in range(line,lines + 1):
  370. print(len(text))
  371. if len(text) == 0:
  372. break
  373. buffer.append(self.__lcd_control_para["CONTROL_BYTE_C0"])
  374. buffer.append(self.__lcd_control_para["DISPLAY_ROW_" + str(row)])
  375. for char in range(0, self.__lcd_control_para["DISPLAY_COLUMN"] if
  376. len(text) > self.__lcd_control_para["DISPLAY_COLUMN"] else
  377. len(text)):
  378. if text[char] in linefeed:
  379. text = text[char + 1:]
  380. break
  381. buffer.append(self.__lcd_control_para["CONTROL_BYTE_C0_RS"])
  382. buffer.append(ord(text[char]))
  383. else:
  384. text = text[self.__lcd_control_para["DISPLAY_COLUMN"]:]
  385. else:
  386. check_text(text)
  387. check_keywords(keywords)
  388. print(keywords)
  389. self.__i2c.writeto(self.__i2c_address, bytes(buffer))
  390. def clear(self, **keywords):
  391. buffer = (self.__lcd_control_para["CONTROL_BYTE"],
  392. self.__lcd_control_para["CLEAR_DISPLAY"])
  393. self.__i2c.writeto(self.__i2c_address, bytes(buffer))
  394. if __name__ == "__main__":
  395. lcd = LCD(i2c_scl_pin="GP1",
  396. i2c_sda_pin=0,
  397. i2c_frequency=400000,
  398. lcd_backlight_pin=5,
  399. lcd_direction_top=False,
  400. lcd_line_mode=0,
  401. lcd_contrast=40,
  402. lcd_brightness=100,
  403. lcd_ascii_table="B")
  404. lcd.print("Hallöle")
  405. sleep_us(2000000)
  406. lcd.clear()
  407. sleep_us(2000000)
  408. lcd.print("Hallüüüüü")