【MicroPython】LAB01 - 流水灯
Pyboard 板上搭载了 4 颗 LED,可以直接使用 pyb.LED(i).on() 或是 pyb.LED(i).off() 命令控制 LED 的亮灭状态,那假如 LED 是接到其他的 GPIO 管脚的话那该如何控制呢?我的第一个实验就是将板子的 Y1 到 Y8 管脚外接 8 颗 LED 做流水灯的控制。
板上的 LED 是使用高电位点亮的架构,也就是当 MCU 管脚输出高电位时点亮 LED。
而我实验所使用的外接 LED 板是低电位控制的架构,也就是当 MCU 管脚输出低电位时才点亮 LED。查询了 MCU 的 Datasheet,如下图所示不管是高电位驱动或是低电位驱动管脚都有 25mA 的驱动能力,因此直接连接 LED 是没有问题的。
[代码请见阅读原文]
功能是将 Y1 到 Y8 管脚设定为 open-drain 的输出模式,依 Pyboard 的处理方式当设定为输出模式后该管脚是输出低电位的状态,因此在程序开始运行之后所有的 LED 一开始都是点亮的状态,这表示 GPIO 做为输出模式时使用高电位动作的方式会比较合适些。
【MicroPython】LAB03 - GPIO 输入
上个 LAB 定义的 ByteOut(x) 函数实现了一次 8 位的输出功能,我们依类似的作法再定义一个 ByteIn(x) 一次读取 8 位的输入函数:
def ByteIn():
x=0
n=0
for i in [0x01,0x02,0x04,0x8,0x10,0x20,0x40,0x80]:
if keys[n].value()==0:
x |= i # key on
n+=1
return x
复制代码
这次的 LAB 将 X1 .. X8 设定为输入功能并在管脚上接上 8 个开关,主回圈中将开关的状态显示在相对应的 LED 上,开关 ON 时 LED 亮,开关 OFF 时 LED 灭。
main.py
# main.py LAB03
from pyb import Pin
########################################################
def ByteOut(x):
n=0
for i in [0x01,0x02,0x04,0x8,0x10,0x20,0x40,0x80]:
if x&i:
leds[n].value(0) # LED on
else:
leds[n].value(1) # LED off
n+=1
########################################################
def ByteIn():
x=0
n=0
for i in [0x01,0x02,0x04,0x8,0x10,0x20,0x40,0x80]:
if keys[n].value()==0:
x |= i # key on
n+=1
return x
########################################################
leds = [Pin(i, Pin.OUT_OD) for i in ['Y1','Y2','Y3','Y4','Y5','Y6','Y7','Y8']]
keys = [Pin(i, Pin.IN, Pin.PULL_UP) for i in ['X1','X2','X3','X4','X5','X6','X7','X8']]
for i in range (8): # all LED off
leds[i].value(1)
while True:
ByteOut(ByteIn())
复制代码
运行结果: