Advertisement
daiman

TM74HC595 py

Dec 12th, 2024
28
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.02 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. - 0b10111111 0xBF
  20. " " пустой сегмент 0b11111111 0xFF
  21.  
  22. Буквы
  23.  
  24. E A, D, E, F, G 0b10000110 0x86
  25. H B, C, E, F, G 0b10001001 0x89
  26. L D, E, F 0b11000111 0xC7
  27.  
  28. разряды сегментов
  29.  
  30. сегмент 1 0b00001000 0x08
  31. сегмент 2 0b00000100 0x04
  32. сегмент 3 0b00000010 0x02
  33. сегмент 4 0b00000001 0x01
  34.  
  35. пример сообщения
  36. second_message = [
  37. 0b11000111000010001000100100001000,
  38. 0b11000111000001001000011000000100,
  39. 0b10000110000000101100011100000010,
  40. 0b10001001000000011100011100000001,
  41. ]
  42.  
  43. """
  44. import RPi.GPIO as GPIO
  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.new_value = "--------"
  67. self.cur_value = "--------"
  68.  
  69. # symbols values
  70. self.sym = {
  71. "0": 0xC0,
  72. "1": 0xF9,
  73. "2": 0xA4,
  74. "3": 0xB0,
  75. "4": 0x99,
  76. "5": 0x92,
  77. "6": 0x82,
  78. "7": 0xF8,
  79. "8": 0x80,
  80. "9": 0x90,
  81. "-": 0xBF,
  82. " ": 0xFF
  83. }
  84. self.segment = {
  85. 1: 0x08,
  86. 2: 0x04,
  87. 3: 0x02,
  88. 4: 0x01,
  89. }
  90.  
  91. def latch(self) -> None:
  92. self.gpio.output(self.latchPin, self.gpio.HIGH)
  93. self.gpio.output(self.latchPin, self.gpio.LOW)
  94.  
  95. def s_shiftOut(
  96. self,
  97. data: int
  98. ) -> None:
  99. for i in range(32):
  100. self.gpio.output(self.clockPin, self.gpio.LOW)
  101. self.gpio.output(self.dataPin, (data & (1 << (31 - i))) != 0)
  102. self.gpio.output(self.clockPin, self.gpio.HIGH)
  103.  
  104. def build_message(
  105. self,
  106. ) -> list[int]:
  107. return [
  108. (
  109. (self.sym.get(self.cur_value[4]) << 24)
  110. | (self.segment.get(1) << 16)
  111. | (self.sym.get(self.cur_value[0]) << 8)
  112. | self.segment.get(1)
  113. ),
  114. (
  115. (self.sym.get(self.cur_value[5]) << 24)
  116. | (self.segment.get(2) << 16)
  117. | (self.sym.get(self.cur_value[1]) << 8)
  118. | self.segment.get(2)
  119. ),
  120. (
  121. (self.sym.get(self.cur_value[6]) << 24)
  122. | (self.segment.get(3) << 16)
  123. | (self.sym.get(self.cur_value[2]) << 8)
  124. | self.segment.get(3)
  125. ),
  126. (
  127. (self.sym.get(self.cur_value[7]) << 24)
  128. | (self.segment.get(4) << 16)
  129. | (self.sym.get(self.cur_value[3]) << 8)
  130. | self.segment.get(4)
  131. ),
  132. ]
  133.  
  134. def set_value(self):
  135. curent_message = self.build_message()
  136. for data in curent_message:
  137. self.s_shiftOut(data=data)
  138. self.latch()
  139.  
  140. def chech_len_value(self):
  141. while len(self.new_value) <8:
  142. self.new_value = " " + self.new_value
  143.  
  144. def check_symblos(self):
  145. for symbol in self.new_value:
  146. if symbol not in self.sym.keys():
  147. index = self.new_value.index(symbol)
  148. start_str = self.new_value[:index]
  149. end_str = self.new_value[index + 1:]
  150. self.new_value = start_str + "-" + end_str
  151.  
  152. def compare_value(self):
  153. if self.cur_value != self.new_value:
  154. self.chech_len_value()
  155. self.check_symblos()
  156. self.cur_value = self.new_value
  157. self.set_value()
  158.  
  159.  
  160. # testing
  161. if __name__ == "__main__":
  162. from RPi import GPIO
  163. from time import sleep
  164. from threading import Thread
  165. import logging
  166.  
  167. GPIO.setmode(GPIO.BCM)
  168. logging.basicConfig(level=logging.INFO)
  169.  
  170. class DispData:
  171. value = "--------"
  172.  
  173.  
  174. disp_data = DispData()
  175. disp = TM74HC595(gpio=GPIO)
  176.  
  177. def show_disp(disp: TM74HC595, disp_data: DispData):
  178. try:
  179. while True:
  180. disp.new_value = disp_data.value
  181. disp.compare_value()
  182. except KeyboardInterrupt:
  183. pass
  184.  
  185. thread = Thread(
  186. target=show_disp,
  187. args=(disp, disp_data, ),
  188. daemon=False
  189. )
  190. thread.start()
  191.  
  192.  
  193. try:
  194. while True:
  195. logging.info("new cycle")
  196. for i in (
  197. "---[---0",
  198. "------01",
  199. "-----012",
  200. "----0123",
  201. "---01x34",
  202. "--012345",
  203. "-0123456",
  204. "234567z",
  205. ):
  206. disp_data.value = i
  207. logging.info(f" base thread: {disp_data.value}")
  208. sleep(1)
  209. except KeyboardInterrupt:
  210. thread.join()
  211.  
  212.  
  213.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement