所以我正在玩我的Raspberry Pi和7段(实际上是8因为有点)显示,我需要帮助。我知道如何使用单个LED操作它(例如,我知道哪些LED需要点亮才能创建“1”所以我基本上可以操作它)但是手册中的代码使用的是一些按位逻辑远远超出我的理解。
#!/usr/bin/env python
import RPi.GPIO as GPIO
import time
pins = [11,12,13,15,16,18,22,7]
dats = [0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x80]
def setup():
GPIO.setmode(GPIO.BOARD)
for pin in pins:
GPIO.setup(pin, GPIO.OUT) # Set pin mode as output
GPIO.output(pin, GPIO.LOW)
def writeOneByte(val):
GPIO.output(11, val & (0x01 << 0))
GPIO.output(12, val & (0x01 << 1))
GPIO.output(13, val & (0x01 << 2))
GPIO.output(15, val & (0x01 << 3))
GPIO.output(16, val & (0x01 << 4))
GPIO.output(18, val & (0x01 << 5))
GPIO.output(22, val & (0x01 << 6))
GPIO.output(7, val & (0x01 << 7))
def loop():
while True:
for dat in dats:
writeOneByte(dat)
time.sleep(0.5)
def destroy():
for pin in pins:
GPIO.output(pin, GPIO.LOW)
GPIO.cleanup() # Release resource
if __name__ == '__main__': # Program start from here
setup()
try:
loop()
except KeyboardInterrupt: # When 'Ctrl+C' is pressed, the child program destroy() will be executed.
destroy()
上面的代码循环显示0-9和A-F,然后是点。
欢迎提供每一个帮助/解释/建议。
编辑:我现在就知道了。刚开始我的大脑。关闭。答案 0 :(得分:1)
我将参考我在thread on reddit上找到的图片:
所以引脚对应的段如下:
A :11
B :12
C :13
D :15
E :16
F :18
G :22
现在让我们看看当我们使用名为writeOneByte
的列表中的第一个值(即 0x3f )调用dats
时会发生什么。
该函数的第一行是
GPIO.output(11, val & (0x01 << 0))
val
保存值 0x3f ,这是传递给函数的内容。该值相当于二进制的 0b00111111 。再看图表,我们看到字母 A - G 实际上对应于每个位,从最低有效位(最右位)到第二位最高位。最重要的位保留给点。
<<
是左移算子。代码0x01 << 0
表示将数字 0x01 零位向左移。因此,操作保持数字不变,结果仍为 0x01 ,相当于 0b00000001 。
接下来是&
,按位AND
运算符。这会逐位执行逻辑AND
操作。在一个例子中很容易看到:
0b00111111
0b00000001
----------
0b00000001
基本上我们正在做的是检查val
中数字的第一个(最低有效)位并检查相应的引脚是否应该有HIGH
或LOW
输出。在这种情况下,第一位的值为1.在AND
操作之后,针对引脚11传递给GPIO.output
的值(对应于 A 段),的 0b00000001 即可。这会输出HIGH
值,因为任何不是全零的值都会转换为布尔值true。
对剩余的代码行重复该过程:
GPIO.output(12, val & (0x01 << 1))
此时 0b00000001 向左移1位,产生 0b00000010 。我们再次执行按位AND
:
0b00111111
0b00000010
----------
0b00000010
也是引脚12的HIGH
输出,因此段B打开。
事实上,我们获得LOW
的唯一时间是第7行,在最后一行:
GPIO.output(7, val & (0x01 << 7))
0b00111111
0b01000000
----------
0b00000000
正如您在图中所看到的,驱动引脚的位采用适当的值,以在给定的显示排列中产生数字0
。