【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 位的输入函数:

  1. def ByteIn():

  2. x=0

  3. n=0

  4. for i in [0x01,0x02,0x04,0x8,0x10,0x20,0x40,0x80]:

  5. if keys[n].value()==0:

  6. x |= i               # key on

  7. n+=1

  8. return x

复制代码

这次的 LAB 将 X1 .. X8 设定为输入功能并在管脚上接上 8 个开关,主回圈中将开关的状态显示在相对应的 LED 上,开关 ON 时 LED 亮,开关 OFF 时 LED 灭。

main.py

  1. # main.py       LAB03

  2. from pyb import Pin

  3. ########################################################

  4. def ByteOut(x):

  5. n=0

  6. for i in [0x01,0x02,0x04,0x8,0x10,0x20,0x40,0x80]:

  7. if x&i:

  8. leds[n].value(0)     # LED on

  9. else:

  10. leds[n].value(1)     # LED off

  11. n+=1

  12. ########################################################

  13. def ByteIn():

  14. x=0

  15. n=0

  16. for i in [0x01,0x02,0x04,0x8,0x10,0x20,0x40,0x80]:

  17. if keys[n].value()==0:

  18. x |= i               # key on

  19. n+=1

  20. return x

  21. ########################################################

  22. leds = [Pin(i, Pin.OUT_OD) for i in ['Y1','Y2','Y3','Y4','Y5','Y6','Y7','Y8']]

  23. keys = [Pin(i, Pin.IN, Pin.PULL_UP) for i in ['X1','X2','X3','X4','X5','X6','X7','X8']]

  24. for i in range (8):             # all LED off

  25. leds[i].value(1)

  26. while True:

  27. ByteOut(ByteIn())

复制代码

运行结果:

(0)

相关推荐