AVR单片机很简单:C语言快速入门及开发实例
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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随时对数据进行刷新,显示灵敏具有闪烁感,但连接硬件少,能节省成本和平电路板空间。