用于操作LED的Python位逻辑

用于操作LED的Python位逻辑,python,raspberry-pi,bit-manipulation,Python,Raspberry Pi,Bit Manipulation,所以我现在正在玩我的树莓圆周率和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,0x6

所以我现在正在玩我的树莓圆周率和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()
#/usr/bin/env python
将RPi.GPIO导入为GPIO
导入时间
引脚=[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设置():
GPIO.setmode(GPIO.BOARD)
对于插针中的插针:
GPIO.setup(引脚,GPIO.OUT)#将引脚模式设置为输出
GPIO.output(引脚,GPIO.LOW)
def写入字节(val):
GPIO.output(11,val&(0x01设置
我将参考我在地图上找到的这张图片:

因此,销对应于以下分段:

A:11
B:12
C:13
D:15
E:16
F:18
G:22


现在让我们看看当我们使用列表中名为
dats
的第一个值调用
writeOneByte
时会发生什么,即0x3f

函数中的第一行是

GPIO.output(11, val & (0x01 << 0)) 
基本上,我们所做的是检查第一个(最不重要的)
val
中的数字位,并检查相应的管脚是否应具有
HIGH
LOW
输出。在这种情况下,第一位的值为1。在
操作后,传递给管脚11的
GPIO.output
(对应于段a),是0b0000001。这会输出一个
高的值,因为任何不是全零的值都会转换为布尔真值

在剩余的代码行上重复该过程:

GPIO.output(12, val & (0x01 << 1))
这也是针脚12的
高输出,因此B段接通

事实上,我们唯一一次得到
低值
的是引脚7,在最后一行:

GPIO.output(7,  val & (0x01 << 7))

0b00111111
0b01000000
----------
0b00000000

GPIO.output(7,val&(0x01)无论如何,我都发布了一个答案,以防有人从谷歌无意中发现这个页面。
0b00111111
0b00000010
----------
0b00000010
GPIO.output(7,  val & (0x01 << 7))

0b00111111
0b01000000
----------
0b00000000