5.2 单片机驱动8位LED数码管的电路与程序详解

5.2.1 多位LED数码管外形、结构与检测

1.外形与类型

图5-9是4位LED数码管,它有两排共12个引脚,其内部发光二极管有共阳极和共阴极两种连接方式,如图5-10所示。其中12、9、8、6脚分别为各位数码管的公共极(又称位极),11、7、4、2、1、10、5、3脚同时连接各位数码管的相应段,称为段极。

图5-9 4位LED数码管

2.多位LED数码管显示多位字符的显示原理

多位LED数码管采用了扫描显示方式,又称动态驱动方式。为了让大家理解该显示原理,这里以在图5-9所示的4位LED数码管上显示“1278”为例来说明,假设其内部发光二极管为图5-10b所示的共阴极连接方式。

图5-10 4位LED数码管内部发光二极管的连接方式

先给数码管的12脚加一个低电平(9、8、6脚为高电平),再给7、4脚加高电平(11、2、1、10、5脚均低电平),结果第一位的b、c段发光二极管点亮,第一位显示“1”,由于9、8、6脚均为高电平,故第二、三、四位中的所有发光二极管均无法导通而不显示;然后给9脚加一个低电平(12、8、6脚为高电平),给11、7、2、1、5脚加高电平(4、10脚为低电平),第二位的a、b、d、e、g段发光二极管点亮,第二位显示“2”,同样原理,在第三位和第四位分别显示数字“7”“8”。

多位数码管的数字虽然是一位一位地显示出来的,但除了LED有余辉效应(断电后LED还能亮一定时间)外,人眼还具有视觉暂留特性(所谓视觉暂留特性是指当人眼看见一个物体后,如果物体消失,人眼还会觉得物体仍在原位置,这种感觉约保留0.04s的时间),当数码管显示到最后一位数字“8”时,人眼会感觉前面3位数字还在显示,故看起来好像是一下子显示“1278”4位数。

3.检测

检测多位LED数码管时可使用万用表的R×10k档。从图5-10所示的多位数码管内部发光二极管的连接方式可以看出,对于共阳极多位数码管,黑表笔接某一位极、红表笔依次接其他各极时,会出现8次小阻值;对于共阴极多位数码管,红表笔接某一位极、黑表笔依次接其他各极时,也会出现8次小阻值。其类型与公共极的判别,以及各段极的判别与单个数码管的判别方法基本相同,不再赘述。

5.2.2 单片机连接8位共阴极数码管的电路

图5-11是单片机连接8位共阴极数码管的电路,它将两个4位共阴极数码管的8个段极引脚在外部并联而拼成一个8位共阴极数码管,该8位共阴极数码管有8个段极引脚和8个位极引脚。

图5-11 单片机连接8位共阴极数码管的电路

单片机要采用P0端口8个引脚来驱动16个引脚的8位数码管显示字符,P0端口既要输出位码,又要输出段码,这需要使用分时输出功能。电路中采用了两个8路锁存器芯片74HC573,并配合单片机的P2.2端口(段锁存)和P2.3端口(位锁存)来实现分时输出驱动8位数码管。

图5-12为74HC573的功能表。从中可以看出,当(输出使能)端为低电平(L)、LE(锁存使能)端为高电平(H)时,Q端随D端变化而变化;当端为低电平、LE端也为低电平时,Q端输出不变化(输出状态被锁定)。在图5-11中,两个74HC573的端都接地固定为低电平(L),当LE端为高电平时,Q端状态与D端保持一致(即Q=D),一旦LE端为低电平时,Q端输出状态马上被锁定,D端变化时Q端保持不变。

图5-12 8路锁存芯片74HC573的功能表

5.2.3 8位数码管显示1个字符的程序与说明

图5-13是8位数码管显示1个字符的程序。程序执行时,8位数码管的最低位显示字符“2”。

图5-13 8位数码管显示1个字符的程序

