目录

一、引言

二、代码

2.1、创建NixieTube类

2.2、举例

2.2.1、显示三位有效数字的整数721

2.2.2、显示三位有效数字的浮点数7.21

2.2.3、修改引脚

一、引言

        萌新esp32之路开启!!!这几天在学习esp32,准备往物联网方向进发,以前也学过51和stm32。

        本文章给出了一种面向对象的四位共阳数码管驱动方式,最后只要实例化对象,并在while循环里调用显示数字的方法即可。最大可以显示四位有效数字,也就是说可以显示整数和浮点数,并且有效数字小于四位时会在高位补0。

       我没有系统学习过python,就会一些最基本的用法,并且有些地方还停留在c语言的面向过程编程,见笑了。 网上也有别人写的驱动代码,应该会比我简洁,但目前没有看到有人把小数也做了。

二、代码

2.1、创建NixieTube类

class NixieTube:
    #数码管位码
    position_code = {'D1':13,
                     'D2':12,
                     'D3':14,
                     'D4':27}
    #数码管段号
    section_indxe = {'a':15,
                     'b':2,
                     'c':4,
                     'd':16,
                     'e':17,
                     'f':5,
                     'g':18,
                     'dp':19}
    #数码管段码
    section_code = {0:[[section_indxe['a'], section_indxe['b'], section_indxe['c'], section_indxe['d'], section_indxe['e'], section_indxe['f']],
                       [section_indxe['g']]],
                    1:[[section_indxe['b'], section_indxe['c']],
                       [section_indxe['a'], section_indxe['d'], section_indxe['e'], section_indxe['f'], section_indxe['g']]],
                    2:[[section_indxe['a'], section_indxe['b'], section_indxe['d'], section_indxe['e'], section_indxe['g']],
                       [section_indxe['c'], section_indxe['f']]],
                    3:[[section_indxe['a'], section_indxe['b'], section_indxe['c'], section_indxe['d'], section_indxe['g']],
                       [section_indxe['e'], section_indxe['f']]],
                    4:[[section_indxe['b'], section_indxe['c'], section_indxe['f'], section_indxe['g']],
                       [section_indxe['a'], section_indxe['d'], section_indxe['e']]],
                    5:[[section_indxe['a'], section_indxe['c'], section_indxe['d'], section_indxe['f'], section_indxe['g']],
                       [section_indxe['b'], section_indxe['e']]],
                    6:[[section_indxe['a'], section_indxe['c'], section_indxe['d'], section_indxe['e'], section_indxe['f'], section_indxe['g']],
                       [section_indxe['b']]],
                    7:[[section_indxe['a'], section_indxe['b'], section_indxe['c']],
                       [section_indxe['d'], section_indxe['e'], section_indxe['f'], section_indxe['g'], ]],
                    8:[[section_indxe['a'], section_indxe['b'], section_indxe['c'], section_indxe['d'], section_indxe['e'], section_indxe['f'], section_indxe['g']],
                       []],
                    9:[[section_indxe['a'], section_indxe['b'], section_indxe['c'], section_indxe['d'], section_indxe['f'], section_indxe['g'], ],
                       [section_indxe['e']]]}

    #初始化数码管
    def __init__(self):
        #D1,D2,D3,D4
        position_indxe_list = [self.position_code['D1'], self.position_code['D2'], self.position_code['D3'], self.position_code['D4']]
        position_list = list()
        #A,B,C,D,E,F,G,DP
        section_indxe_list = [self.section_indxe['a'], self.section_indxe['b'], self.section_indxe['c'], self.section_indxe['d'], 
                              self.section_indxe['e'], self.section_indxe['f'], self.section_indxe['g'], self.section_indxe['dp']]
        section_list = list()
        #初始化位码,并关闭对应位
        for i in position_indxe_list:
            position_list.append(Pin(i, Pin.OUT))
        for p in position_list:
            p.value(1)
        #初始化段码,并关闭对应段
        for i in section_indxe_list:
            section_list.append(Pin(i, Pin.OUT))
        for s in section_list:
            s.value(1)
    
    #在position位置显示number,DP等于1为显示小数点
    def on(self, position='D1', number=0, DP=0):
        #开启对应位
        P = Pin(self.position_code[position])
        P.value(0)
        #开启对应段
        for i in self.section_code[number][0]:
            S = Pin(i)
            S.value(0)
        for i in self.section_code[number][1]:
            S = Pin(i)
            S.value(1)
        #设置小数点
        dp = Pin(self.section_indxe['dp'])
        if DP==1:
            dp.value(0)
        else:
            dp.value(1)

    #关闭数码管显示
    def off(self):
        for i in self.section_indxe.values():
            off = Pin(i)
            off.value(1)
        for i in self.position_code.values():
            off = Pin(i)
            off.value(1)

    #数码管显示四个有效数字
    def display(self, Numer=0):
        num_list = list()
        if type(Numer) == float:
            #计算小数位数
            DecimalPlaces = len(str(Numer)) - str(Numer).find(".") - 1
        else:
            DecimalPlaces = 0
        #化整,为整除与地板除做准备
        Numer = int(Numer * 10 ** DecimalPlaces)
        #拆开各个数字
        for i in range(4):
            num_list.insert(0, Numer % 10)
            Numer //= 10
        #显示数字
        if DecimalPlaces == 3:
            self.on('D1', num_list[0], 1)
        else:
            self.on('D1', num_list[0])
        self.off()
        if DecimalPlaces == 2:
            self.on('D2', num_list[1], 1)
        else:
            self.on('D2', num_list[1])
        self.off()
        if DecimalPlaces == 1:
            self.on('D3', num_list[2], 1)
        else:
            self.on('D3', num_list[2])
        self.off()
        self.on('D4', num_list[3])
        self.off()

        如果你们使用的是共阴集数码管,只要把里面的.value(1)与.value(0)互换即可。要是你们的引脚跟我的对不上,可以调用类的属性进行修改。

2.2、举例

2.2.1、显示三位有效数字的整数721

#实例化对象
MyNixie = NixieTube()

while True:
    MyNixie.display(721)

2.2.2、显示三位有效数字的浮点数7.21

MyNixie = NixieTube()

while True:
    MyNixie.display(7.21)

2.2.3、修改引脚

MyNixie = NixieTube()
#修改引脚,让7.21从右到左显示
MyNixie.position_code = {'D1':27,
                         'D2':14,
                         'D3':12,
                         'D4':13}

while True:
    MyNixie.display(7.21)

         这里从右往左看是0.721的原因,是数码管的小数点只能在数字的右下角。如果我们把各个显示位拆开看,从右往左得到的就是0   7.   2   1了。

点击阅读全文
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