# 从machine模块导入Pin类,用于控制GPIO引脚(设置输入输出、高低电平)
from machine import Pin
# 从time模块导入sleep函数,用于控制显示刷新间隔
from time import sleep
# 定义控制七段数码管"段"的GPIO引脚列表(共7个引脚,对应a~g段)
# 顺序对应数码管的a、b、c、d、e、f、g七个段,控制各段的亮灭
pins = [2,4,5,12,13,15,18]
# 定义控制数码管"位"的GPIO引脚列表(共2个引脚,用于选择哪一位数码管工作)
# 多位数码管通过"位选引脚"切换显示,实现动态扫描(利用人眼暂留效应看起来同时显示)
ctrl_pins = [19,21] # 假设分别对应第一位、第二位数码管的位选控制
# 定义数字显示的段状态列表(每个子列表对应一个数字的段码)
# 子列表元素为0或1,对应pins列表中7个段引脚的输出电平(假设0为亮,1为灭,共阳极数码管逻辑)
digit_list = [
[0,0,0,0,0,0,1], # 索引0:数字"0"的段码(a~f亮,g灭)
[1,0,0,1,1,1,1], # 索引1:数字"1"的段码(b、c亮,其余灭)
[0,0,1,0,0,1,0], # 索引2:数字"2"的段码(a、b、g、e、d亮)
[0,0,0,0,1,1,0], # 索引3:数字"3"的段码(a、b、g、c、d亮)
[1,0,0,1,1,0,0], # 索引4:数字"4"的段码(f、g、b、c亮)
[0,1,0,0,1,0,0] # 索引5:数字"5"的段码(a、f、g、c、d亮)
]
# 初始化所有"段引脚"为输出模式(需先配置为输出才能控制高低电平)
for pin in pins:
Pin(pin, Pin.OUT)
# 初始化所有"位选引脚"为输出模式(控制哪一位数码管工作)
for pin in ctrl_pins:
Pin(pin, Pin.OUT)
# 无限循环:持续刷新数码管显示(动态扫描核心逻辑)
while 1:
# 第一步:选中第一位数码管(通过位选引脚控制)
Pin(ctrl_pins[0]).value(1) # 第一位数码管的位选引脚置1(假设高电平选通该位)
Pin(ctrl_pins[1]).value(0) # 第二位数码管的位选引脚置0(关闭第二位)
# 给第一位数码管输出数字"1"的段码(digit_list[1]对应数字1)
for i in range(7):
Pin(pins[i]).value(digit_list[1][i]) # 第i个段引脚输出数字1的第i段状态
sleep(0.1) # 维持第一位显示0.1秒(人眼暂留效应可感知为持续显示)
# 第二步:选中第二位数码管(切换位选引脚)
Pin(ctrl_pins[0]).value(0) # 关闭第一位数码管
Pin(ctrl_pins[1]).value(1) # 第二位数码管的位选引脚置1(选通第二位)
# 给第二位数码管输出数字"3"的段码(digit_list[3]对应数字3)
for i in range(7):
Pin(pins[i]).value(digit_list[3][i]) # 第i个段引脚输出数字3的第i段状态
sleep(0.1) # 维持第二位显示0.1秒
# 消影处理:切换位选前关闭所有段引脚,防止相邻位串扰(残留显示)
for pin in pins:
Pin(pin).value(1) # 所有段引脚置1(熄灭所有段)