该程序先让单片机从P0.7~P0.0引脚输出位码11111110(FEH)送到U2的8D~1D端,然后从P2.3端口输出高电平到U2的LE端,U2(锁存器74HC573)开通,输出端状态随输入端变化而变化,接着P2.3端口的高电平变成低电平,U2的LE端也为低电平,U2被封锁,8Q~1Q端的值11111110被锁定不变(此时D端变化,Q端不变),11111110送到8位共阴极数码管的位极,最低位数码管位极为低电平,等待显示;单片机再从P0.7~P0.0端口输出“2”的段码01011011(5BH)送到U1的8D~1D端,然后从P2.2端口输出高电平到U1(锁存器74HC573)的LE端,U1开通,输出端状态随输入端变化而变化,接着P2.2端口的高电平变成低电平,U1的LE端也为低电平,U1被封锁,8Q~1Q端的值01011011被锁定不变,01011011送到8位共阴极数码管的各个数码管的段极,由于只有最低位数码管的位极为低电平,故只有最低位数码管显示字符“2”。

5.2.4 8位数码管逐位显示8个字符的程序与说明

图5-14是8位数码管逐位显示8个字符的程序。程序运行时,8位数码管从最低位开始到最高位,逐位显示字符“0”“1”“2”“3”“4”“5”“6”“7”,并且不断循环显示。

该程序使单片机先从WMtable表格中选择第1个位码(i=0时),并从P0.7~P0.0端口输出位码至位码锁存器,位码从锁存器输出后到8位数码管的位引脚,选中第1位(该位引脚为高电平)使之处于待显状态,然后单片机从P2.3端口输出位码锁存信号至位锁存器,锁定其输出端位码不变,接着单片机从DMtable表格中选择第1个段码(i=0时),并从P0.7~P0.0端口输出段码至段码锁存器,段码从锁存器输出后到8位数码管的段引脚,已被位码选中的数码管第1位则显示出与段码相对应的字符,然后单片机从P2.2端口输出段码锁存信号至段锁存器,锁定其输出端段码不变,之后用i++语句将i值加1,程序再返回让单片机从WMtable、DMtable表格中选择第2个位码和第2个段码(i=1时),在8位数码管的第2位显示与段码对应的字符。当i增加到8时,8位数码管显示到最后一位,程序用i=0让i由8变为0,程序返回到前面后单片机又重新开始从WMtable、DMtable表格中选择第1个位码和段码,让8位数码管又从最低位开始显示,以后不断重复上述过程,结果可看到8位数码管从最低位到最高位逐位显示0~7,并且不断循环反复。

图5-14 8位数码管逐位显示8个字符的程序

5.2.5 8位数码管同时显示8个字符的程序与说明

图5-15是8位数码管同时显示8个字符的程序。程序执行时8位数码管同时显示字符“01234567”。

本程序与图5-14程序基本相同,仅是将Delay延时函数的输入参数t的值由60000改成100,这样显示一个字符后间隔很短时间就显示下一个字符,只要显示第一个字符到显示最后一个字符的时间不超过0.04s(人眼视觉暂留时间),人眼就会感觉这几个逐位显示的字符是同时显示出来的。

图5-15 8位数码管同时显示8个字符的程序

5.2.6 8位数码管动态显示8个以上字符的程序与说明

图5-16是8位数码管动态显示8个以上字符的程序。程序执行时,8位数码管动态依次显示“01234567”“12345678”“23456789”…“89AbCdEF”“01234567”…,并且不断循环显示。

图5-16 8位数码管动态显示8个以上字符的程序

程序先定义了两个表格:一个表格按顺序存放0~F的段码;另一表格按低位到高位的顺序存放8位数码管的各位位码。程序运行时,先显示第一屏字符“01234567”,第一次显示完后,i=8、j=8,第一个if语句执行让i=0,第二、三个if语句都不会执行,因为j不等于600,无法执行第二个if语句,又因为第三个if语句嵌在第二个if语句内,所以第三个if语句也不会执行,程序返回前面又执行显示“01234567”程序段,第二次显示完后,i=8、j=16,程序再返回前面执行显示“01234567”程序段,这种不断重复显示相同内容字符的过程称为刷新。当i=8、j=600时,第一、二个if语句都执行,第一个if语句让i=0,第二个if语句让j=0、num加1(由0变为1),第三个if语句还不会执行(因为num不等于9),程序返回前面,由于num+i变成了1+i,故从段码表格取第2个字符“1”,该字符又与位码表格最低位段码对应,故数码管显示“12345678”程序段,再不断刷新,直到第二次j=600,第二个if语句又执行,让j=0、num加1变成2,程序又回到前面显示“23456789”,如此反复工作,当num加1变成8时,8位数码管显示“89AbCdEF”,当num加1变成9时,第三个if语句执行,让num=0,程序返回到前面又重新开始使数码管显示“01234567”(因为num+i=i)。之后以上过程不断重复。