单片机学习笔记:静态数码管显示技术详解

目录

数码管是什么?

一位数码管的引脚定义

四位一体的数码管引脚定义

数码管的原理图解析

数码管怎么显示数据?(总结+代码显示)


今天开始学习数码管,它比LED和独立按键复杂一点

数码管是什么?

LED数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件

也就是在我们开发板的这里

它下方的138译码器和右边的74HC245都属于数码管操作的这些东西

以下是它的原理图

一位数码管的引脚定义

市面上有一位的数码管和四位一体的数码管:

先介绍一位的数码管

如果所有数码管的阴极都连接到一个端口上,我们就称为共阴极连接,如下图:

如果所有的数码管的阳极都连接到一个端口上,我们就称为共阳极连接,如下图:

一般的,数码管上的8个LED,每一段都定义了名字,如下图,每一段的名字按顺时针依次是A、B、C、D、E、F、G(中间那段),外加个小数点,叫做DP

8段正好跟1个字节8个比特位一一对应,而51单片机也是8位的单片机

再来看下引脚定义,引脚的定义正好跟芯片的序号差不多,当我们正视它的时候,左下角的第一个引脚叫做一号引脚,逆时针过来就是2号引脚,依次递推就是3,4,5,6,7,8,9,10号引脚,如下图:

我们来看一些这些引脚的连接结构

右边的原理图上的每一个二极管都标好了名字,对应“8”字上的每一段的名字,原理图上的每一个引脚的序号也是一一对应“8”字上的每一个引脚,比如,A段二极管的阳极连接的是3和8号引脚,其实3和8号引脚都是一个引脚,只不过分开两根而已(如果是共阳极的话,那上下都是所有LED的正极)

而A段LED的负极也就是阴极连接到7号引脚上

以下就是它的引脚和LED的连接逻辑

可以发现,虽然在原理图上看着是乱序的,但实际上它都是就近连接原则

所以我们自己买数码管,自己设计电路的时候,一定要搞清楚它哪个段是接在哪个引脚上面的

接下来我们来看一下怎么让数码管显示一个我们让它显示的数字

比如想让它显示数字6,假设它是共阴极连接(因为我的开发板上就是共阴极连接的)

那么我们就要点亮A,C,D,E,F,G段二极管

点亮二极管之前,我们肯定要把所有LED的阴极的公共端接地

就是给数字0,或者给低电平,都叫接地。

选公共端,就做位选端,就是选中哪一个哪一个才亮,如果有多个位选,就是控制多个选中。

共阴极接地(负极),然后阳极接引脚(正极)。

位选完之后要段选。

我们想要A段点亮,A段就应该接高电平1,B不点亮,就给它低电平0

然后我们再把这8个引脚接到单片机的IO口,再给IO这样一个数据,然后把公共端选中

这时A,C,D,E,F,G就亮了,就能显示数字“6”

而10111110这串数字就是LED的段码

如果是共阳极的话,公共端就要接到VCC(高电平1,电源的正极)

那如果想要LED亮的话,阴极就不是给1了,应该给0

那01000001这串数字就是操作共阳极的段码数据,和共阴极正好相反

以上就是一个数码管的操作方式

就是把公共端选中,然后段选端给相应的数据,它就亮相应的数字

四位一体的数码管引脚定义

接下来就是看四位一体的数码管

我们开发板上的数码管就是四位一体的

它同样有共阴极和共阳极连接

引脚的序号也是正视时,从左下角开始逆时针排序

它的公共端单独引出来,然后所有的A段连接在一起,所有的B段连接在一起……再连接到就近的引脚上

比如我们要让数码管的第三位显示数字“1”,怎么连呢?

我们给第一位、第二位、第四位高电平1,即阴极连接正极,那无论如何这三位是不会亮了。

我们给第三位低电平0,即阴极连接负极,然后段选端我们选择B段和C段数字1,即这两段的阳极连接正极,这两段就会亮,而其他段给数字0。

这样就能实现在数码管上的第三位上显示数字“1”了

我们得出一个结论,这个四位一体的数码管不可能在同一时刻显示多个不同数字,即使有多位选中的话,那显示的数字也会是相同的。这是由于他们共用引脚导致的这个现象。当然这也是为了节省引脚的连接方式,方便操作。

数码管的原理图解析

以上预备知识了解后,我们回头看看138译码器和74HC245的原理图

注意:原理图上的138译码器写的是74LS138,实际上我们开发板上连接的是74HC138,

中间是电压和工号那个符号。

138译码器和74HC245都是74系列,是比较古老的系列了,现在几乎已经停产了,只不过我们现在只是拿来学习而已。

数码管原理图上COM,就是公共端,这个是共阴极的数码管。

数码管引脚共阴极和共阳极怎么分辨?

应用时,COM端接VCC就是共阳极,COM端接GND就是共阴极。

如我们前面所讲,如果给以下数据的话,就能让数码管显示“1”。

对于共阴极的数码管,公共端的数据我们叫做阴码,下方的叫做阳码。

原理图上LED1-LED8接到了138译码器的输出端

138译码器是什么工作原理呢?

现在目的是使它的输出端其中一个输出0,然后剩下的输出1,138译码器正好可以实现这个功能

并且可以使8个端口变成用3个端口控制(P2的三个口,直接连在单片机上),三个IO口可以控制8个输出端,其中一位是0,其他位是1。

那操作流程是怎么样的呢?

