Advertisement
daiman

foobar

Dec 12th, 2024
28
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.92 KB | None | 0 0
  1. """
  2.  
  3. Описание сдвигового регистра тут
  4.  
  5. https://ampermarket.kz/base/ex8-indicator-and-74hc595n/
  6.  
  7. Цифры
  8.  
  9. 0 A, B, C, D, E, F 0b11000000 0x3F
  10. 1 B, C 0b11111001 0x06
  11. 2 A, B, G, E, D 0b10100100 0x5B
  12. 3 A, B, G, C, D 0b10110000 0x5F
  13. 4 F, G, B, C 0b10011001 0x66
  14. 5 A, F, G, C, D 0b10010010 0x6D
  15. 6 A, F, G, C, D, E 0b10000010 0x7D
  16. 7 A, B, C 0b11111000 0x07
  17. 8 Все сегменты 0b10000000 0x7F
  18. 9 A, B, C, D, F, G 0b10010000 0x7F
  19. - 0b11000000 0xC0
  20.  
  21. Буквы
  22.  
  23. E A, D, E, F, G 0b10000110 0x86
  24. H B, C, E, F, G 0b10001001 0x89
  25. L D, E, F 0b11000111 0xC7
  26.  
  27. разряды сегментов
  28.  
  29. сегмент 1 0b00001000 0x08
  30. сегмент 2 0b00000100 0x04
  31. сегмент 3 0b00000010 0x02
  32. сегмент 4 0b00000001 0x01
  33.  
  34. пример сообщения
  35. second_message = [
  36. 0b11000111000010001000100100001000,
  37. 0b11000111000001001000011000000100,
  38. 0b10000110000000101100011100000010,
  39. 0b10001001000000011100011100000001,
  40. ]
  41.  
  42. """
  43. import RPi.GPIO as GPIO
  44. from queue import Queue
  45.  
  46.  
  47. class TM74HC595:
  48. def __init__(
  49. self,
  50. gpio: GPIO,
  51. dataPin: int = 21, # GPIO для данных
  52. clockPin: int = 16, # GPIO для тактового сигнала
  53. latchPin: int = 20, # GPIO для сигнала обновления (RCLK)
  54. ) -> None:
  55.  
  56. # pins settings
  57. self.gpio = gpio
  58. self.dataPin = dataPin
  59. self.clockPin = clockPin
  60. self.latchPin = latchPin
  61. self.gpio.setup(self.dataPin, self.gpio.OUT)
  62. self.gpio.setup(self.clockPin, self.gpio.OUT)
  63. self.gpio.setup(self.latchPin, self.gpio.OUT)
  64.  
  65. # default values
  66. self.f_value = "----"
  67. self._f_cur_value = "----"
  68. self.s_value = "----"
  69. self._s_cur_value = "----"
  70. self.show = True
  71.  
  72. # symbols values
  73. self.sym = {
  74. "0": 0xC0,
  75. "1": 0xF9,
  76. "2": 0xA4,
  77. "3": 0xB0,
  78. "4": 0x99,
  79. "5": 0x92,
  80. "6": 0x82,
  81. "7": 0xF8,
  82. "8": 0x80,
  83. "9": 0x90,
  84. "-": 0xC0,
  85. }
  86. self.segment = {
  87. 1: 0x08,
  88. 2: 0x04,
  89. 3: 0x02,
  90. 4: 0x01,
  91. }
  92.  
  93. def latch(self) -> None:
  94. self.gpio.output(self.latchPin, self.gpio.HIGH)
  95. self.gpio.output(self.latchPin, self.gpio.LOW)
  96.  
  97. def s_shiftOut(
  98. self,
  99. data: int
  100. ) -> None:
  101. for i in range(32):
  102. self.gpio.output(self.clockPin, self.gpio.LOW)
  103. self.gpio.output(self.dataPin, (data & (1 << (31 - i))) != 0)
  104. self.gpio.output(self.clockPin, self.gpio.HIGH)
  105.  
  106. def build_message(
  107. self,
  108. ) -> list[int]:
  109. if self.f_value != self._f_cur_value and self.s_value != self._s_cur_value:
  110. curent_message = [
  111. (
  112. (self.sym.get(self.s_value[0]) << 24)
  113. | (self.segment.get(1) << 16)
  114. | (self.f_value[0] << 8)
  115. | self.segment.get(1)
  116. ),
  117. (
  118. (self.sym.get(self.s_value[1]) << 24)
  119. | (self.segment.get(2) << 16)
  120. | (self.f_value[1] << 8)
  121. | self.segment.get(2)
  122. ),
  123. (
  124. (self.sym.get(self.s_value[2]) << 24)
  125. | (self.segment.get(3) << 16)
  126. | (self.f_value[2] << 8)
  127. | self.segment.get(3)
  128. ),
  129. (
  130. (self.sym.get(self.s_value[3]) << 24)
  131. | (self.segment.get(4) << 16)
  132. | (self.f_value[3] << 8)
  133. | self.segment.get(4)
  134. ),
  135. ]
  136. else:
  137. curent_message = [
  138. 0b10011001000010001100000000001000,
  139. 0b10010010000001001111100100000100,
  140. 0b10000010000000101010010000000010,
  141. 0b11111000000000011011000000000001,
  142. ]
  143. self._f_cur_value = self.f_value
  144. self._s_cur_value = self.s_value
  145. self.set_messages(curent_message=curent_message)
  146.  
  147. def set_messages(self, curent_message: list[int]):
  148. for data in curent_message:
  149. self.s_shiftOut(data=data)
  150. self.latch()
  151.  
  152. def clean_up(self) -> None:
  153. self.gpio.cleanup()
  154.  
  155.  
  156. if __name__ == "__main__":
  157. from RPi import GPIO
  158. from time import sleep
  159. from threading import Thread
  160. from queue import Queue
  161. import logging
  162.  
  163. GPIO.setmode(GPIO.BCM)
  164. logging.basicConfig(level=logging.INFO)
  165.  
  166. class DispData:
  167. f_value = "----"
  168. s_value = "----"
  169.  
  170. disp_data = DispData()
  171.  
  172. disp = TM74HC595(gpio=GPIO)
  173. app_queue = Queue()
  174.  
  175. def show_disp():
  176. global disp
  177. global disp_data
  178. while disp.show:
  179. disp.f_value = disp_data.f_value
  180. logging.info(f"thread disp_data.f_value :{disp_data.f_value}")
  181. disp.s_value = disp_data.s_value
  182. logging.info(f"thread disp_data.s_value :{disp_data.s_value}")
  183. disp.build_message()
  184. disp.clean_up()
  185.  
  186. thread = Thread(
  187. target=show_disp,
  188. daemon=True
  189. )
  190. thread.start()
  191.  
  192.  
  193. try:
  194. while True:
  195. for i in ("1234", "4567", "8912"):
  196. disp_data.f_value = i
  197. logging.info(f" base thread: {disp_data.f_value}")
  198. print(i)
  199. sleep(1)
  200. except KeyboardInterrupt:
  201. thread.join()
  202.  
  203.  
  204.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement