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
原文地址:https://www.cnblogs.com/horal/p/15564287.html