我是电子产品的新手,并且一直很喜欢esp8266和Micropython。我正在尝试使几个链接移位寄存器(sn74hc595)能够控制16个led,并且正努力了解我得到的结果。
我的脚本如下:
from machine import Pin
import time
def sixteen_bit(sleep_time=100):
while True:
for value in [1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535]:
bits = [value >> i & 1 for i in range(15, -1, -1)]
for i in range(15, -1, -1):
data.value(bits[i])
clock.value(1)
clock.value(0)
latch.value(1)
latch.value(0)
time.sleep_ms(sleep_time)
在我的视频中很难说出来,但是每个指示灯在重复之前都会单独点亮。
Google Drive Video Example
根据我的代码和对移位寄存器的基本了解,我希望当
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
移入时所有指示灯都会亮起。所以我的第一个问题是,为什么我的脚本在以前的LED仍然点亮的情况下不点亮每个LED?让我知道您是否需要我进一步说明!谢谢!
最佳答案
我修改了您的代码以打印value
,然后打印您生成的bits[i]
值的序列,并得到:
1
1000000000000000
3
1100000000000000
7
1110000000000000
15
1111000000000000
31
1111100000000000
63
1111110000000000
127
1111111000000000
255
1111111100000000
511
1111111110000000
1023
1111111111000000
2047
1111111111100000
4095
1111111111110000
8191
1111111111111000
16383
1111111111111100
32767
1111111111111110
65535
1111111111111111
因此,您正在生成正确的位模式,但没有将数据正确地输入移位寄存器。
假设
data
,clock
和latch
实际上驱动了您认为是的输出引脚,那么这是一个electronics问题,而不是MicroPython问题。但是,我将在将每个引脚设为高电平或低电平后添加一个时间延迟。