Micropython八位共阴数码管驱动模块分享

首先声明一下这篇作者是西安交通大学电气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()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值