zoukankan      html  css  js  c++  java
  • 1.8. 数码管

    1.8.1. 介绍

    视频连接

    wps1 wps2

    8个led按照上图中的顺序排列,并把led的正极接到一块(共阳级)引出或把led的负极接到一块(共阴极)引出,这就是数码管。

    数码管可以用来显示简单的字符,如0~9。

    当共阳极单位数码管的公共端接电源正极,段LED的负极为低电平时对应的段显示,段LED的负极为高电平时对应的段熄灭,编码表如下:

     

    段码

    位码

    A

    B

    C

    D

    E

    F

    G

    DP

    ‘0’

    0

    0

    0

    0

    0

    0

    1

    1

    1

    ‘1’

    1

    0

    0

    1

    1

    1

    1

    1

    1

    ‘2’

    0

    0

    1

    0

    0

    1

    0

    1

    1

    ‘3’

    0

    0

    0

    0

    1

    1

    0

    1

    1

    ‘4’

    1

    0

    0

    1

    1

    0

    0

    1

    1

    ‘5’

    0

    1

    0

    0

    1

    0

    0

    1

    1

    ‘6’

    0

    1

    0

    0

    0

    0

    0

    1

    1

    ‘7’

    0

    0

    0

    1

    1

    1

    1

    1

    1

    ‘8’

    0

    0

    0

    0

    0

    0

    0

    1

    1

    ‘9’

    0

    0

    0

    0

    1

    0

    0

    1

    1

    当共阴极单位数码管的公共端接电源负极,段LED的负极为高电平时对应的段显示,段LED的负极为低电平时对应的段熄灭,编码表如下:

     

    段码

    位码

    A

    B

    C

    D

    E

    F

    G

    DP

    ‘0’

    1

    1

    1

    1

    1

    1

    0

    0

    0

    ‘1’

    0

    1

    1

    0

    0

    0

    0

    0

    0

    ‘2’

    1

    1

    0

    1

    1

    0

    1

    0

    0

    ‘3’

    1

    1

    1

    1

    0

    0

    1

    0

    0

    ‘4’

    0

    1

    1

    0

    0

    1

    1

    0

    0

    ‘5’

    1

    0

    1

    1

    0

    1

    1

    0

    0

    ‘6’

    1

    0

    1

    1

    1

    1

    1

    0

    0

    ‘7’

    1

    1

    1

    0

    0

    0

    0

    0

    0

    ‘8’

    1

    1

    1

    1

    1

    1

    1

    0

    0

    ‘9’

    1

    1

    1

    1

    0

    1

    1

    0

    0

    2个数码管组成的组合数码管称为2位数码管,原理示意图如下:

    wps3

    其中:A/B/C/D/E/F/G/DP称为段码,公共引脚6/9称为位码。

    1.8.2. 单位数码管的驱动

    案例描述:0~9的循环秒计数器(9s后从0s重新开始计数)

    需求分析:粗计时,使用sleep函数

    1.8.2.1. 硬件电路

    以共阳极数码管为例,正极接电源(位码),字段led的负极接单片机IO口(位码),如下图所示:

    wps4

    其中R00~R07称为限流电阻,阻值1K,计算方式同Led。

    实例中使用的是2位共阳数码管管脚定义如下:

    wps5wps6

    使用其中的DIG2用作单位数码管实验,故DIG2的公共引脚“5”接Vcc(3.3v)。其他引脚结合原理图、引脚定义图接线,切记要接限流电阻。

    1.8.2.2. 基于驱动模块的代码实现

    共阳极单位/双位数码管的类已经封装好,可以从gitee仓库下载本教程案例代码。数码管驱动模块的目录:1_7数码管/exam3/CADT.py或1_7数码管/exam4/CADT.py。

    主程序代码实现:

    from time import sleep,sleep_ms
    
    from CADT import digitalCube1
    
    disp = digitalCube1(15,4,5,18,19,21,22,23)
    
    #循环计数器
    
    i = 0
    
    j = 0
    
    while True:
    
        i = i+1
    
        if(i>999):
    
            i=0
    
            j = j+1
    
            if(j>9):
    
                j=0
    
            disp.updateDisplay(j)
    
        disp.display()
    
        sleep(0.001)
    1.8.2.3. 直接驱动(静态显示)

    采用直接驱动方式,驱动单位led的实现代码:

    from machine import Pin
    
    from time import sleep
    
    #实例化段码
    
    a  = Pin(15,Pin.OUT)
    
    b  = Pin(4,Pin.OUT)
    
    c  = Pin(5,Pin.OUT)
    
    d  = Pin(18,Pin.OUT)
    
    e  = Pin(19,Pin.OUT)
    
    f  = Pin(21,Pin.OUT)
    
    g  = Pin(22,Pin.OUT)
    
    dp = Pin(23,Pin.OUT)
    
    #关闭段码
    
    a.on()
    
    b.on()
    
    c.on()
    
    d.on()
    
    e.on()
    
    f.on()
    
    g.on()
    
    dp.on()
    
    #段码
    
    duan_ma  = [0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09]
    
    duan_ctl = [dp,g,f,e,d,c,b,a]
    
    #显存
    
    display_buff = 0b11111111
    
    #显示函数
    
    def display():
    
        global display_buff
    
        for j in range(8):
    
            if(display_buff&(1<<j)):
    
                duan_ctl[j].on()
    
            else:
    
                duan_ctl[j].off()
    
    #循环计数器
    
    i = 0
    
    while True:
    
        display_buff = duan_ma[i]
    
        i = i+1
    
        if(i>9):
    
            i=0
    
        display()
    
        sleep(1)
    1.8.3. 双位数码管的驱动

    案例描述:00~99的循环秒计数器(99s后从0s重新开始计数)

    需求分析:粗计时,使用sleep函数。

    1.8.3.1. 硬件电路

    以共阳极数码管为例,如下图所示:

    wps7

    只有Led两端均有合适的电压时,Led才会被点亮。多位数码管情况下,为了减少IO口消耗,段码、位码配合工作达到控制到每一位的目的。但是,如果还采用上节的控制方案,数码管每一个点亮的段的共极脚位电流会同时流经单片机,单片机共极脚将承受较大的电流,增加了损坏的隐患。

    而如果每个时间段只显示一段(只有一个led点亮),只要速度足够快(大于100hz),肉眼看上去就好像每个需要点亮的段都在点亮一样,这同样可以达到显示效果,但却能解决掉流程共极端电流过大的隐患。对单片机来说,达到肉眼不可分辨的速度,是很容易实现的。

    1.1.3.2. 基于驱动模块

    共阳极单位、双位数码管的类已经封装好,可以从gitee仓库下载本教程案例代码,数码管类目录:1_7数码管/exam3/CADT.py或1_7数码管/exam4/CADT.py。

    from time import sleep,sleep_ms
    
    from CADT import digitalCube2
    
    disp = digitalCube2(15,4,5,18,19,21,22,23,25,33)
    
    #循环计数器
    
    i = 0
    
    j = 0
    
    while True:
    
        i = i+1
    
        if(i>999):
    
            i=0
    
            j = j+1
    
            if(j>9):
    
                j=0
    
            disp.updateDisplay(j)
    
        disp.display()
    
        sleep(0.001)
    
    1.8.3.3. 直接驱动(动态显示)
    采用直接驱动方式,驱动单位led的实现代码:
    
    from machine import Pin
    
    from time import sleep,sleep_ms
    
    #实例化段码
    
    a  = Pin(15,Pin.OUT)
    
    b  = Pin(4,Pin.OUT)
    
    c  = Pin(5,Pin.OUT)
    
    d  = Pin(18,Pin.OUT)
    
    e  = Pin(19,Pin.OUT)
    
    f  = Pin(21,Pin.OUT)
    
    g  = Pin(22,Pin.OUT)
    
    dp = Pin(23,Pin.OUT)
    
    gao = Pin(25,Pin.OUT)
    
    di = Pin(33,Pin.OUT)
    
    #关闭段码
    
    a.on()
    
    b.on()
    
    c.on()
    
    d.on()
    
    e.on()
    
    f.on()
    
    g.on()
    
    dp.on()
    
    gao.on()
    
    di.on()
    
    #段码
    
    duan_ma  = [0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09]
    
    duan_ctl = [dp,g,f,e,d,c,b,a,dp,g,f,e,d,c,b,a]
    
    #显存
    
    display_buff = 0b1111111111111111
    
    #显示函数
    
    def display(index):
    
        global display_buff
    
        for i in range(8):
    
            duan_ctl[i].on()
    
        if(index > 7):
    
            gao.on()
    
            di.off()
    
        else:
    
            gao.off()
    
            di.on()
    
        if(display_buff&(1<<index)):
    
            duan_ctl[index].on()
    
        else:
    
            duan_ctl[index].off()
    
    #更新显存
    
    def updateDisplayBuff(value):
    
        global display_buff
    
        temp_shi = int(value/10)
    
        temp_ge  = (value%10)
    
        display_buff = (0x00ff|(duan_ma[temp_shi]<<8))&\
    
    (0xff00|duan_ma[temp_ge])
    
    #循环计数器
    
    i = 0
    
    j = 0
    
    while True:
    
        i = i+1
    
        if(i>999):
    
            i=0
    
            j = j+1
    
            updateDisplayBuff(j)
    
            #display_buff = 0x2503
    
            if(j>99):
    
                j=0
    
        display(i%16)
    
        sleep(0.001)
    1.8.4. 驱动模块源码

    共阳极单位、双位数码管的类已经封装好,可以从gitee仓库下载本教程案例代码,数码管类目录:1_7数码管/exam3/CADT.py或1_7数码管/exam4/CADT.py,源码如下:

    from machine import Pin
    
    #共阳单位数码管
    
    class digitalCube1:
    
        '''
    
    类的接口函数,输入参数段码IO口.
    
        '''
    
        def __init__(self,a,b,c,d,e,f,g,dp):
    
            self.duan_ctl  = [Pin(dp,Pin.OUT),\
    
                              Pin(g,Pin.OUT),\
    
                              Pin(f,Pin.OUT),\
    
                              Pin(e,Pin.OUT),\
    
                              Pin(d,Pin.OUT),\
    
                              Pin(c,Pin.OUT),\
    
                              Pin(b,Pin.OUT),\
    
                              Pin(a,Pin.OUT)]
    
            self.duan_code = [0x03,\
    
                              0x9f,\
    
                              0x25,\
    
                              0x0d,\
    
                              0x99,\
    
                              0x49,\
    
                              0x41,\
    
                              0x1f,\
    
                              0x01,\
    
                              0x09]
    
            self.disp_buff = 0b111111
    
        '''
    
    更新要显示的内容value
    
        '''
    
        def updateDisplay(self,value):
    
            self.disp_buff = self.duan_code[value]
    
        '''
    
    显示函数,在时间片中调用
    
        '''
    
        def display(self):
    
            for i in range(8):
    
                if (self.disp_buff & (1<<i)):
    
                    self.duan_ctl[i].on()
    
                else:
    
                    self.duan_ctl[i].off()
    
    #共阳双位数码管
    
    class digitalCube2:
    
        '''
    
    类的接口函数,输入参数段码IO口.
    
        '''
    
        def __init__(self,a,b,c,d,e,f,g,dp,ge,shi):
    
            self.duan_ctl  = [Pin(dp,Pin.OUT),\
    
                              Pin(g,Pin.OUT),\
    
                              Pin(f,Pin.OUT),\
    
                              Pin(e,Pin.OUT),\
    
                              Pin(d,Pin.OUT),\
    
                              Pin(c,Pin.OUT),\
    
                              Pin(b,Pin.OUT),\
    
                              Pin(a,Pin.OUT),\
    
                              Pin(dp,Pin.OUT),\
    
                              Pin(g,Pin.OUT),\
    
                              Pin(f,Pin.OUT),\
    
                              Pin(e,Pin.OUT),\
    
                              Pin(d,Pin.OUT),\
    
                              Pin(c,Pin.OUT),\
    
                              Pin(b,Pin.OUT),\
    
                              Pin(a,Pin.OUT)]
    
            self.duan_code = [0x03,\
    
                              0x9f,\
    
                              0x25,\
    
                              0x0d,\
    
                              0x99,\
    
                              0x49,\
    
                              0x41,\
    
                              0x1f,\
    
                              0x01,\
    
                              0x09]
    
            self.ge_ctl  =  Pin(ge,Pin.OUT)
    
            self.shi_ctl =  Pin(shi,Pin.OUT)
    
            self.disp_buff = 0b111111
    
            self.index = 0
    
        '''
    
    更新要显示的内容value
    
        '''
    
        def updateDisplay(self,value):
    
            temp_shi = int(value/10)
    
            temp_ge  = (value%10)
    
            self.disp_buff = (0x00ff|(self.duan_code[temp_shi]<<8))&\
    
                             (0xff00|self.duan_code[temp_ge])
    
        '''
    
    显示函数,在时间片中调用
    
        '''
    
        def display(self):
    
            #关闭所有段
    
            for i in range(8):
    
                self.duan_ctl[i].on()
    
            if(self.disp_buff&(1<<self.index)):
    
                self.duan_ctl[self.index].on()
    
            else:
    
                self.duan_ctl[self.index].off()
    
            if(self.index > 7):
    
                self.shi_ctl.on()
    
                self.ge_ctl.off()
    
            else:
    
                self.shi_ctl.off()
    
                self.ge_ctl.on()      
    
            self.index = self.index + 1
    
            if self.index > 15:
    
                self.index = 0
    ----*----*----*----*----*----*----*----*----*----*----*----
    史久超 email:shijiuchao1983@163.com tel:15999550975 qq:157185173
  • 相关阅读:
    mysql数据创建带参的存储过程,并在存储过程中调用另一个存储过程
    python解析.xls/.xlsx文件--openpyxl模块(第三方)
    python使用django开发接口
    Mysql创建存储过程--批量插入数据
    Centos7下安装kafka,并使用python操作kafka的简单使用
    Centos7下安装JDK1.8
    Centos7下docker的安装
    python解析.xml文件-- xmltodict模块(第三方)
    解决:git SSL certificate problem: unable to get local issuer certificate
    AD域是什么意思?
  • 原文地址:https://www.cnblogs.com/horal/p/15564287.html
Copyright © 2011-2022 走看看