使用 Raspberry Pi Python 使用 74HC595 控制 8 位 7 段显示器
Posted
技术标签:
【中文标题】使用 Raspberry Pi Python 使用 74HC595 控制 8 位 7 段显示器【英文标题】:Controlling 8-digit 7-segment displays using 74HC595 using Raspberry Pi Python 【发布时间】:2021-07-25 17:32:11 【问题描述】:我有一个 8 位 LED 显示板,但我得到了奇怪的结果。第 21 行定义了哪些段被点亮以及哪些显示器被使用。所以 [1,0,0,0,1,0,0,0] 关闭第 1 和第 5 段并点亮第 4 和第 8 显示(显示的顺序为 4、3、2、1、8、7, 6、5)。所以第 24 行列表中的第一个 1 会关闭小数点并点亮第四个显示屏。第 5 个 1 关闭底部段并点亮第 8 个显示屏。
我想要的是能够指定使用哪个显示器以及该显示器的哪些部分点亮/不点亮。
这是 Python 3 代码:
import RPi.GPIO as IO
import time
# Ignore warnings
IO.setwarnings(False)
# Set pinouts
dataPin = 11
latchPin = 15
clockPin = 13
IO.setmode (IO.BOARD)
IO.setup(dataPin, IO.OUT)
IO.setup(clockPin, IO.OUT)
IO.setup(latchPin, IO.OUT)
# 7-segment displays are in the following
# order: 4 3 2 1 8 7 6 5
# Segments to light (0 = on / 1 = off)
segsLit = [1,0,0,0,1,0,0,0] # Line 21
# Iterate through 7-seg displays
for j in range(8):
IO.output(latchPin, 0)
# Iterate through list1 to light segments
for i in range(8):
IO.output(clockPin, 0)
IO.output(dataPin, segsLit[i])
IO.output(clockPin, 1)
IO.output(latchPin, 1)
IO.cleanup()
print("Done")
我找到了一些指南,但它们仅用于驱动单个显示器或仅驱动 8 个 LED。有很多关于 Arduino 的指南,我尝试过转换,但我总是遇到类似的问题,显示错误的数字。
【问题讨论】:
阅读您的问题后,我不清楚问题是什么。不正确的段是否亮起? 错误的 7 段显示器亮起,而那些亮起的都显示相同。查看我添加的照片,您可以看到显示器 1 和 5 都显示“A”。我希望能够在每个显示器上显示不同的信息,指定将在每个显示器上显示的内容。例如。 '1234ABCD' 横跨八台显示器 大概你所有的串行芯片都是菊花链的,所以没有必要在每个周期关闭和打开latchPin。另外,您有 8 位数字乘以 7 段,因此您的表中应该有 56 个段值。如果每个显示器有一个芯片,那么每个数字可能也有第 8 位。我可能会在下面添加一个猜测答案。 我之前的评论有误。我查了一下板子,好像是复用的,也就是要不断的刷新。一个芯片处理段和小数点,另一个似乎是数字位置启用。所以每次更新你需要做 16 个班次。 @RufusVS 你为我指明了正确的方向——谢谢。我应该发送 16 位数据。前 8 位用于点亮哪些段,第二位用于显示要使用的位置。我会发布一个解决方案。 【参考方案1】:根据我为您的电路板找到的示意图,看起来要驱动 8 个 LED,您需要一个类似的程序。主要思想是 LED 必须不断刷新才能显示多个数字。每个换档周期只会启用一个段模式(尽管您可以让它出现在多个数字上,这肯定是一个不寻常的应用程序。)
我没有费心去尝试让数字位置和段位置都正确,这取决于你。也可能需要反转数字选择极性。但是对您的代码的这种编辑应该会让您更接近:
import RPi.GPIO as IO
REFRESH_NS = 1_000_000_000 / 30 / 8 # refresh 30 times per second, 8 digits
# Ignore warnings
IO.setwarnings(False)
# Set pinouts
dataPin = 11
latchPin = 15
clockPin = 13
IO.setmode (IO.BOARD)
IO.setup(dataPin, IO.OUT)
IO.setup(clockPin, IO.OUT)
IO.setup(latchPin, IO.OUT)
# 7-segment displays are in the following
# order: 4 3 2 1 8 7 6 5
# Segments to light (0 = on / 1 = off)
segsLit =
[
[1,0,0,0,0,0,0,0],
[0,1,0,0,0,0,0,0],
[0,0,1,0,0,0,0,0],
[0,0,0,1,0,0,0,0],
[0,0,0,0,1,0,0,0],
[0,0,0,0,0,1,0,0],
[0,0,0,0,0,0,1,0],
[0,0,0,0,0,0,0,1],
]
update_time = time.monotonic_ns()
# Iterate through 7-seg displays (8 bits with decimal point)
while True:
IO.output(latchPin, 0) # start shift operation
for digit in range(8):
# digit select shifts out first
for pos in range(8):
IO.output(clockPin, 0)
IO.output(dataPin, 1 if pos==digit else 0)
IO.output(clockPin, 1)
# Iterate through to light segments
for seg in range(8):
IO.output(clockPin, 0)
IO.output(dataPin, segsLit[digit][seg])
IO.output(clockPin, 1)
IO.output(latchPin, 1) # end shift operation
while time.monotonic_ns() < update_time + REFRESH_NS: # delay to energize led
pass # spin loop
update_time = time.monotonic_ns() # prepare for next update
IO.cleanup()
print("Done")
【讨论】:
【参考方案2】:需要向开发板发送 16 位数据。前 8 位用于点亮特定的段,随后的 8 位用于指示要使用的显示器。
在下面更新的代码中,第 8 个(最右侧)显示屏将显示字母“A”。
import RPi.GPIO as IO
import time
# Ignore warnings
IO.setwarnings(False)
# Set pinouts
dataPin = 11
latchPin = 15
clockPin = 13
IO.setmode (IO.BOARD)
IO.setup(dataPin, IO.OUT)
IO.setup(clockPin, IO.OUT)
IO.setup(latchPin, IO.OUT)
# 7-segment displays are in the following
# order: 4 3 2 1 8 7 6 5
# First 8 bits = segments to light // Second 8 bits = position
segsLit = [1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0] # Line 21
# Iterate through 7-seg displays
IO.output(latchPin, 0)
# Iterate through list1 to light segments
for i in range(16):
IO.output(clockPin, 0)
IO.output(dataPin, segsLit[i])
IO.output(clockPin, 1)
IO.output(latchPin, 1)
IO.cleanup()
print("Done")
【讨论】:
以上是关于使用 Raspberry Pi Python 使用 74HC595 控制 8 位 7 段显示器的主要内容,如果未能解决你的问题,请参考以下文章
使用python3在Raspberry Pi上打开和关闭Tkinter GUI
慢响应Firebase + Python + Raspberry pi
在 Raspberry PI 上使用 Python 和 OpenCV 进行图像处理 [关闭]