import time
from machine import Pin, I2C, Timer
#因为micropython的定时器回调时间精度有限,所以主程序中不能存在大延迟的原子操作。
#比如读写文件,大型流数据收发都会导致显示出现闪烁,这种数码管在micropython上驱
#动效果不理想,但是用来调试显示程序的逻辑还是非常方便的
#显示查找表,这个是按照单段显示优化的表格,缺点是效率较低,优点是显示亮度是均匀的
tab=[(4, 3), (5, 3), (0, 3), (1, 3), (2, 3), (3, 4), (5, 4),
(0, 4), (1, 4), (2, 4), (3, 5), (4, 5), (0, 5), (1, 5),
(2, 5), (3, 0), (4, 0), (5, 0), (1, 0), (2, 0), (3, 1),
(3, 2), (0, 1), (2, 1), (4, 1), (5, 1)]
#数字笔段转换表
digi_seg=[0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F]
#符号查找表
Symbol=["dot","v","w","%","om"]
#根据需要按照实际顺序调整
P_list=[Pin(0),Pin(5),Pin(18),Pin(23),Pin(19),Pin(22)]
seg=[]
count=0
d_buff=0
#显示实现完全在定时器回调中完成,每次中断显示一个笔段,总共26个段,
#刷新率25hz视觉上有点闪烁,50hz(定时器频率1300)视觉上比较完美
def t_cb(tim):
global count, P_list, tab, d_buff
P_list[tab[count][0]].init(mode=Pin.IN, pull=None)
P_list[tab[count][1]].init(mode=Pin.IN, pull=None)
count+=1
if count>=26:
count=0
if d_buff&(1<<count):
P_list[tab[count][0]].value(1)
P_list[tab[count][0]].init(mode=Pin.OUT)
P_list[tab[count][1]].value(0)
P_list[tab[count][1]].init(mode=Pin.OUT)
tim1 = Timer(1)
tim1.init(freq=1300, mode=Timer.PERIODIC, callback=t_cb)
#设置一个启动全亮动作
d_buff=0xffffffff
time.sleep(0.6)
d_buff=0
time.sleep(0.2)
#生成显示的排列内容
def gen_seg(digi,string):
global d_buff
d_buff=0
#判断传入的字符串包含哪些符号,并作出显示
for s in range(5):
if Symbol[s] in string:
d_buff += 1<<(21+s)
#个位
i=digi%10
d_buff += digi_seg[i]<<14
#十位
t=digi//10%10
#如果小数点不是点亮的,则前两位为0不显示
if not ((d_buff&(1<<21))==0 and digi//10 == 0):
d_buff += digi_seg[t]<<7
#百位,大于999的高位被截掉
p=digi//100%10
#如果为0不显示
if p != 0:
d_buff += digi_seg[p]
#以下是显示调用的例子,数字不包含小数点发送到第一个变量,需要显示的符号加到字符串里面显示,符号顺序无关
for i in range(110):
gen_seg(i,"vdot")
time.sleep(0.05)
time.sleep(0.6)
d_buff=0
for i in range(110):
gen_seg(i,"w")
time.sleep(0.05)
time.sleep(0.6)
d_buff=0
测试程序
|