1.7.1. 介绍
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位数码管,原理示意图如下:
其中:A/B/C/D/E/F/G/DP称为段码,公共引脚6/9称为位码。
1.8.2. 单位数码管的驱动
案例描述:0~9的循环秒计数器(9s后从0s重新开始计数)
需求分析:粗计时,使用sleep函数
1.7.2.1. 硬件电路
以共阳极数码管为例,正极接电源(位码),字段led的负极接单片机IO口(位码),如下图所示:
其中R00~R07称为限流电阻,阻值1K,计算方式同Led。
实例中使用的是2位共阳数码管管脚定义如下:
使用其中的DIG2用作单位数码管实验,故DIG2的公共引脚“5”接Vcc(3.3v)。其他引脚结合原理图、引脚定义图接线,切记要接限流电阻。
1.7.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.7.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.7.3. 双位数码管的驱动
案例描述:00~99的循环秒计数器(99s后从0s重新开始计数)
需求分析:粗计时,使用sleep函数。
1.7.3.1. 硬件电路
以共阳极数码管为例,如下图所示:
只有Led两端均有合适的电压时,Led才会被点亮。多位数码管情况下,为了减少IO口消耗,段码、位码配合工作达到控制到每一位的目的。但是,如果还采用上节的控制方案,数码管每一个点亮的段的共极脚位电流会同时流经单片机,单片机共极脚将承受较大的电流,增加了损坏的隐患。
而如果每个时间段只显示一段(只有一个led点亮),只要速度足够快(大于100hz),肉眼看上去就好像每个需要点亮的段都在点亮一样,这同样可以达到显示效果,但却能解决掉流程共极端电流过大的隐患。对单片机来说,达到肉眼不可分辨的速度,是很容易实现的。
1.7.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.7.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 经常不在线,尽量微信