# 导入库:从machine模块导入Pin(控制GPIO引脚),从time模块导入sleep_us(微秒级延时)
# sleep_us用于高频刷新数码管,确保显示无闪烁(利用人眼暂留效应)
from machine import Pin
from time import sleep_us
# 创建管脚列表:
# pins:控制七段数码管"段"的引脚(共7个,对应a~g段,决定显示的数字形状)
pins = [2,4,5,12,13,15,18]
# con_pins:控制数码管"位"的引脚(共2个,用于选择哪一位数码管工作,实现动态扫描)
con_pins = [19,21] # 假设19对应第一位(十位),21对应第二位(个位)
# 创建数字对应管脚的高低电平的嵌套列表(段码表):
# 每个子列表对应数字0-9的段状态(索引0-9分别对应数字0-9)
# 元素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亮)
[0,1,0,0,0,0,0], # 索引6:数字"6"(a、f、g、c、d、e亮)
[0,0,0,1,1,1,1], # 索引7:数字"7"(a、b、c亮)
[0,0,0,0,0,0,0], # 索引8:数字"8"(全亮)
[0,0,0,0,1,0,0] # 索引9:数字"9"(a、b、c、d、g亮)
]
# 设置所有管脚输入输出模式:
# 初始化"段引脚"为输出模式(控制各段亮灭)
for gj in pins:
Pin(gj, Pin.OUT) # 将每个段引脚配置为输出
# 初始化"位选引脚"为输出模式(控制哪一位数码管工作)
for gj in con_pins:
Pin(gj, Pin.OUT) # 将每个位选引脚配置为输出
# 定义函数:关闭所有段(消影处理)
# 作用:切换位选时,先熄灭所有段,防止上一位的段状态干扰下一位(避免串影)
def close_seg():
for gj in pins:
Pin(gj).value(1) # 所有段引脚置1(熄灭所有段,基于共阳极逻辑)
# 定义函数:显示指定段码
# 参数lis:digit_list中的一个子列表(对应某个数字的段状态)
# 功能:根据传入的段码列表,设置7个段引脚的高低电平,显示对应数字
def seg_dis(lis):
for i in range(7): # i从0到6,遍历7个段引脚
Pin(pins[i]).value(lis[i]) # 第i个段引脚输出lis[i]的电平(0亮1灭)
# 主循环:无限循环实现00-99的动态显示
while 1:
# 外层循环a:控制十位数字(0-9)
for a in range(10):
# 中层循环b:控制个位数字(0-9)
for b in range(10):
# 内层循环i:高频刷新两位数码管(每次刷新显示a和b,持续一定时间)
# 250次循环确保a和b的组合显示足够久(人眼可识别)
for i in range(250):
# 第一步:显示十位(a)
Pin(19).value(1) # 位选引脚19置1(选通第一位数码管,十位)
Pin(21).value(0) # 位选引脚21置0(关闭第二位数码管,个位)
seg_dis(digit_list[a]) # 调用seg_dis显示数字a(十位)
sleep_us(1) # 维持显示1微秒(高频刷新关键,避免闪烁)
close_seg() # 关闭所有段(消影,防止串到下一位)
# 第二步:显示个位(b)
Pin(19).value(0) # 关闭第一位数码管(十位)
Pin(21).value(1) # 位选引脚21置1(选通第二位数码管,个位)
seg_dis(digit_list[b]) # 调用seg_dis显示数字b(个位)
sleep_us(1) # 维持显示1微秒
close_seg() # 关闭所有段(消影)