数码管介绍:
LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件。
一个数码管是由八个二极管所组成的,我们分别给它命名为 a、b、c、d、e、 f、g、dp;如果八个二极管的阳极连接在一起,那么我们就称这个为共阳极数码管,如果八个二极管的阴极连接在一起,那么我们就称这个数码管为共阴极数码管。由上图可见,八个发光二极管围成了一个 8 字形,那么我们要让它显示什么数字或者形状只需要点亮对应的二极管即可。
这个是单个数码管的硬件电路图
这个是多个数码管的硬件电路图
这种数码管点亮的时候需要我们对它进行选择,也就是点亮哪一个,这种选择方式我们叫做‘位选’;而当我们选择数码管之后,我们让被选中的数码管显示何种数字或者形状,这种我们称为‘段选’。
这个是实验所用开发板的数码管原理图
在实际当中,单片机所发出的电流是微安(uA)级别的,但是驱动数码管点亮的电流需要 10 毫安(mA),于是我们会使用电流放大装置来使单片机发出的电流 被放大。有些开发板所用的电流放大装置为三极管,而有些开发板的电流放大装置为锁存器。图中的 74HC245 即是锁存器。
如何点亮数码管
在上面我们有介绍到单个数码管是由八个发光二极管所组成的;点亮数码管的方式跟点亮流水灯的方式类似。我们实验室所用使用的开发板有八个 LED 灯,我们是通过十六进制数来选择哪个 LED 灯亮或者灭,那么我们的数码管也是如此。
首先我们来重新看一遍单个数码管的原理图
当我们赋给发光二极管 a 的值为 0 的时候,发光二极管 a 就会被点亮,同理,我们知道当给哪一个发光二极管赋予低电平时它就会被点亮。
我们现在将单个数码管的八个发光二极管进行一个排序,排序顺序如下:
我们现在想要使单个数码管显示数字 1,那么我们对应所需要点亮的发光二极管就是 b 和 c。那么此时我们给这八个发光二极管所赋的值就如下:
对应转化称十六进制数就是 0x9f;
下面为示例代码和开发板的显示详情:
我们现在可以看到,数码管并没有按照我们的预期显示数字 1 ,我们刚才说显示数字 1 需要我们点亮发光二极管 b 和 c ,但是开发板显示的却是 f 和 g ,由此我们可以推测,我们排序发光二极管的时候,将二极管的顺序搞反了,所以我们现在对单个数码管的八个发光二极管进行重新排序:
那么我们现在重新对 c 和 b 进行点亮操作,这个时候的赋值如下:
这个时候的十六进制数表示为:0xf9
下面为示例代码和开发板的显示详情:
现在我们看到开发板上的第一个数码管显示了数字 1 ,证明我们现在的代码是正确的。
如何同时点亮多个数码管
如果我们仔细观察我们可以发现,数码管在我们的生活当中无处不在,例如教室的电子时钟。
现在我们思考一个问题,数码管这么多个,它是同时亮着显示的吗?答案是否定的,厂家为了节省开发板的能源损耗,将数码管设置为在某一个时间段只点亮单个数码管,而我们的人眼看到的数码管它好像是全部亮着的,这是利用了人的视觉的暂留效应。当一个东西闪得很快的时候,我们人眼是观察不出来的,所以这个时候我们看着它好像就是一直亮着的。我们的开发板多个数码 管就是利用了这样的原理。
下面为示例代码
#include <REGX52.H>//数码管段码表
unsigned char NixieTable[]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F};//数码管显示子函数
void Nixie(unsigned char Location,Number)
{switch(Location) //位码输出{case 1:P2_4=0;P2_5=1;P2_6=1;P2_7=1;break;case 2:P2_4=1;P2_5=0;P2_6=1;P2_7=1;break;case 3:P2_4=1;P2_5=1;P2_6=0;P2_7=1;break;case 4:P2_4=1;P2_5=1;P2_6=1;P2_7=0;break;}P0=NixieTable[Number]; //段码输出
}void main()
{Nixie(2,3); //在数码管的第2位置显示3while(1){}
}
这里的数码管是静态显示的,那我们改如何让数码关动态显示呢?话不多说,上代码
#include <REGX52.H>//数码管段码表
unsigned char NixieTable[]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F};//延时子函数
void Delay(unsigned int xms)
{unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}
}//数码管显示子函数
void Nixie(unsigned char Location,Number)
{switch(Location) //位码输出{case 1:P2_4=0;P2_5=1;P2_6=1;P2_7=1;break;case 2:P2_4=1;P2_5=0;P2_6=1;P2_7=1;break;case 3:P2_4=1;P2_5=1;P2_6=0;P2_7=1;break;case 4:P2_4=1;P2_5=1;P2_6=1;P2_7=0;break;}P0=NixieTable[Number]; //段码输出Delay(1); //显示一段时间P0=0x00; //段码清0,消影
}void main()
{while(1){Nixie(1,1); //在数码管的第1位置显示1
// Delay(20);Nixie(2,2); //在数码管的第2位置显示2
// Delay(20);Nixie(3,3); //在数码管的第3位置显示3
// Delay(20);}
}