0

我有一个 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 个显示屏。

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 的指南,我尝试过对其进行转换,但我总是遇到类似的问题,显示错误的数字。

4

2 回答 2

0

需要将 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")
于 2021-07-26T08:10:02.457 回答
0

根据我为您的电路板找到的示意图,看起来要驱动 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")
于 2021-07-25T20:51:12.127 回答