左边的ABC是它的输入端,右边的Y0-Y7是输出端

中间的VCC和GND是要接电源的正极和负极

左下角的G1,G2A,G2B是它的使能端,它相当于一种开关,如果使能电平有效的话,它就可以工作,如果没有效,它就不工作,就是一种电源开关。

那这种开关怎么工作呢?

需要把G1接上高电平1(正极VCC),G2A和G2B接上低电平0(接地),如图所示

只要上电138译码器就已经开始工作了,所以我们就不管这三个引脚了。

138译码器叫做38线译码器,就是3个线到8个线,

那译码是怎么样的功能呢?

我们把这个输出画一下表格:

三的IO口的二进制数值转换成十进制的数值对应输出端的哪个一个口,哪一个口就有效,输出0,其他的都为1。这样可以用3个IO口操作8个输出端,减少IO口数。

然后接下来看看74HC245这块芯片,它叫做双向数据缓冲器,是用数据缓冲的。

左下角的两个控制引脚GND和VDD分别是电源的负极和正极。

然后那个OE其实应该是CE,chip enable芯片使能端,低电平有效,跟138译码器的三个使能端一样,如果给它接地,它就工作,如果接VCC高电平,它就不工作。

中间的连接如上图红线所示。

还有左上角的DIR,direction表示方向的意思,把左边的数据给缓存到右边,把右边的数据给读回来,这就是DIR的功能。

对于数码管显示来说,我们只需要给它送数据,不需要读回来。

所以说这个LE连接到J21的LE的位置。

我们原理图左上角有一个J21,对应开发板上的这个跳线帽,它插在某个地方就是把两个引脚给短路,它始终都把LE接到高电平的VCC上。

如果DIR接高电平,就把左边数据送到右边去,如果接低电平,就把右边的数据给读回来。所以LE是插在左边,那一直是高电平,就一直都是把左边的数据送到右边去。

为什么这样接呢?

因为高电平的驱动能力有限,输出的最大电流不能太大,低电平的驱动能力强一些,这也就是为什么之前的LED是用低电平点亮的方式。因为高电平的驱动能力弱。

如果试过高电平点亮和低电平点亮的话,你会发现一定是低电平点亮的更亮一些,所以高电平点亮数码管,电流就会很小,会很暗,因此加了一个缓冲器,用来提高驱动能力的。

这个是个电容100 000pF,叫做电源滤波,作用是稳定电源,使电源给芯片供电更加稳定

这个东西是排组,四个电阻为一体的排组,电阻值是100R就是100欧的意思,如果是千欧的话就是100K,作用就是限流电阻,防止数码管的电流过大

就在开发板的拉杆下面

数码管怎么显示数据?(总结+代码显示)

到这,本节的原理图的电路介绍完毕,接下来总结一下,怎么样才能显示一个数据呢?

第一步:就是控制译码器上的这三个P2口,使右边某一位输出0选中,也就是数码管的公共端的某个口被选中给0。

第二步:选中之后,再给P0口的段码数据,比如说给0100 0000,它就会缓冲一下,直接过来,送到公共的段码端,就会显示相应的数据。

现在就开始写本节的示例代码:静态数码管显示

新创建工程,直接点亮数码管来演示一下,比如让第三位显示“6”

首先选中LED6,然后LED6是接在Y5上,那么我们就要想怎么让P2的三个口的二进制数值换算成十进制的时候数值是5,显然P24,P23,P22依次分别是1 0 1的时候,换算成十进制就是5

然后再给P0的8个口段码数据,让第三位数码管显示“6”,如图我们要点亮的是a,c,d,e,f,g段LED

只有b段和小数点dp不亮,,就它们数字0,其他位选端位1,我们就要给数据0111 1101

然后把这个数据原封不动地从左边移到右边P0的8个口来,注意一定要对准高低位。

把0111 1101转换成16进制写程序应该是0x7D

编译无错误后下载看效果

可以看到第三位显示6个了

如果想要第四位显示“6”,代码怎么写?

看一看到第四位是LED5,那P2的三个口二进制数值应该是100

P0的8个口的数字是0111 1101换算成十六进制就是0x7D

把代码改成这样

编译下载看效果

可以看到第四位显示6。

D3和D4LED也会亮是因为引脚冲突,因为D3和D4也是由P22和P23接连的。

以上这样的代码也能实现效果,

不过这样很麻烦,我们可以优化一下代码

我们可以把这两段代码用一个子函数封装起来

Location表示位置,可以用一个Switch分支语句封装

而Number的封装则可以定义一个数组,初始值我们可以把下面的一串断码表复制进去:

0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F

其实这个可以推断出来

比如,数字“0”的断码是a,b,c,d,e,f  

则对应的二进制是0011 1111,转换成16进制就是0x3F

分装的函数最后是这样

然后我们写个程序验证一下

编译无错误后看看效果

我们看到的确是第7个LED显示数组“2”,这就是本节想要实现的效果

我们可以尝试一下改成别的位置和显示别的数字

的确是第2个LED显示数字“3”,说明程序没有问题!

以上就是本节的静态数码管显示程序。

说明一下,大家可以把这里勾选上,这样就不用每次编译完无错误后点击下载了,勾选上之后它会自动给我们下载,我们需要重启板子就可以了

物联沃分享整理
物联沃-IOTWORD物联网 » 单片机学习笔记:静态数码管显示技术详解

发表评论