在51单片机学习过程中,相对基础的一个实验就是利用七段数码管依次显示数字0-9。很多时候,我们按照要求,搭建了电路,编写了对应的显示控制程序,最后运行,可能对于七段数码管显示数字的原理并没有进行深入的研究。今天结合自己的理解,给出七段数码管显示的原理。
七段数码管,本身利用发光二极管的原理,组成一个'8'的形状,这个'8'正好是七段组成,所以一般称为七段数码管。
组成这个7段数码管的每个部分又分为a,b,c,d,e,f,g部分,分别对应如下所示:
七段数码管的连接方式,根据现实布线的方式,可以组成共阳数码管和共阴数码管,所谓共阳,就是数码管的一极全部接电源,而二极管根据发光原理,只能是正极接电源,负极接地,所以数码管一级全部接电源的情况,称为共阳数码管,如下所示:
在proteus元器件库中,共阳数码管名称是:7SEG-COM-AN-[COLOR]
共阴数码管,就是公共一极全部接地,如下所示:
在proteus元器件库中,共阳数码管名称是:7SEG-COM-CAT-[COLOR]
上面的两个图形,可能看不出问题所在,主要区别在于电路图中的电源和接地图标不同:
在实际编程中,基本采用一种类型数码管显示即可,默认都是选择共阴数码管,也就是我们需要让开发板输出电压为高电平,点亮对应的数码管。
在上面的字母对应的七段数码管中,要显示0-9,需要的电平如下所示:
a | b | c | d | e | f | g | 字形 | 所需字母数码段 |
1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | abcdef |
0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | bc |
1 | 1 | 0 | 1 | 1 | 0 | 1 | 2 | abdeg |
1 | 1 | 1 | 1 | 0 | 0 | 1 | 3 | abcdg |
0 | 1 | 1 | 0 | 0 | 1 | 1 | 4 | bcfg |
1 | 0 | 1 | 1 | 0 | 1 | 1 | 5 | acdfg |
1 | 0 | 1 | 1 | 1 | 1 | 1 | 6 | acdefg |
1 | 1 | 1 | 0 | 0 | 0 | 0 | 7 | abc |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 8 | abcdefg |
1 | 1 | 1 | 1 | 0 | 1 | 1 | 9 | abcdfg |
光这个表,看不出要怎么设置引脚的电平高低,但是我们可以通过代码中的值来反推这个表,一般我们的代码中可能有这样一个表示显示数字的数组:
unsigned char led[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
这一组数据,其实对应上面共阴数码管表,可以这么理解,把数码管的g,f,e,d,c,b,a七个段,外加一个0位,正好组成八位二进制,其中0对应0x3f,就是0011 1111,正好对应上面表格中的按照顺序1111 110反过来的表示。1对应0x06,也就是0000 0110,同样对应上面表格0110 000反过来的表示。后面都是类似的规律。显示数字8,全部点亮,也就是1111 111,反过来二进制表示就是0111 1111,正好对应十六进制0x7f。
理解了这些规律,再反过来理解数码管的显示,其实就不难了。
以上是对七段数码管显示数字0-9的研究,其实数码管还可以显示很多其他字母,至少大写的E,F,L都是可以模拟显示的,规律也一样,点亮七段数码光的某一些段,就可以显示对应的字形,其实并不是真正的显示某一个字形,而是用了拼凑形状让二极管发光的办法。