首先声明一下这篇作者是西安交通大学电气16级某陈姓同学 ,防止老师在网上查到一样的代码以为我是扒的。。。
最近学校里有电子设计任务,在学习Micropython的过程中写了一个八位共阴七段数码管驱动模块,花了一点时间用类封装,希望可以帮到其他初学者们,参考共享。
数码管的原理网上有很多,数电书上也有。
'''
十/ 十六进制/ 自定义 八位共阴七段数码管驱动模块
Y10~Y12 ___对应三八译码器A~C
X1~X8 ___对应数码管段选H~A
numberpros()处可以通过注释选择输出十进制或十六进制
如果需要自定义输出,需要注释display()定义中的第一句“self.numberpros(self.number)”,
并将内容以8位数列的形式保存到self.smg_display。
例如:self.smg_display=['0.','A','1','2','C','non','.','1']
'''
import pyb
from pyb import Pin
def get_bit( num ):
res=[]
for temp in range( 8 ):
res.append(num>>(7-temp)&1)
return res
#数码管段选编码
num2d={
#0~9
'0' : get_bit(0x3F) ,
'1' : get_bit(0x06) ,
'2' : get_bit(0x5B) ,
'3' : get_bit(0x4F) ,
'4' : get_bit(0x66) ,
'5' : get_bit(0x6D) ,
'6' : get_bit(0x7D) ,
'7' : get_bit(0x07) ,
'8' : get_bit(0x7F) ,
'9' : get_bit(0x6F) ,
#0.~9.
'0.' : get_bit(0x3F+0x80) ,
'1.' : get_bit(0x06+0x80) ,
'2.' : get_bit(0x5B+0x80) ,
'3.' : get_bit(0x4F+0x80) ,
'4.' : get_bit(0x66+0x80) ,
'5.' : get_bit(0x6D+0x80) ,
'6.' : get_bit(0x7D+0x80) ,
'7.' : get_bit(0x07+0x80) ,
'8.' : get_bit(0x7F+0x80) ,
'9.' : get_bit(0x6F+0x80) ,
#10~15
'10' : get_bit(0x77) ,
'11' : get_bit(0x7C) ,
'12' : get_bit(0x39) ,
'13' : get_bit(0x5E) ,
'14' : get_bit(0x79) ,
'15' : get_bit(0x71) ,
#A~F
'A' : get_bit(0x77) ,
'B' : get_bit(0x7C) ,
'C' : get_bit(0x39) ,
'D' : get_bit(0x5E) ,
'E' : get_bit(0x79) ,
'F' : get_bit(0x71) ,
#A.~F.
'A.' : get_bit(0x77+0x80) ,
'B.' : get_bit(0x7C+0x80) ,
'C.' : get_bit(0x39+0x80) ,
'D.' : get_bit(0x5E+0x80) ,
'E.' : get_bit(0x79+0x80) ,
'F.' : get_bit(0x71+0x80) ,
'.' : get_bit(0x80) ,
'non' : get_bit(0x00)
}
#三八译码器编码
num2w={
'0' : get_bit(0) ,
'1' : get_bit(1) ,
'2' : get_bit(2) ,
'3' : get_bit(3) ,
'4' : get_bit(4) ,
'5' : get_bit(5) ,
'6' : get_bit(6) ,
'7' : get_bit(7)
}
class CAT_8_Smg(object):
def __init__(self,number=0,w_pins=['Y10','Y11','Y12'],d_pins=['X1','X2','X3','X4','X5','X6','X7','X8']):
self.number=number
self.wx_pins= [Pin(temp,Pin.OUT_PP) for temp in w_pins]
self.dx_pins= [Pin(temp,Pin.OUT_PP) for temp in d_pins]
self.smg_display=[]
def numberpros(self,number):
self.smg_display=[]
#十进制
self.smg_display.append(number//10000000%10)#最高位
self.smg_display.append(number//1000000%10)
self.smg_display.append(number//100000%10)
self.smg_display.append(number//10000%10)
self.smg_display.append(number//1000%10)
self.smg_display.append(number//100%10)
self.smg_display.append(number//10%10)
self.smg_display.append(number//1%10) #最低位
'''
#十六进制
import math
self.smg_display.append(int(number//math.pow(16,7)%16)) #最高位
self.smg_display.append(int(number//math.pow(16,6)%16))
self.smg_display.append(int(number//math.pow(16,5)%16))
self.smg_display.append(int(number//math.pow(16,4)%16))
self.smg_display.append(int(number//math.pow(16,3)%16))
self.smg_display.append(int(number//math.pow(16,2)%16))
self.smg_display.append(int(number//math.pow(16,1)%16))
self.smg_display.append(int(number//math.pow(16,0)%16)) #最低位
'''
def display(self):
self.numberpros(self.number) ##如果需要任意输出需要注释这句
for num in range(8): #位选 第num个数码管亮
temp=0
for pin in self.wx_pins: #3个pin引脚赋值 pin1 Y10 A
pin.value(num2w[str(num)][7-temp])
temp+=1
temp=0
for pin in self.dx_pins: #段选
pin.value(num2d[str(self.smg_display[num])][temp])
temp+=1
pyb.delay(2)
temp=0
for pin in self.dx_pins: #段选
pin.value(num2d['non'][temp])
temp+=1
#测试
if __name__ == "__main__":
smg=CAT_8_Smg(number=87654321)
while 1:
smg.display()