LED数码管结构与工作原理

LED数码管结构与工作原理

一.什么是数码管

LED数码管(LED Segment Displays)是由8个发光二极管构成,并按照一定的图形及排列封转在一起的显示器件。其中7个LED构成7笔字形,1个LED构成小数点(固有时成为八段数码管)。

数码管位数有半位,1,2,3,4,5,6,8,10位等等(及数码管的位数),颜色有红,绿,蓝,黄等几种。了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。

二.数码管基本构造

LED数码管有两大类,一类是共阴极接法,另一类是共阳极接法,共阴极就是7段的显示字码共用一个电源的负极,是高电平点亮,共阳极就是7段的显示字码共用一个电源的正极,是低电平点亮。只要控制其中各段LED的亮灭即可显示相应的数字、字母或符号。

共阴和共阳极数码管的内部电路,它们的发光原理是一样的,只是它们的电源极性不同而已,共阴为所有的LED负极接在一起,共阳为为所有的LED正极接在一起。如下图为1位数码管的共阴极和共阳极原理图:

三、数码管显示原理

要是数码管显示数字,有两个条件:1.是要在VT端加合适的电源(一般每颗LED还需串上合适的电阻,起限流作用);2.要使(a,b,c,d,e,f,g,dp)端接低电平或“0”电平。这样才能显示的。

例如下图的共阴极数码管,须在VT端接上地端,(a,b,c,d,e,f,g,dp)端接到单片机的引脚上;如果要使其中一个LED亮时,对应的单片机引脚输出高电平,即可点亮LED等。

共阴极LED数码管的内部结构原理图

能够点亮数码管后,就可以通过单片机控制数码管显示数字或字母。为了控制方便,我们将数码管的a~dp引脚依次连接单片机的P10-P17引脚,如图:

我们对数码管所要显示的每个数字和字母进行编码,然后在编程时,将编码放在一个数组上,需要显示什么数字或者字母,从数组里面提取相应的编码就可显示所要显示的字符了。

如图,要显示数字“5”时,编码为0x6D。如果数码管为共阳极,只需要对共阴极的编码做一个取反操作即可。

四.数码管驱动方式

根据LED数码管的驱动方式的不同,可以分为静态式和动态式两类。

1.静态驱动方式

静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O口进行驱动,或者使用如BCD码二-十进位转换器进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O口多,如驱动5个数码管静态显示则需要5×8=40根I/O口来驱动,要知道一个89S51单片机可用的I/O口才32个呢。故实际应用时必须增加驱动器进行驱动,增加了硬体电路的复杂性。

2.动态驱动方式

数码管动态显示介面是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp "的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制。

当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位元选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。

透过分时轮流控制各个LED数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极体的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示资料,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O口,而且功耗更低。

四位数码管动态驱动方式连接图

五.八位数码管动态驱动例程

以八位共阴极数码管,动态驱动的方式为例:

#include

//--定义使用的IO口--//

#define GPIO_DIG P0 //段选

#define GPIO_PLACE P1 //位选

//--定义全局变量--//

unsigned char code DIG_PLACE[8] = {

0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制 查表的方法控制

unsigned char code DIG_CODE[17] = {

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码

unsigned char DisplayData[8];

//用来存放要显示的8位数的值

//--声明全局函数--//

void DigDisplay(); //动态显示函数

/*******************************************************************************

* 函 数 名 : main

* 函数功能 : 主函数

* 输 入 : 无

* 输 出 : 无

*******************************************************************************/

void main(void)

{

unsigned char i;

for(i=0; i<8; i++)

{

DisplayData[i] = DIG_CODE[i];

}

while(1)

{

DigDisplay();

}

}

/*******************************************************************************

* 函 数 名 : DigDisplay

* 函数功能 : 使用数码管显示

* 输 入 : 无

* 输 出 : 无

*******************************************************************************/

void DigDisplay()

{

unsigned char i;

unsigned int j;

for(i=0; i<8; i++)

{

GPIO_PLACE = DIG_PLACE[i]; //发送位选

GPIO_DIG = DisplayData[i]; //发送段码

j = 10; //扫描间隔时间设定

while(j--);

GPIO_DIG = 0x00;//消隐

}

如果您喜欢,可关注个人公众号“电子应用学习馆”,获取更多的资料例程。

相关文章

best365手机官方 京东钱包怎么算利息?京东钱包收益怎么样?
best365手机官方 11月21日世界杯预选赛推荐:巴西VS阿根廷
365bet返水多少 欢迎使用安博全站App(中国大陆)V4.49.66.9官方IOS/安卓版手机版APP下载
注册送365 《永恒纪元》游戏等级上限:如何快速提升等级?
注册送365 豆角煮多久才熟透?掌握这几点让你吃得健康又美味
365bet返水多少 上班必备 — 电脑上刷手机攻略(畅玩各类app)