我想在串口调试助手输入24位二进制代码给esp32,通过三个级联的74HC595控制并行输出的24个led,为什么结果不对呢求指教,下面是代码
import machine
import uasyncio as asyncio
# 设置串口引脚
UART_TX_PIN = 17
UART_RX_PIN = 16
# 初始化串口
uart = machine.UART(1, baudrate=115200, tx=UART_TX_PIN, rx=UART_RX_PIN)
# 设置74HC595引脚
# 74HC595引脚定义
DATA_PIN = 18
CLOCK_PIN = 19
LATCH_PIN = 21
# 初始化74HC595引脚
data_pin = machine.Pin(DATA_PIN, machine.Pin.OUT)
clock_pin = machine.Pin(CLOCK_PIN, machine.Pin.OUT)
latch_pin = machine.Pin(LATCH_PIN, machine.Pin.OUT)
async def control_led(data):
# 将数据传送给74HC595芯片并控制LED
for segment_data in data:
for byte in segment_data:
for i in range(8):
# 依次发送每一位数据到74HC595
if byte & (1 << i):
data_pin.on()
else:
data_pin.off()
# 上升沿触发时钟
clock_pin.on()
await asyncio.sleep_ms(1)
clock_pin.off()
# 上升沿触发锁存
latch_pin.on()
await asyncio.sleep_ms(1)
latch_pin.off()
# 等待一段时间,控制LED保持稳定状态
await asyncio.sleep_ms(10) # 降低等待时间,以便快速刷新LED状态
while True:
pass # 无限循环,保持输出端口状态不变
# 异步函数,用于接收PC端发送的二进制数据并控制LED
async def receive_and_control_led():
while True:
if uart.any(): # 检查是否有数据到达
data = uart.read(3) # 读取24位二进制数据
segments = [data[:8], data[8:16], data[16:]] # 分割数据为三个8位段
await control_led(segments) # 控制LED
await asyncio.sleep_ms(10) # 延迟以确保正确时序
# 创建事件循环
loop = asyncio.get_event_loop()
# 启动异步任务
loop.create_task(receive_and_control_led())
# 保持微控制器处于空闲状态
try:
loop.run_forever()
except KeyboardInterrupt:
loop.close()
```