2.6 I/O口控制LED数码管应用实例
数码管在系统中的主要作用是显示单片机的输出数据、状态等,是单片机系统的一种主要输出装置,在本例中,采用ATmega128芯片4位数码管进行显示。
2.6.1 LED数码管基础知识
LED数码管(LED Segment Displays)由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔画、公共电极。常见的LED数码显示器件的实物外形如图2-12所示。
图2-12 LED数码显示器件实物外形
(1)LED数码管的结构 数码管是将若干发光二极管按一定图形组织在一起的显示器件。应用较多的是7段数码管,又名“半导体数码管”或“7段数码管”,内部还有1个小数点,又称为“8段数码管”,图2-13所示为LED数码管内部结构。由内部结构可知,可分为共阴极数码管和共阳极数码管两种。
图2-13 LED数码管内部结构
图2-13(b)所示为共阴数码管电路,8个LED(7段笔画和1个小数点)的负极连接在一起接地,译码电路按需给不同笔画的LED正极加上正电压,使其显示出相应数字,这种组合称为“字型码”。图2-13(c)所示为共阳数码管电路,8个LED(7段笔画和1个小数点)的正极连接在一起接地,译码电路按需给不同笔画的LED负极加上负电压,使其显示出相应数字。
LED数码管的7个笔段电极分别为0~9(有些资料中为大写字母),DP为小数点,如图2-13(a)所示。LED数码管的字型码如表2-11所示(表2-11中为十六进制数制)。
表2-11 LED数码管的字型码
注:B、D字型为小写b、d,以同数字8、0字型区别。
(2)多位数码管 有时为了方便使用,将多个数字字符封装在一起成为多位数码管,如图2-14所示,内部封装了多个数字字符的数码管就叫做“X位数码管”(X的数值等于数字字符的个数),常用的数码管为1~7位,LED数码管内部的LED连接方式也有共阴和共阳两种,如图2-15和图2-16所示。
图2-14 4位数码管实物图和示意图
图2-15 4位共阴数码管原理图
图2-16 4位共阳数码管原理图
对于单个数码管来说,从它的正面看进去,左下角那个脚为1脚,以逆时针方向依次为1~10脚,左上角那个脚便是10脚了,图2-15和图2-16中的数字分别与这10个引脚一一对应。3脚和8脚是连通的,这两个都是公共脚。
对于4位数码管,内部的4个数码管共用a~dp这8根数据线,使用方便,因为有4个数码管,所以它有4个公共端,加上a~dp,共有12个引脚,引脚排列依然是从左下角的那个脚(1脚)开始,以逆时针方向依次为1~12脚。
2.6.2 用单片机控制数码管
单片机在对数码管输出控制时,通常采用74LS48、CD4511(共阴极)或74LS46(74LS47)、CD4513(共阳极),也可用单片机I/O口直接输出字型码控制数码管的显示内容。
用单片机驱动LED数码管显示有很多方法,按显示方式可分为静态显示和动态显示。
(1)静态显示 静态显示是显示驱动电路具有输出锁存功能,单片机将所要显示的数据送出后,数码管始终显示该数据(不变),CPU不再控制LED。到下一次显示时,再传送一次新的显示数据。
静态显示的接口电路采用一个并行口接一个数码管的方式,数码管的公共端接共阴极或共阳极分别接地或接VCC,这种接法可使每个数码管都单独占用一个并行I/O口,以便单片机传送字型码到数码管控制数码管的显示。其缺点是当显示位数多时,占用I/O口过多。为了解决静态显示占用I/O口过多的问题,可采用串行接口扩展LED数码管的技术。
静态显示方式的优点是显示的数据稳定,无闪烁,占用CPU时间少。静态显示方式的缺点是由于数码管始终发光,功耗比较大。
(2)动态显示 动态扫描方法是用接口电路把所有数码管的8个笔画段a~g和dp同名端连在一起,而每一个数码管的公共极COM各自独立地受I/O线控制。CPU向字段输出口送出字型码时,所有数码管接收到相同的字型码。但究竟是哪个数码管点亮,则取决于COM端,COM端与单片机的I/O口相连接,由单片机输出位码到I/O控制端口,从而决定哪一位数码管亮。
动态扫描使用分时方法轮流控制各个数码管的COM端,使各个数码管轮流点亮。在轮流点亮数码管的扫描过程中,每位数码管的点亮时间极为短暂。但由于人的视觉暂留现象及发光二极管的余辉,给人的印象就是一组稳定的显示数据。
动态显示的优点:当显示位数较多时,采用动态显示方式比较节省I/O口,硬件电路也比静态显示简单。动态显示的缺点:稳定度不如静态显示方式,而且在显示位数较多时CPU要轮番扫描,占用较多的CPU时间。
2.6.3 硬件设计
如图2-17所示为ATmega128端口与两个4位数码管的连接图。本例中采用共阴型的数码管,显示方式采用动态扫描方式,并可配合按键控制输出的数据。电路图中,单片机PA端口通过两个锁存器573驱动两个数码管的段码控制端和位码控制端。
图2-17 数码管实例原理图
74HC573是一款高速CMOS器件,74HC573引脚兼容低功耗肖特基TTL(LSTTL)系列。74HC573包含8路D型透明锁存器,每个锁存器具有独立的D型输入,同时适用于面向总线应用的三态输出。所有锁存器共用一个锁存使能(LE)端和一个输出使能(OE)端,其逻辑原理图如图2-18所示。当LE为高时,数据从Dn输入到锁存器,在此条件下,锁存器进入透明模式,即锁存器的输出状态将会随着对应的D输入每次的变化而改变,当LE为低时,锁存器将D输入上的信息存储一段就绪时间,直到LE的下降沿来临。
图2-18 74HC573逻辑原理图
当OE为低时,8个锁存器的内容可被正常输出;当OE为高时,输入进入高阻态。OE端的操作不会影响锁存器的状态。
74HC573特性总结如下:
①输入输出分布在芯片封装的两侧,为微处理器提供简便的接口。
②用于微控制器和微型计算机的输入/输出口。
③三态正相驱动输出,用于面向总线的应用。
④共用三态输出使能端。
⑤使能输入有改善抗扰度的滞后作用。
74HC573的引脚说明表如表2-12所示,真值表如表2-13所示。
表2-12 74HC573的引脚说明表
表2-13 74HC573的真值表
注:×表示无须关注,Z表示高阻抗。
2.6.4 程序设计
本程序使用动态显示方法。首先,向选定的数码管位输出显示字型码,打开该位数码管控制端口,延时一定时间后,关闭控制端口。然后更换显示字型码,打开另一数码位的控制端口,延时一段时间后再关闭。如此循环,完成动态显示功能。
/**************************************************** / 功能:数码管显示。 时钟频率:系统时钟7.372MHz,设置熔丝位为外部高频石英晶体振荡,起止时间4.0ms。 编译环境:ICC-AVR6.31。 使用硬件:8位数码管。 结果:8位数码管显示0~7数字。 程序清单如下: //******************************************************** // 包含文件 //******************************************************** # include< string.h> # include< stdio.h> # include< iom128v.h> //******************************************************** // 定义变量区 //******************************************************** # define uchar unsigned char # define uint unsigned int # define Data_IO PORTA //数据口 # define Data_DDE DDRA //数据口方向寄存器 # define D_LE0 PORTD &= ~(1< < PD4) //数码管段控制位为 0 # define D_LE1 PORTD |= ~(1< < PD4) //数码管段控制位为 1 # define W_LE0 PORTD &= ~(1< < PD4) //数码管位控制位为 0 # define W_LE1 PORTD |= ~(1< < PD4) //数码管位控制位为 1 # define W0 0xfe //数码管各位单独选中时应送的位数据 # define W1 0xfd # define W2 0xfb # define W3 0xf7 # define W4 0xef # define W5 0xdf # define W6 0xbf # define W7 0x7f //******************************************************** // 共阴数码管显示的数码表 //******************************************************** uchar table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; //******************************************************** // I/O端口初始化 //******************************************************** void System Init() { Data_IO= 0xFF; //数据口为输出 Data_DDE= 0xDD; PORTD= 0xFF; //74HC573的控制口,设置为输出 DDRD= 0xFF; PORTB= 0xFF; //关闭发光二极管 } //******************************************************** // 74HC573控制数码管动态扫描 //******************************************************** viod write_LED() { uchar i,j; j= 0x01; //此数据用来控制位选 for(i= 0;i> 0;i+ + ) { D_LE1; //控制数码管段数据的 74HC573的 LE引脚置高 W_LE1; //控制数码管位的 74HC573的 LE引脚置高 Data_IO= - j //设置要显示的位,也就是哪一个数码管亮 W_LE0; //锁存位数据,下面送上段数据以后,就显示出来了 j= (j< < 1); Data_IO= table[i]; //送要显示的数据,就是段数据,如显示 0送的是 0x3f D-LE0; //锁存段数据,数码管亮一个时间片刻 Delay-nms(1); //显示一个时间片刻,会影响亮度和闪烁性 } } //******************************************************** // 主程序 //******************************************************** viod main(void) { System_Init(); //初始化 while(1) { Write_LED(); //调用函数,显示 } }
8段数码从电路原理上分为共阴、共阳两类,在硬件电路设计时,也应该加以区分,分别设计驱动电路。数码管的显示分为静态和动态两种方式,其中静态显示占用单片面的CPU处理的时间少,显示数据单一,但其硬件连接需要锁存器,连接复杂。动态显示需要CPU随时对数据进行刷新,显示灵敏具有闪烁感,但连接硬件少,能节省成本和平电路板空间。