本文使用普中科技开发板及江科大视频,侵删!
1、数码管
1.1 数码管定义
数码管(LED Segment Displays)由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。这些段分别由字母a,b,c,d,e,f,g,dp来表示。
开发板位置:
1.2 原理图
1.3 引脚定义
单个数码管:
四位一体数码管
如果所有数码管的阴极都连接到一个端口上,称之为共阴极连接;
如果所有数码管的阳极都连接到一个端口上,称之为共阳极连接;如下图:
数码管的8个LED,每一段都定义了名字,如上图,顺时针旋转,依次是A-B-C-D-E-F-G,还有小数点DP(decimal point)。
8段正好与一个字节的8个bit位一一对应。51单片机同样是8位的。
如下图:引脚定义,左下角为1号引脚,逆时针依次是2-3-4-5-6-7-8-9-10
引脚 硬件连接如下:根据原理图,如果是共阳极,则负极A-->7,8-->6,……DP-->5,依次类推,其实3和8是同一个引脚,可以理解为同一根导线分成了2路。
详细连接图如下:采取 就近原则连接,所有看起来没有规律,其他的数码管连接不尽相同,要仔细分辨。
1.4 单个数码管显示
开发板是共阴极连接,引脚3和8要接地(GND)。
位选:开发板上有8个数码管,选中哪个,哪个才显示,称为位选。(什么位置)
假设开发板上的8个数码管的公共端都未接,如果采用共阴极接法,1号的公共端接地,就选中了1号,2号的公共端接地,就选中了2号,以此类推……
段选: A-B-C-D-E-F-G-DP,8段要显示哪些段,比如要点亮数字6, 则要点亮A C D E F G段。(什么内容)
本次是静态数码管显示,一个数码管显示一个数字即可,比如显示6。(共阴极)
将 A-B-C-D-E-F-G-DP ,8个引脚接到单片机的IO口,比如P0,并给IO口如1011 1110下数据:如下图,则会显示数字6。共阳极则是取反即可。~(1011 1110)
以上就是单个数码管的操作方法。
1.5四位一体数码管显示
开发板上的就是四位一体的。同样有共阴极和共阳极连接。
如上图,引脚的顺序也是左下角开始,逆时针排序。
它的公共端单独引出来,然后所有的A段连接在一起,所有的B段连一起......再连接到就近的引脚上 。
如果要让第三个数码管显示1,则:
位选:第1,2,4给高电平,即阴极是高电平,保证1,2,4不会亮。
段选:BC置高电平(1),其他低电平(0)。
其他数字同理……
从显示原理可知,同一时刻,四位一体不可能显示不同的数字(段选共用),位选全部选中,则显示相同数字。
1.6 74HC138译码器
原理图:
开发板的是74HC245和74HC245,现在已停产。
COM是公共端,开发板上接的是共阴极。COM接VCC,就是共阳极,接GND是共阴极。
原理图上LED1-LED8接到了138译码器的输出端
74HC138的工作原理:
如果要显示1,则要给如下图所示的数据。使它的输出端其中一个输出0,然后剩下的输出1,138译码器正好可以实现这个功能。
注:对于共阴极的数码管,公共端的数据我们叫做阴码,下方的叫做阳码。
单片机的3个P2口可以控制译码器的8个输出。如果8个口使用P2,不但占用P2的IO资源,而且驱动能力也不行。(弱上拉,强下拉)
138译码器操作原理:
138译码器左边输入,右边输出。即:左边的ABC是它的输入端,右边的Y0-Y7是输出端
VCC是电源正极,GND是负极。左下角的G1,G2A,G2B是它的使能端,它相当于一种开关,如果使能电平有效的话,它就可以工作,如果没有效,它就不工作,就是一种电源开关。字母上面有横线的,表示低电平使能,高电平无效。
译码功能实现:
规律:三的IO口的二进制数值(0xxx)转换成十进制的数值对应输出端的哪个口,哪口就有效。这样可以用3个IO口操作8个输出端,减少IO口数。
P2.4 P2.3 P2.2 0
C B A
0 0 0 Y0---LED1
0 0 1 Y1---LED2
0 1 0 Y2---LED3
以此类推……(从0,以二进制形式,加到7即可))
1 1 1 Y7---LED8
然后接下来看看74HC245这块芯片,它叫做双向数据缓冲器,是用数据缓冲的。原理图:
又下角的GND和VCC分别是电源的负极和正极。
A0→B0,A1→B1,A2→B2……依次类推。输入啥,就输出啥,不改变数据
OE是使能,字母上横线,表示低电平有效。如果给它接地,它就工作,如果接VCC高电平,它就不工作。
左下角的DIR,direction表示方向,把左边的数据给缓存到右边,把右边的数据给读回来,这就是DIR的功能。如果DIR接高电平,就把左边数据送到右边去,如果接低电平,就把右边的数据给读回来。开发版DIR接VCC,高电平,表示从左往右。
RP3和RP4表示排阻,100R表示100Ω,防止数码管的电流过大的作用。千欧的话就是100K。
2、代码实现
第1步:位选(哪个数码管,Y1??,Y2??)
控制译码器上的这三个P2口,使右边某一位输出0选中
第2步 段选:(要显示什么)
选中之后,再给P0口的段码数据,比如说给0100 0000,它就会缓冲一下,直接过来,送到公共的段码端,就会显示相应的数据。
代码如下:要在第3个数码管上显示6。第三个数码管是LED6,即Y5,根据138译码器的ABC规律,数据是:P2_4=1,P2_3=0;P2_1=1
然后再给P0的8个口段码数据,让第三位数码管显示“6”,如图我们要点亮的是a,c,d,e,f,g段LED
只有b段和小数点dp不亮,,就它们数字0,其他位选端位1,我们就要给数据0111 1101。P0_0对应a,依次对应,故P2=0x7D。然后把这个数据原封不动地从左边移到右边P0的8个口来,注意一定要对准高低位。
按照此原理可以显示其他数值。不过比较麻烦,要挨个改。所以可以将这几行代码封成函数,把位选、段选传进函数,就显示相应数值。函数如下:
Location表示位置,即位选 ,Number表示段选,即要显示的数字。可以将段选用数组表示,即:
NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F},表示0~9,10个数字。
最终结果如下:
在主函数里调用一下,试看效果:
代码正确。
如有错误,欢迎指正!