数码管显示

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数码管显示

第3讲数码管显示

第3讲数码管显示

一、数码管显示原理

我们最常用的是七段式和八段式LED数码管,八段比七段多了一个小数点,其他的基本相同。所谓的八段就是指数码管里有八个小LED发光二极管,通过控制不同的LED的亮灭来显示出不同的字形。数码管又分为共阴极和共阳极两种类型,其实共阴极就是将八个LED的阴极连在一起,让其接地,这样给任何一个LED 的另一端高电平,它便能点亮。而共阳极就是将八个LED的阳极连在一起。其原理图如下。

其中引脚图的两个COM端连在一起,是公共端,共阴数码管要将其接地,共阳数码管将其接正5伏电源。一个八段数码管称为一位,多个数码管并列在一起可构成多位数码管,它们的段选线(即a,b,c,d,e,f,g,dp)连在一起,而各自的公共端称为位选线。显示时,都从段选线送入字符编码,而选中哪个位选线,那个数码管便会被点亮。

数码管的8段,对应一个字节的8位,a对应最低位,dp对应最高位。所以如果想让数码管显示数字0,那么共阴数码管的字符编码为00111111,即0x3f;共阳数码管的字符编码为11000000,即0xc0。可以看出两个编码的各位正好相反。如下图。

二、点亮一个数码管

下面以七段共阴数码管为例讲述如何点亮一个数码管。

l 51系列单片机的P0口没有上拉电阻(其他端口有),所以如果直接接数码管的段选线,那么不能将其点亮。我们需要为其加上220欧姆的上拉电阻,注意,上拉电阻阻值不能过大。实验原理图如下。

其中,7SEG-COM-CAT-GRN为七段共阴数码管,显示为绿色。RES为电阻。查找电阻时,需要选中下面的Resistors,如下图。

右击选中图中的电阻再左击,弹出的窗口中可改变它的阻值。如下图。

那七个电阻看上去很乱,其实他们可以用一个排阻(RESPACK-7)代替。如下图。

到这里原理图就画完了,我们开始写源程序。让数码管显示字符“0”。#include

void main()

{

P0 = 0x3f; //P0口送字符‘0’的编码

}

显示效果如下。

因为这个程序就一句话,很简单,所以我们不再进行分析。

三、一个数码管显示不同字符

下面的程序让一个数码管轮流显示不同的字符。

#include

void delay();

void main()

{

P0 = 0x3f; //显示字符‘0’

delay(); //延时一会

P0 = 0x06; //显示字符‘1’

delay();

P0 = 0x5b; //显示字符‘2’

delay();

}

void delay()

{

int i,j;

for(i=1000;i>0;i--)

for(j=100;j>0;j--);

}

这个程序实现字符‘0’,‘1’,‘2’的循环显示。但如果要循环显示更多的数字,每次都写出他们的编码很麻烦,这里我们可以将所有的编码都写到一个数组里,以后只需调用数组就可以了。程序如下。

#include

unsigned char code table[]={0x3f,0x06,0x5b}; //定义编码数组,注意最后

void delay();

void main()

{

P0 = table[0]; //调用数组的第一个元素

delay();

P0 = table[1];

delay();

P0 = table[2];

delay();

}

void delay()

{

int i,j;

for(i=1000;i>0;i--)

for(j=100;j>0;j--);

}

这里要说明的是,unsigned char表明数组中的元素是无符号字符型数据,code 表明这是编码数组,其编译后不占内存空间而是占程序存储空间,我们知道单片机的内存空间很小,所以这个很重要。table是数组名字,自己可以随便更换。因为数组中的元素是从0开始排的,所以table[0]就是第一个元素0x3f。

四、多个数码管同时显示

原理图如下:

其中,7SEG-MPX8-CC-BLUE是8位八段共阴数码管,显示为蓝色。其段选线接在P0口,位选线接在P2口。

让所有数码管显示同一个字符。源程序如下:

void main()

{

P2 = 0; //P2口各位全为低电平,选中数码管所有位

P0 = 0x3f; //显示字符‘0’

}

这个程序只比第一个程序多了一条“P2 = 0;”,这样来实现位选。最终效果如下:

让任意位显示字符。源程序如下:

#include

void main()

{

P2 = 0xaa; //选中从左数的第1,3,5,7位数码管

P0 = 0x3f;

}

效果如下:

五、动态显示

以上的显示均为静态显示,下面讲述动态显示。而到底什么是静态显示什么是动态显示,等看完下面的内容就会很清楚了。

因为上面多个数码管显示时只能显示同一个字符,怎么才能让不同的数码管显示不同的字符呢?我们先完成这样的一个程序,让第一位数码管显示1,然后第二位数码管显示2,然后第三位数码管显示3。为了使程序短些,我们只控制前三位,要想让其他五位也显示,道理是一样的。

源程序如下:

#include

unsigned char code table[]={0x3f,0x06,0x5b,0x4f};

void delay();

void main()

{

P2 = 0xfe; //选中第一位数码管

P0 = table[1]; //让其显示字符‘1’

delay(); //延时一会

P2 = 0xfd; //选中第二位数码管

P0 = table[2]; //让其显示字符‘2’

delay();

P2 = 0xfb; //选中第三位数码管

P0 = table[3]; //让其显示字符‘3’

delay();

}

void delay()

{

int i,j;

for(i=1000;i>0;i--)

for(j=100;j>0;j--);

}

这个程序就是分别选中一位数码管,让它显示一个字符,同单位数码管显示的原理是一样的。这里你会发现每显示完一个字符之后都有一个延时,这个延时有什么作用呢?我们可以先试着改变这个延时,看会有什么效果。我们先将delay()函数中的第一个for循环中的i的初值由1000,改为100,再运行一下程序,有什么效果?然后再将其改为10呢?这时是不是我们想要的不同数码管同时显示不同的字符的效果已经出来了。效果如下:

相关文档
最新文档