使用 Raspberry Pi Python 使用 74HC595 控制 8 位 7 段显示器

问题描述

我有一个 8 位 LED 显示板,但得到的结果很奇怪。第 21 行定义了哪些段被点亮以及使用了哪些显示器。所以 [1,1,0] 关闭第 1 和第 5 段并点亮第 4 和第 8 个显示显示顺序为 4、3、2、1、8、7、 6、5)。所以第 24 行列表中的第一个 1 关闭小数点并点亮第四个显示器。 5th 1 关闭底部段并点亮第八个显示屏。

8 digit seven-segment display

我想要的是能够指定要使用的显示器以及该显示器的哪些部分要点亮/熄灭。

这是 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] # 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 有很多指南,我尝试转换它们,但我一直遇到类似的问题,显示错误的数字。

解决方法

根据我为您的电路板找到的原理图,驱动 8 个 LED 似乎需要与此类似的程序。主要思想是 LED 必须不断刷新才能显示多个数字。每个换档周期只会启用一个段模式(尽管您可以让它出现在多个数字上,这肯定是一个不寻常的应用。)

我没有费心去尝试使数字位置和段位置都正确,这取决于您。也可能需要颠倒数字选择极性。但是对您的代码进行的这种编辑应该会让您更接近:

sudo yum install epel-release cmake3
sudo yum remove cmake
sudo ln -s /usr/bin/cmake3 /usr/bin/cmake
pip3.6 install networkit
,

需要向电路板发送 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,1,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")