13.2.1 LED数码显示与应用编程
1.LED数码管显示原理
LED数码管是显示数字和字母等数据的重要显示器件之一,其显示原理是通过点亮内部的发光二极管LED,点亮相应的字段组合从而实现相应数字和字母的显示。常用的数码管有一位数码管、两位数码管、三位数码管和四位数码管,数码管的右下角有些带小数点有些不带小数点,有些可能带有冒号“:”用于时钟的显示,还有“米”字数码管等,其实物图如图13-1所示。LED数码管的显示颜色红色居多,也有绿色、蓝色等产品,可以根据需要选用。
图13-1  各种常用LED数码管实物图
一位LED数码管里面共有8个的LED,每个LED称为一字段,其中显示一个8字需要a、b、c、d、e、f、g共7段,显示小数点dp需要1段,还有一个公共端com,同时连接第3和第8引脚,所以一位数码管封装一共是10个引脚。其引脚分布如图13-2(a)所示。根据LED的公共端是阳极或阴极公共连在一起又分为共阳极数码管和共阴极数码管,共阴极数码管内部原理图如图13-2(b)所示,共阳极数码管内部原理图如图13-2(c)所示。
(a)一位数码管引脚分布  (b)共阴极内部原理  (c)共阳极内部原理
图13-2  一位数码管引脚分布及内部原理
共阳极数码管内部8个发光二极管的阳极全部连接在一起作为公共端com,硬件电路设计时接高电平,阴极接低电平则相应的发光二极管点亮。类似地,共阴极数码管内部8个发光二极管的阴极全部连接在一起作为公共端com,硬件电路设计时接低电平,阳极接高电平则相应的发光二极管点亮。
数码管限流电阻的连接方式:在应用数码管进行显示时,首先需要考虑的问题就是驱动电流,与发光二极管相同,数码管的发光段也需要串联限流电阻。以共阳极数码管为例,串联的限流电阻
阻值越大,电流越小,亮度越低;电阻值越小,电流越大,亮度越高。在使用限流电阻时需要在每一个段线上都串联限流电阻,而不要在公共端上串联电阻,如果只在公共端上串联一个限流电阻,则在显示不同的数字时,将会造成数码管亮度的不均匀。
如果要显示数字则需要同时点亮相应的字段,也就是要给0~9这十个数字编码,具体的编码根据共阳极和共阳极数码管的不同,点亮LED高低电平是相反的,跟硬件的连接也是息息相关的,一般情况是按顺序从高位到低位或者从低位到高位进行编码,有时也会根据硬件连接的需要按任意顺序进行编码。
共阴极数码管按顺序从高位到低位进行编码显示代码如表13-1所示。
表13-1  从高位到低位编码
数据位 字段 0 1 2 3 4 5 6 7 8 9 D7 dp 0 / 1 0 / 1 0 / 1 0 / 1 0 / 1 0 / 1 0 / 1 0 / 1 0 / 1 0 / 1 D6 g 0 0 1 1 1 1 1 0 1 1 D5 f 1 0 0 0 1 1 1 0 1 1 D4 e 1 0 1 0 0 0 1 0 1 0 D3 d 1 0 1 1 0 1 1 0 1 1 D2 c 1 1 0 1 1 1 1 1 1 1 D1 b 1 1 1 1 1 0 0 1 1 1 D0 a 1 0 1 1 0 1 1 1 1 1 共阴极编码 不带小数点 /带小数点 0x3F / 0xBF 0x06 / 0x86 0x5B / 0xDB 0x4F / 0xCF 0x66 / 0xE6 0x6D / 0xED 0x7D / 0xFD 0x07 / 0x87 0x7F / 0xFF 0x6F / 0xEF
共阳极数码管按顺序从高位到低位进行编码显示代码如表13-2所示。
表13-2  从高位到低位编码
数据位 字段 0 1 2 3 4 5 6 7 D7 dp 1 / 0 1 / 0 1 / 0 1 / 0 1 / 0 1 / 0 1 / 0 1 / 0 D6 g 1 1 0 0 0 0 0 1 D5 f 0 1 1 1 0 0 0 1 D4 e 0 1 0 1 1 1 0 1 D3 d 0 1 0 0 1 0 0 1 D2 c 0 0 1 0 0 0 0 0 D1 b 0 0 0 0 0 1 1 0 D0 a 0 1 0 0 1 0 0 0 共阳极编码 不带小数点 /带小数点 0xC0 / 0x40 0xF9 / 0x79 0xA4 / 0x24 0xB0 / 0x30 0x99 / 0x19 0x92 / 0x12 0x82 / 0x02 0xF8 / 0x78 8 9 1 / 0 1 / 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0x80 / 0x00 0x90 / 0x10
共阴极数码管根据硬件连接的需要按任意顺序进行编码显示代码如表13-3所示。特别注意,数据位和字段的连接关系是由硬件决定的。
表13-3  任意顺序编码
数据位 字段 0 1 2 … D7 g 0 0 1 … D6 f 1 0 0 … D5 dp 0 / 1 0 / 1 0 / 1 … D4 c 1 1 0 … D3 b 1 1 1 … D2 a 1 0 1 … D1 e 1 0 1 … D0 d 1 0 1 … 共阴极编码 不带小数点 /带小数点 0x5F / 0x7F 0x18 / 0x38 0x8F / 0xAF …
从不同的硬件连接对应不同的显示代码可以看出,根据硬件电路设计的需要有多种不同的编码,但原理都是一样的,一般在常规应用中按从高位到低位编码更具通用性和移植性。
除了一位数码管,两位一体、三位一体和四位一体的数码管有可能是实际应用中用得更多的显示器件。多位一体数码管,其内部每一位对应一个公共端com,从而控制相应的数码管是否显示,通常把公共端称为“位选线”;而a、b、c、d、e、f、g、dp对应的段线则每位全部连接在一起,从而控制点亮数码管显示什么数字,通常把这个连接在一起的段线称为“段选线”。单片机及外围电路通过控制位选和段选就可以控制任意的数码管显示任意的数字。三位一体共阳数码管内部原理图如图13-3所示。
图13-3  三位共阳数码管内部原理图
单片机控制LED数码管的显示主要有以硬件资源为主的静态显示和以软件为主的动态扫描显示2种方式;此时传输数据用的是并行数据传输,有时候为了节省单片机I/O口线,需要将串行数据转换成并行数据;同时还有一些专门用于LED数码管显示和按键的芯片。下面将分别介绍。 2.数码管静态显示
静态显示是指数码管显示某一字符时,相应的发光二极管恒定导通或截止。工作时每位数码管相互,共阴极数码管所有公共端恒定接地,共阳极数码管所有公共端恒定接正电源;每个数码管的8个字段分别与一个8位I/O端口地址相连,I/O端口只要有段码输出,相应的字符即显示出来,并保持不变,直到I/O端口输出新的段码。如图13-4所示是三位共阳数码管的静态显示原理图,特别注意,静态显示的每位数码管必须由的一位数码管来充当,而不能使用多位一体的数码管来实现显示。采用静态显示方式,较小的电流即可获得较高的亮度,所以同等显示环境下限流电阻要比动态扫描显示的取值大;各位数码管同时显示不需要扫描所以占用CPU时间少,编程简单,显示便于监测和控制,但这些优点是以牺牲硬件资源来实现的,所以占用单片机I/O口线多,硬件电路
复杂,成本高,只适合显示位数较少的场合,一般情况下不超过三位数码管,实际应用中不常用。
图13-4  三位共阳数码管静态显示原理图
3.数码管动态显示
动态扫描显示是指轮流向各位数码管送出显示字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,只要每位显示的间隔足够短,就会让人感觉每位数码管在同时显示的效果,而实际上每位数码管是一位一位轮流显示的,只是轮流的速度非常快,人眼已经无法分辨出来。如图13-5所示是四位一体共阳数码管的动态扫描显示原理图。
图13-5  四位数码管动态扫描显示原理图
为了更好地理解,对LED数码管动态扫描显示原理进行慢动作分解:
打开第1位数码管,关闭其它位数码管,指定第1位数码管的显示数据;延时一点时间; 打开第2位数码管,关闭其它位数码管,指定第2位数码管的显示数据;延时一点时间; ......
打开第n位数码管,关闭其它位数码管,指定第n位数码管的显示数据;延时一点时间; 依此循环。
从慢动作分解看到的显示效果是第1位数码管显示相应的数字一点时间,然后熄灭,第2位数码管显示相应的数字一点时间,然后熄灭,一直到第n位数码管显示相应的数字一点时间,然后熄灭;依此循环。只要延时的时间足够小,所有数码管就可以稳定地同时显示了。
采用动态扫描显示方式比较节省单片机的I/O端口,硬件电路也较静态显示方式简单,但其亮度不如静态显示方式,而且在显示位数较多时,单片机要依次扫描,占用单片机较多的时间。
工作于动态扫描显示方式的数码管,需要通过增大扫描时的驱动电流来提高数码管的显示亮度。一般情况下采用三极管分立元件或专用的驱动芯片(如ULN2003等)作为位选驱动,采用74LS244或74LS573作为段选锁存及驱动,当然STC单片机I/O端口具有较强的驱动能力,特别是对低电平的拉低能力,也可以直接驱动LED数码管。 4.串行数据转并行数据
从图13-4数码管静态显示电路可以看出,占用单片机硬件资源的24个I/O端口用于显示数据;从图13-5四位数码管动态显示电路可以看出,占用单片机硬件资源的8个I/O端口用于输出段码,4个I/O端口用于输出位控制码,共12个I/O端口用于数码管显示数据。对于一些稍微复杂的单片机系统中I/O端口资源可能不够用,这时候就需要使用串行数据转并行数据芯片,从而大大降低占用单片机I/O端口。常用串行数据转并行数据芯片有74HC595、74LS1、CD4094等。
如图13-6所示是74HC595串行数据转并行数据三位数码管静态显示电路的典型应用原理图,只需占用单片机I/O端口3个,就可以实现三位数码管的静态显示。
图13-6  串行数据转并行数据静态显示原理图
如图13-7所示是74HC1串行数据转并行数据四位数码管动态显示电路的典型应用原理图,段选和位选都可以加入串行数据转并行数据芯片,这样就大大减少占用的单片机I/O端口。
图13-7  串行数据转并行数据动态显示原理图
静态显示和动态扫描显示、串行数据和并行数据相互组合应用,就衍生出4种不同的显示电路,分别是并行数据静态显示、并行数据动态扫描显示、串行数据静态显示、串行数据动态扫描显示。其中静态显示电路在工程中实际应用比较少,而动态扫描显示是否需要串行数据转并行数据可以根据实际需求选用。
熟练掌握并行数据动态显示和串行数据动态显示,实验板数码管显示电路就是串行数据动态显示。
编写程序实现以下效果:
1.编写程序实现3位共阳数码管并行数据静态显示(演示)
{0x82,0xfa,0x46,0x62,0x3a,0x23,0x03,0xf2,0x02,0x22};//不带小数点数字编码0-9 {0x80,0xf8,0x44,0x60,0x38,0x21,0x01,0xf0,0x00,0x20};//带小数点数字编码0-9 P1=0xfa; P2=0x46; P3=0x62;
2.编写程序实现3位共阳数码管串行数据静态显示(演示)
3.编写程序实现3位共阳数码管并行数据动态显示(演示) 思路:
打开第1位,关闭2、3位,给显示数据,延时一点时间; 打开第2位,关闭1、3位,给显示数据,延时一点时间; 打开第3位,关闭1、2位,给显示数据,延时一点时间; 循环
{0x28,0xee,0x32,0xa2,0xe4,0xa1,0x21,0xea,0x20,0xa0};//不带小数点数字编码0-9 {0x08,0xce,0x12,0x82,0xc4,0x81,0x01,0xca,0x00,0x80};//带小数点数字编码0-9
4. 编写程序实现8位共阳数码管串行数据动态显示(熟练掌握编程应用)
①{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//不带小数点数字编码0-9  {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//带小数点数字编码0-9 {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff};//开0-7中其中一位,全关 //74LS1子程序
void Write1(unsigned char ddata) {
unsigned char i;  for(i=0;i<8;i++)    {
d=ddata&0x80; //取出最高位    clk=0;    clk=1;
ddata<<=1; //左移    }  }
②//数码管显示子程序
void Display(unsigned char n,unsigned char num)//n为显示位置,取值0-7 {            //num为显示数字,取值0-9  LED=addr[8];Delay(20);//消除重影  Write1(tab[num]);//显示数据  LED=addr[n];//打开一位数码管  Delay(delay_time);   //延时 }
主程序
Display(0,3);//指定显示位置,指定显示内容
③定义一个变量i,取值范围0-9,任意一位数码管显示,i+1,延时一定时间,循环显示。编写程序实现效果。
④定义一个变量i,取值范围00-99,任意两位数码管显示,i+1,延时一定时间,循环显示。编写程序实现效果。
⑤定义一个变量i,取值范围000-999,任意三位数码管显示,i+1,延时一定时间,循环显示。编写程序实现效果。
⑥以此类推,分别实现,四五六位显示,编写程序实现效果。
⑦定义一个变量i,初始值为50,取值范围00-99,任意两位数码管显示 定义2个按键,左边按键按下,i+1并显示,右边按键按下,i-1并显示 当按+直到最大值99时再继续按,回到00继续+1显示 当按-直到最小值00时再继续按-,回到99继续-1显示
编写程序实现效果。
⑧定义一个变量i,初始值为50,取值范围00-99,任意两位数码管显示 当按+直到最大值99时再继续按+,只显示99,但开启蜂鸣器报警一声。 当按-直到最小值00时再继续按-,只显示00,但开启蜂鸣器报警一声。 编写程序实现效果。
⑨定义3个变量a,b,c,初始值分别为20,50,80,b取值范围00-99, 左边两位数码管显示a;中间两位数码管显示b;右边两位数码管显示c; AN16和AN17可对b进行+1和-1设置 当ac时,LED14和LED15亮;