用于操作LED的Python位逻辑
所以我现在正在玩我的树莓圆周率和7段(实际上是8,因为有点)显示,我需要帮助。我知道如何使用单个LED来操作它(例如,我知道需要点亮哪些LED来创建“1”,这样我就可以基本上操作它),但手册中的代码使用了一些位逻辑,这远远超出了我的理解用于操作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
#!/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