视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
单片机显示技术-数码管
2025-09-29 18:27:07 责编:小OO
文档
单片机的显示技术-数码管

一、任务书:

二、基础知识:在各种电子仪器或装置中显示部分属于人机对话部分,也是电子装置设计技术内容之一,常用的显示装置有发光二极管、数码管、液晶显示器等。一般在不需要显示字母或汉字的场合经常使用数码管作为显示原件。数码管显示的优点是技术较简单、硬件成本低和显示效果好(主要指亮度)。

数码管的显示原理:

常用的数码管为7段(7个笔画)或8段(7个笔画加一个小数点)。一个显示笔画均是一个或多个(较大的数码管,但仍为一个显示单元,需要的驱动能力不相同)LED作为发光原件。

数码管的分类:

按尺寸大小分(以一位数码管为例):

  字高

框高LED数

字高框高LED数

英寸mmmm英寸mmmm
0.28710110.410.1618.711
0.37.819110.431118.811
0.32811110.512.71911
0.369.114110.5213.217.511
0.399.913110.5614.21911
字高框高LED数

字高框高LED数

英寸mmmm英寸mmmm
0.61525111.8455631
0.820.3227.711250.85442
125.433212.356.869.742
1.230.640.821375.611062
1.538.144214101.612262
注意:一般体积较大的数码管的一个段可能不是一个LED构成,而且组成一个字符段与小数点的LED数也不尽相同。以某公司产品红色数码管为例确定段电压时可采用1.2-1.5*LED数为工作电压。如4英寸的一个段的工作电压约为1.2-1.5*6=7-9V。各公司数码管内一段的LED数不尽相同。所以当不能确定时可以通过查阅生产企业的技术资料或通过试验得到合理的工作电压。

按内部接线分:共阴极、共阳极;

按颜色分:发光原件(LED)分为红色、高亮红、黄绿色、黄色、蓝色等。以红色较常见。

按字符内容分:8字型、米字型和专用数码管等。但无论外表怎样改变其发光机理是相同的,只是改变发光单元的形状和位置而形成不同的产品。当你的需要特殊而且用量较大时也可以专门定做你所要的产品,但成本较高。

按组合方式分:分一位、两位、三位、四位。

数码管的检测:其一是判断是共阴极还是共阳极,其二是判断一位数码管的各断是否良好。

以一位数码管为例:判断共阴极还是共阳极的简单办法是用万用表的档位,红表头接触数码管的公共极,黑表头接触另外任何一个段的引脚,该段亮则说明这个数码管是共阳极。如果不亮,然后将红黑表头换位该段亮则说明该数码管是共阴极。判断各段是否正常的办法与判断共阴极和共阳极的办法相同,将公共端确定后用红(黑)表笔轮流接触所有的段的引脚各段均亮说明正常,哪个段不亮说明哪个段不正常。但此方法只能检验较小的数码管,尺寸较大的数码管的一个段可能不是一个LED时万用表的就不能用来点亮数码管的段,此时需要使用稳压电源并调到合适的电压进行检验,所谓合适的电压就是从小调节输出电压使数码管的段的亮度达到最大值然后再调小的最大值电压的大约80-90%即可。注意:在最亮的时间一定要短,否则可能烧坏数码管。为了保险起见可让LED的亮度相对较低,即用亮度换寿命。

(1)、数码管的种类及其引脚

注意:LED公共端一般为3、8,1、5,1、8等。不要认为LED引脚排列都完全相同。

1、一位七段数码管引脚图:

数码管使用条件(仅使用与各段均为一个LED的数码管):

a、段及小数点上加限流电阻(注意:由于体积较大的数码管的段和小数点的LED数量不相同。因此,所需要加的限流电阻的阻值也不相同)

b、使用电压:段:根据发光颜色决定; 小数点:根据发光颜色决定

c、使用电流:静态:总电流 80mA(每段 10mA);动态:平均电流 4-5mA 峰值电流 100mA

数码管使用注意事项说明:

(1)数码管表面不要用手触摸,不要用手去弄引角;

(2)焊接温度:260度;焊接时间:5S

(3)表面有保护膜的产品,可以在使用前撕下来。

2、四位七段数码管:

  内部第四个数码管共用a-dp,

(2)、数码管静态显示方式

    数码管静态显示方式是当LED数码管显示器显示某个字符时,相应的段(发光二极管)恒定地导通或截止,直到显示另一个字符为止。

LED数码管显示器工作于静态显示方式时,若为共阴数码管,各位的共阴极接地;若为共阳极数码管,则接正电压,电压根据LED数码管的具体要求定。每位的段选线分别与一个8位锁存器的输出口相连,显示器中的各位相互,而且各位的显示字符一经确定,相应锁存的输出将维持不变。正因为如此,静态显示器的亮度较高。这种显示方式编程容易,管理也较简单。

静态显示典型方案:

图1:静态显示典型应用方案

方案描述:下面分别对数码管的字段控制和数码管的位(com)连接方法进行描述。

数码管的字段控制常用的方法有编码器输出方式(如CD4511)、串行口输出方式、单片机通用I/O接口输出方式。当显示状态为静态显示方式时,在数据输出后的一段时间内显示状态不会发生变化,在此应当采用锁存器将状态保持住,直到显示状态发生改变为止。例如CD4511就是带有锁存器的编码器。为了能让数码管保持一定的亮度,一般的I/O口或锁存器不能达到预定的要求,所以在此应当加上字段的驱动电路。驱动电路可以采用专用的集成电路或是功率三极管。

数码管的位连接常用方法:对于共阳数码管接正电源,对于共阴的数码管接地。如果是多位数码管显示方式,字段控制采用的是串口输出字段码方式,为了防止闪烁,在数码管的公共极采用开关控制方式。当字段码输出时,暂时中断数码管公共端的开关,当数据发送完成以后,由于锁存器保存数码管字段信息,这时关闭数码管公共极开关,数码管开始接通,并显示字段信息。

    (3)、数码管动态显示方式

在多位LED数码管显示器显示时,为了简化电路,降低成本,将所有位的段选线并联在一起,由一个8位I/O口控制。而共阴(或共阳)极公共端分别由相应的I/O线控制,实现各位的分时选通方法。这就构成了动态显示方式。

段选码、位选码每送入一次后延时1ms,因人眼的视觉暂留时间为0.1s(100ms),所以每位显示的间隔不能超过20ms,并保持延时一段时间,以造成视觉暂留效果,给人看上去每个数码管总在亮。

动态显示典型方案:

图2:动态显示典型应用方案

方案描述:下面分别对数码管的字段控制和数码管的位(com)扫描方法进行描述。

数码管的字段控制常用方法有编码器方式和I/O控制方式。在动态扫描显方式下,由于每一位数码管供电的时间是比较短(1mm)的,为了让数码管达到预期的显示亮度,在此对字段的驱动要求在功率和效率上比较静态显示时都要高。一般采用大功率三极管(TIP127、8050或专用集成电路(ULN2003)进行驱动。

数码管的位扫描常用串口扫描、I/O扫描或是74ls138编码器扫描方法。在以后的实验中,我们会有实例进行说明。用805027、)_______________________________________________________________________________________________________________________

    (4)、LED数码管显示驱动技术

仅依靠单片机I/O口的驱动能力是不能够驱动数码管正常工作的。因此,需要选择的驱动原件设计出合适的驱动电路使得数码管正常工作,对于静态显示方式和动态显示方式,驱动方法有明显的不同。

静态显示方式的驱动,由于数码管的公共极接地或接正电压,所以只考虑段的驱动就可以。对于动态显示方式,由于一位数据的显示是由段和位选信号共同配合完成的,因此必须同时考虑段和位的驱动能力,而且段的驱动能力决定位的驱动能力。

段的驱动能力是由显示器的亮度决定的,通过发光二极管的电流越大,其亮度也越高。对于静态显示器,当某位点亮时,此位中点亮的段通过恒定电流,而对于动态显示器,此电流却是以一定脉冲方式出现的,其峰值电流不能真实地反映二极管的发光亮度,而必须以与脉冲占空比有关的平均值电流来考虑。

理论上分析表明,同样的驱动器,当其驱动静态显示器时,其亮度为驱动动态显示器的N倍,N近似为显示位数。所以要使动态显示器达到静态显示器的亮度,必须将驱动器的驱动能力提高N倍。

段的驱动能力确定之后,位的驱动能力也随之确定。当然必须考虑极端的情况,即位中各段均点亮,则位的驱动电流为各段驱动电流之和,此电流应为峰值电流。

二、相关知识

    、NPN三极管8050

    T8050是一个NPN的电路,应用于音频驱动和转换电路。在本教材中,应用于大功率电流驱动开关电路。其相关参数如下:

、温度范围:-55℃ ~ 125℃

、Vcbo – 发射极到基极电压  --------30V

、Vceo – 发射极到集电极电流--------25V

、Vebo – 集电极到基集电流 ----------6V

、Ic – 发射极电流 -----------------------1.5A

做为开关使用,在此关心的参数有温度、Vceo和Ic是否能达到设计要求就可以。

、3-8译码器74ls138,74ls238

74ls138和74ls238做为3线-8线译码器,在使能允许的条件下,可将地址端(A0、A1、A2)的二进制编码在一个对应的输出端以低电平(74ls138)或高电平(74ls238)译出。

    、3-8译码器管脚说明

图3:3-8译码器的逻辑图

    表1:管脚定义表

管脚符号功能
1、2、3

A0、A1、A2

地址输入
4、5

/E1、/E2

使能输入(低电平使能)
6E3

使能输入(高电平使能)
8GND
15、14、13、12、11、10、9、7

Y0、Y1、Y2、Y3、

Y4、Y5、Y6、Y7、

译码输出(74ls138低有效,74ls238高有效)

16电源
    、3-8解码器的真值表

    表2:74ls238使用真值表    

INPUTOUTPUT
/E1

/E2

E3

A0

A1

A2

Y0

Y1

Y2

Y3

Y4

Y5

Y6

Y7

HXXXXXLLLLLLLL
XHXXXXLLLLLLLL
XXLXXXLLLLLLLL
LLHLLLHLLLLLLL
LLHHLLLH
LLHLHLLH
LLHHHLLH
LLHLLHLH
LLHHLHLH
LLHLHHLH
LLHHHHLH
    表3:74ls138使用真值表

INPUTOUTPUT
/E1

/E2

E3

A0

A1

A2

Y0

Y1

Y2

Y3

Y4

Y5

Y6

Y7

HXXXXXLLLLLLLL
XHXXXXLLLLLLLL
XXLXXXLLLLLLLL
LLHLLLLHHHHHHH
LLHHLLHL
LLHLHLHL
LLHHHLHL
LLHLLHHL
LLHHLHHL
LLHLHHHL
LLHHHHHL
表1和表2分别描述了74LS238和74LS138的管脚控制、输出信息以及输出信息的真值表。对于74LS238和74LS138的区别只在输出时的差别,其它参数是一致的。

、其它译码器

、2-4译码器 74ls139,两位地址,四位输出。控制真值表如下:

、4-16译码器 74ls154,四位地址,十六位输出。控制真值表如下:

、译码器扩展方法

、字段编码器CD4511

CD4511做为一个段码专用集成电路,集成驱动、锁存和编码功能。将一组8421BCD码编辑成通用的七段码通过高电平输出。在电路应用中,只需将共阴极数码管的对应管脚连接到CD4511上就可以了。

图4 CD4511管脚定义和数码管标识定义图

        表4:CD4511使用真值表

INPUTOUTPUT
LE/BI/LTDCBAabcdefgdisplay
XX0XXXX1111111B
X01XXXX0000000
011000011111100
011000101100001
011001011011012
011001111110013
011010001100114
011010110110115
011011000111116
011011111100007
011100011111118
011100111100119
、大电流驱动集成电路ULN2003A(ULN2800系列)

ULN2003A电路是美国Texas Instruments公司和Sprague公司开发的高压、大电流达林顿晶体管阵列电路,由7组达林顿晶体管阵列和相应的电阻网络以及钳位二极管网络构成,具有同时驱动7组负载的能力,为单片双极型大功率高速集成电路,发射极电流可以达到0.5A,输出电压可以达到50V,具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统。

ULN2800系列可以驱动8组负载,电路结构和ULN2003A类似。林511BCD2----------------________________________________________________________________________________________________________

图5 ULN2003A结构图

(5)、总线驱动集成电路74LS244

74LS244是一个集成缓冲、驱动于一体的集成电路,可应用于时钟驱动、地址驱动、PC机板的总线收发总线。

、管脚图和真值表

注:L — 低电平,H — 高电平,X – 不重要,可以是高电平,也可以是低电平,Z – 高阻状态

    

、主要电气参数

符号说明最小值典型值最大值单位
Vcc工作电压4.755.05.25V
Ta工作温度02570
IoH

输出电流-高电平

-15mA
IoL

输出电流-低电平

24mA
IoH、IoL图例说明

    (6)、移位寄存器74HC595

74HC595具有8位串入并出的移位寄存器和一个8位输出锁存器,而且移位寄存器和输出锁存器的控制是各自的,可以实现在输出的同时,传送下一组移位数据,而不影响以前的输出状态。

    、管脚图和真值表

74HC595管脚图

表:74HC595真值表

输入功能
SERSRCLK/SRCLR

RCLKOE
XXXXH禁止QA~QH 输出

XXXXL允许QA~QH 输出

XXLXX移位寄存器清零
LHXX移位寄存器的第一位变底,其它位和锁存器的输出保持不变。
HHXX移位寄存器的第一位变高,其它位和锁存器的输出保持不变。
XHXX不改变移位寄存器数据状态
XXXX移位寄存器数据放入锁存器中
XXXX不改变锁存器输出状态
    、主要电气参数

工作电压:4.75V~5.25V;

输出电流:70mA;

工作温度:0℃~70℃。

、大功率驱动三极管TIP42C

    、封装和引脚说明

    、主要电气参数

        、温度范围:-55℃ ~ 125℃

、Vcbo – 发射极到基极电压  --------100V

、Vceo – 发射极到集电极电流--------100Vv

、Vebo – 集电极到基集电流 ----------5V

、Ic – 发射极电流 -----------------------6A

三、实验目的

    掌握单片机多位LED数码管静态、动态显示方法和驱动应用。

四、实现功能

、通过两个BCD转7段编码器芯片(CD4511)分别驱动两位共阴极数码管,实现静态的显示方式。P1.0~P1.3、P1.4~P1.7分别为两个CD4511输出数据的BCD码,通过按键提示改变数码管显示数据。

、通过两个串转并数据移位芯片(74LS1),分别驱动两位共阳数码管实现静态显示方式。显示数据通过串口发送给两个74ls1,通过按键提示,改变数码管显示数据。

、用P1口做为LED数码管段码输出,集成电路74LS244做为段码输出的驱动电路;P2.0~P2.2驱动74ls238做为多位数码管的位选控制芯片,驱动四位数码管动态扫描显示数据,通过按键方式改变显示数据。

、通过P2口驱动七个功率三极管8050,做为段码输出的驱动电路,串口输出移位信号做为位选控制信号,驱动两片串转并芯片(74ls1),ULN2003做为位选的驱动电路。在这里每片ULN2003任选两两位做为两个数码管的驱动位,一共四位数码管。通过按键输入信号,改变数码管的显示数据。 

五、实验(一)

    、实验说明(实验的描述)

在一些项目中,为了节约单片机I/O和程序资源的开支,单片机系统采用数码管静态显示方式。单片机只需向I/O口输出显示数据的BCD码,显示部分经过锁存器将数据的显示方式保持在一定的状态下,单片机就可以进行其它工作,而无需处理显示功能,除非是更换显示数据。

图1:方案设计图

在这个实验中采用CD4511是因为这个芯片是一个BCD码转段码的专用芯片,将四位的BCD码转换并输出标准的段码信息,给共阴数码管做为显示数据,另外片内集成了锁存器和驱动器(详细参数请参照附件中的CD4511说明)。这不仅节约了程序的数码管段信息的编写,也节约的I/O口的资源,是一个比较理想的静态显示应用芯片,CD4511的具体使用方法,可根据其真值表进行操件。

实验一电路中,按键电路做为信息输入,两位静态显示的数码管做为数据的显示器。当上电时,单片机初始化,显示数据为0,当有单片机检测到按键信号时,显示器的数据进行更换,显示方式是从0到99依次递增显示,当显示到99时,如果再有一次按键,则显示为0,依次类推进行循环显示。

在数码管显示排列中,U7数码管显示数据的个位信息,U10显示数据的十位信息。行换451111电路,)____________________________________________________________________________________________________________________

    、实验工具

        硬件:电脑、电源DC5V、仿真器、烧写器、演示板、示波器

        软件:Keil51编译器,Protel99SE、仿真器软件、烧写器软件

    、元器件列表

名称规格数量名称规格数量
瓷片电容1041电阻10K2
33PF230014
电解电容100UF/16V1复位开关四脚1
10UF/16VCD4511DIP2
发光二极管红,Φ5

1C51

DIP1
电源座1数码管共阴,0.8

2
电阻2K1晶振12M,直插

1
    

、原理图

原理图说明:实验一原理图是为实现单片机通过BCD码转段码芯片实现数码管静态显示功能而设计的。采用DC5V供电,发光二极管D2做为电源指示,R3做为D2的限流分压电阻,电容C3和电解电容C7做为电源滤波电容,电阻R2和按键S1组成按键电路,信号由P3.2输入,电容C8、电容C9和晶振Y2组成单片机外围晶振电路,电容C10和电容R6组成单片机的复位电路,CD4511(U6、U9)和数码管(U7、U10)以及限流电阻组成静态显示电路,数码管公共极共阴极接地,P1.0~P1.3向CD4511(U6)输出BCD码,P1.4~P1.7向CD4511(U9)输出BCD码。

图3:实验一原理图

    、软件流程图

流程1:实验一程序流程图

    、源程序代码(汇编)

;方案选用P1.0~P1.3和P1.4~P1.7分别做为两个CD4511的BCD码输入口,每一个CD4511驱动一个共阴的数码

;管做为静态显示。

;P3.2做为按键输入端,每次按键,程序处理显示由0~99之间循环进行显示,P1.0~P1.3和P1.4~P1.7分别输出低

;位和高位数据。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

FLAG0    BIT    20.0            ;定义一位识别标志位

FLAG1     BIT    20.1

FALG2   BIT    20.2

DISPLAY    EQU    21H            ;定义一个专用作显示的寄存器

DISPLAYTEMP    EQU 22H

    ORG    0000H            ;主程序入口

START:  AJMP   MAIN    

    

MAIN:                               

                    ;初始化程序,显示数据为00    

    MOV    A,#0

    MOV    DISPLAY,A        ;初始化显示寄存器为0

    MOV    DISPLAYTEMP,A

    MOV    P1,A            ;将0输出给CD4511,显示数据为0

                    ;检测是否有按键,如果有按键,将显示寄存器的数据变换成BCD码输出。    

MAIN_LOOP1:    

    SETB    K1            ;查看是否有按键

    JB    K1,MAIN_LOOP1    

    ACALL    DELAY12ms        ;延时12ms,防抖动

    JB    K1,MAIN_LOOP1        ;再看是否为低电平,如果是则确认为按键,如果不是,则确认不是按键

                    ;是按键    ,则变换数据进行显示

    INC    DISPLAYTEMP

    MOV    A,DISPLAYTEMP

    INC    DISPLAY,A        ;显示数据加1

    MOV    A,#0

    MOV    R0,A            ;用R0存十位数。

    MOV    A,DISPLAY

DISP_GET:

    CJNE    A,#10,DISP_OPER

DISP_OPER:    

    JC    CY,DISP_OUT        ;如果处理后的数据A小于10,则为个位数,送显

    SUBB    A,#10            ;如果大于10,则再减,直到小于10为止

    INC    R0            ;取十位数

    AJMP    DISP_GET

DISP_OUT:                ;R0存十位数,A存个位数

    MOV    DISPLAY,A        ;将个位数存入显示寄存器中

    MOV    A,R0

    CLR    C            ;清除C寄存器

    RLC    A            ;将A数据向左移4位,到高位显示区,低四位为0

    RLC    A

    RLC    A

    RLC    A

    ORL    A,DISPLAY        ;整合高位和低位显示数据

    MOV    P1,A            ;通过P1口送出BCD码,给CD4511

    AJMP    MAIN

DELAY12ms: 

    MOV    R1,#0FH         ;延时子程序,延时时间赋值

LOOP12: 

    MOV    R2,#0FFH

LOOP120: 

    DJNZ   R2,LOOP120

        DJNZ   R1,LOOP12

        RET                  

    END    

C语言程序

/******************************************************************************/

/*此程序是单片机静态显示的处理程序。

/*针对P1口高四位和低四位分别接一片CD4511而设计的。

/******************************************************************************/

#include"reg52.h"

sbit    KEY = P3^2;            //定义按键的输入脚

#define uchar     unsigned char

#define uint    unsigned int

/******************************************************************************/

/*延时程序,每个函数延时1ms

/*输入参数为:t 

/******************************************************************************/

Delay1ms(uchar t){

    uint    Count0,Count1;

for(Count0 = 0;Count0 < t;Count0 ++){

        for(Count1 = 0;Count1 < 60;Count1 ++){

            ;

        }

    }

}

main(){

    P0 = 0xff;            //I/O初始化

    P1 = 0xff;

    P2 = 0xff;

    P3 = 0xff;

    

    uchar DisplayBuf,Temp;        //定义一个和显示对应寄存器

    DisplayBuf = 0;            //初始化为0

    P1 = DisplayBuf;        //初始化两位数码管显示数据为0

    

    while(1){

        if(!KEY){        //如果有按键输入

            Delay1ms(10);   //延时10ms

            if(!KEY){    //确认按键

                if(DisplayBuf ++ > 99)        //如果显示的数据超过99,超出两位数码管的显示范围

                    DisplayBuf = 0;

                Temp = DisplayBuf;

                Temp %= 10;            //取显示寄存器的个位数

                Temp &= 0x0f;            //清除高四位的数据

                DisplayBuf /= 10;        //取显示寄存器的十位数

                DisplayBuf <<= 4;        //将十位数向左移四位,对于第二个数码管进行输出。

                Temp &= 0xf0;            //清除底四位的数据

                DisplayBuf |= Temp;        //将显示寄存器的十位BCD码和个位的BCD码组合

                P1 = DisplayBuf;        //同时送出给两位数码管                    

            }

        }

    }    

}

    、实验步骤

        、依次接收仿真器、仿真板、电源

        、打开电源并打开仿真软件

        、调入调试程序

、运行程序,观察数码管显示是否为0。

、如果有按键操作,数码管数据由0~99依次轮流进行显示。一GC 00__________________________________________________________________________________________________________________________

    、实验总结

、实验体会

六、实验(二)

    、实验说明(实验的描述)

本实验为了实现多位数码管静态显示方式而设计的方案。

本方案采用串口级连的通信方式和集成串入并出移位寄存器和锁存器专用芯片,通过串口输出多位数码管的段码信息,并通过控制输出段码信息。

本方案数码管驱动数目可以达到300位以上。方案框图如下:

74HC595具有8位串入并出的移位寄存器和一个8位输出锁存器,而且移位寄存器和输出锁存器的控制是各自的,可以实现在输出的同时,传送下一组移位数据,而不影响以前的输出状态。所以这种芯片是实现本方案功能的最佳芯片。

74HC595级连的方式做为段码输出电路,采用四个共阳,0.6寸的数码管做为显示器,数码管的共阳极接电源正极。段码信息通过串口输出给74HC595级连电路,通过移位到达每一个输出管脚。74HC595内部集成一个8位串入并出的移位寄存器和一个8位输出锁存器,而移位寄存器和输出锁存器的控制是各自的,可以在显示不改变的同时进行移位,这样可以保证显示不闪烁。

在74HC595和数码管之间没有加驱动器,是因为采用的数码的功率比较小,74HC595的驱动能力能够满足数码管的需要,每位输出电流为20mA。

单片机系统串口设置成工作方式0,输出8位数据,即数码管的段码信息。

单片机系统用来实现以下功能:

当上电时,初始化显示为0000,如果有按键操作,依次循环显示:1234,4321,2367,4567,76,3267,8546,4574,1296等信息。

这是一个静态显示的典型应用方案,LED数码管可以扩充到上百位。

    、实验工具

        硬件:电脑、电源DC5V、仿真器、烧写器、演示板、示波器

        软件:Keil51编译器,Protel99SE、仿真器软件、烧写器软件

    、元器件列表

名称规格数量名称规格数量
瓷片电容1041电阻2K1
33P210K2
电解电容100UF/16V14.7K

1
10UF/16V110032
发光二极管红,Φ5

1复位开关1
电源座1C51

DIP1
三极管T8050,直插

174LS163DIP4
数码管共阳,0.8

4晶振12M,直插

1
    

、原理图

图4:实验二原理图

原理图说明:实验二原理图是为实现单片机通过串口向数码管输出显示信息静态显示功能而设计的电路。采用DC5V供电,发光二极管D2做为电源指示,R3做为D2的限流分压电阻,电容C3和电解电容C7做为电源滤波电容,电阻R2和按键S1组成按键电路,信号由P3.2输入,电容C8、电容C9和晶振Y2组成单片机外围晶振电路,电容C10和电容R6组成单片机的复位电路,74HC595(U1、U2、U5、U7)和数码管(U3、U4、U6、U9)以及电阻组成静态显示电路。数码管的字段信息采用串口方式发送,通过于74LS1进行移位输出。数码管都采用共阳公共极都接正电源,如图中所示。在此采用P2.0操作74HC595的RCLK端,控制将移位结果输入到锁存器中,P2.1连接74HC595的移位状态清除端,在通过串口输入数据移位之前,应当清除所有74HC595的移位状态。

    、软件流程图

流程2:实验一程序流程图

    、源程序代码(汇编)

;方案选用4个74HC595级连的方式控制四位数码管,由串口输出字形码的静态显示方式。

;P3.2做为按键输入端,每次按键,程序处理显示由0~99之间循环进行显示,P1.0为移位寄存器

;向锁存器送入数据的控制位RCLK

;P1.1做为移位寄存器清零的控制位/SRCLK

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

KEY    BIT    P3.2

RCLK_595    BIT    P1.0        ;定义移位寄存器向锁存器送入数据的控制位

SRCLK_CLR_595    BIT    P1.1        ;定义移位寄存器清零的控制位

DISPHIGH    BIT    20H        ;定义数码管显示寄存器的高位 HHxx H为有效

DISPLOW        BIT    21H        ;定义数码管显示寄存器的低位 xxLL L为有效

DISPTEMP    BIT    22H

    ORG    0000H            ;主程序入口

START:  AJMP   MAIN    

MAIN:                               

                    ;SCON  7   6   5   4   3   2   1   0

    MOV    SCON,#00H        ;     SM0 SM1 SM2 REN TB8 RB8  TI  RI 

                    ;设置串口中断工作方式0

                    ;IE  7   6   5   4   3   2   1   0

    MOV        IE,#90H              EA          ES  ET1 EX1 ET0 EX0

                    ;设置允许总中断和串口中断

    ;初始化显示寄存器和数码管显示数据以及I/O口

    MOV    A,#0

    MOV    DISPHIGH,A

    MOV    DISPLOW,A

    

    MOV    A,#4

    MOV    R0,A            ;通过串口向外输出四个数据

SEND_INIT_DATA:                ;送出初始化数据

    DJNZ    R0,MAIN_LOOP

    MOV        DPTR,#DISP_TABLE     ;表格地址送数据指针

        MOV    A,#0

        MOVC       A,@A+DPTR          ;从字形码DISP_TABLE中获取串口输出字形数据

    MOV    SBUF,A            ;通过串口输出。

    DEC    R0

    AJMP    SEND_INIT_DATA    

MAIN_LOOP:                

    

MAIN_LOOP1:    

    ;等待按键

    SETB    KEY            ;查看是否有按键

    JB    K1,MAIN_LOOP1    

    ACALL    DELAY12ms        ;延时12ms,防抖动

    JB    K1,MAIN_LOOP1        ;再看是否为低电平,如果是则确认为按键,如果不是,则确认不是按键

                    ;处理按键

    INC    DISPTEMP        ;将高位显示的寄存器数据加1

    MOV    A,DISPTEMP

    INC    DISPLOW,A            ;将低位显示的寄存器数据加2

    MOV    DISPHIGH,A

    

    MOV    A,DISPHIGH        ;检查是否超出99显示范围

    CJNE    A,#100,MAIN_DISP_OUT

    JNC    MAIN_DISP_OUT

    MOV    A,#0            ;如果大于99,则清零。

    MOV    DISPHIGH,A

    MOV    DISPLOW,A

MAIN_DISP_OUT:

    MOV    A,#0

    MOV    R0,A            ;存取高位数据

    

    MOV    A,DISPHIGH

DISP_GET:

    CJNE    A,#10,DISP_OPER        ;如果不等于10

DISP_OPER:    

    JC    CY,DISP_OUT        ;如果处理后的数据A小于10,则为个位数,送显

    SUBB    A,#10            ;如果大于10,则再减,直到小于10为止

    INC    R0            ;取十位数

    AJMP    DISP_GET

DISP_OUT:                ;R0存十位数,A存个位数

    MOV    R4,A            ;将个位数寄存下来    

    

    MOV        DPTR,#DISP_TABLE    ;表格地址送数据指针    

MAIN_RUN:    

    MOV        A,R4               ;XXLL

        MOVC       A,@A+DPTR          ;指向表格地址

    MOV    SBUF,A            ;通过串口输出第一个数据的个位数段码

    MOV    A,R0

    MOVC       A,@A+DPTR          ;指向表格地址

    MOV    SBUF,A            ;通过串口输出第一个数据的十位数段码

    

    MOV        A,R4               ;取高位数的个位数的BCD码HHXX

        MOVC       A,@A+DPTR          ;指向表格地址

    MOV    SBUF,A            ;通过串口输出第一个数据的个位数段码

    MOV    A,R0

    MOVC       A,@A+DPTR          ;指向表格地址

    MOV    SBUF,A            ;通过串口输出第一个数据的十位数段码

    AJMP    MAIN_LOOP        ;将数据输出后,重新进入等待按键状态

DELAY12ms: 

    MOV    R1,#0FH         ;延时子程序,延时时间赋值

LOOP12: 

    MOV    R2,#0FFH

LOOP120: 

    DJNZ   R2,LOOP120

        DJNZ   R1,LOOP12

        RET              

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;串口输出控制74HC595的字形码

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DISP_TABLE: 

    DB     C0H                ;字型码表0

        DB     F9H            ;1

        DB     A4H            ;2

        DB     B0H            ;3

        DB     99H            ;4

        DB     92H            ;5

        DB     82H            ;6

        DB     F8H            ;7

        DB     80H            ;8

        DB     90H            ;9

        DB     91H            ;F

        END                        ;程序结束        /******************************************************************************/

/*此程序是单片机静态显示的处理程序。

/*针对串口输出段码信息,采用带锁存器和移位寄存器分开的串入并出芯片74HC595。

/******************************************************************************/

#include"reg52.h"

sbit    KEY = P3^2;            //定义按键的输入脚

sbit    REG_WRITE = P1.0;        //定义数码管电源控制开关

sbit    CLR_595 = P1.1;            //定义1清除位

#define uchar     unsigned char

#define uint    unsigned int

//定义段码

uchar LEDSegCode[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

uint LEDDispCode[9]={1234,1321,2367,1567,16,3267,1546,1574,1296};

/******************************************************************************/

/*延时程序,每个函数延时1ms

/*输入参数为:t 

/******************************************************************************/

Delay1ms(uchar t){

    uint    Count0,Count1;

for(Count0 = 0;Count0 < t;Count0 ++){

        for(Count1 = 0;Count1 < 60;Count1 ++){

            ;

        }

    }

}

main(){

    P0 = 0xff;            //I/O初始化

    P1 = 0xff;

    P2 = 0xff;

    P3 = 0xff;

                    //串口中断初始化-定义为0方式

    SCON = 0x0;            //设置串口中断方式0

    IE = 0x90            //允许单片机总中断和串口中断0

    uchar Count,CountTemp;        //定义两个计数器

    uchar DisplayBuf;        //定义一个和显示对应寄存器

    CLR_595 = 1;            //使595 CLR端置高

    DisplayBuf = LEDSegCode[0];    //初始化方案四位数码管为0

    

    for(Count = 0;Count < 4;Count ++){//通过串口输出四个0的段码,分别送给四个数码管,送到595移位寄存器中

        SBUF = DisplayBuf;

    }

    REG_WRITE = 1;            //将移位寄存器的数据写入锁存器    

    Delay1ms(1);            

    REG_WRITE = 0;

    CountTemp = 0;

    while(1){

        if(!KEY){        //如果有按键输入

            Delay1ms(10);   //延时10ms

            if(!KEY){    //确认按键

                LED_POWER = 0;            //断开数码管电源,防止出现显示闪烁

                CLR_595 = 0;            //给74ls1输出一个2ms的低电平脉冲,清除输出状态

                Delay1ms(1); 

                CLR_595 = 1;

                DisplayBuf = LEDSegCode[Count];//取出要显示的数据

                for(Count = 0;Count < 4;Count ++){//通过串口输出四个0段码,分别送给四个数码管

                    SBUF = DisplayBuf % 10;   //分别取出个位、十位、百位、千位数交送到串口输出。

                    DisplayBuf /= 10;

                }

                if(CountTemp ++ > 9)CountTemp = 0;//如果9个数据都显示完了,再重复从第一个数据开始显示

                REG_WRITE = 1;            //将移位寄存器的数据写入锁存器    

                Delay1ms(1);            

                REG_WRITE = 0;                                

            }

        }

    }    

}

    、实验步骤

        、实验步骤

        、依次接收仿真器、仿真板、电源

        、打开电源并打开仿真软件

        、调入调试程序

、运行程序,观察数码管显示是否为0。

、有按键输入,数码管数据按1234,4321,2367,4567,76,3267,8546,4574,1296依次轮流显示。一GC 00__________________________________________________________________________________________________________________________

    、实验总结

    、实验体会

七、实验(三)

    、实验说明(实验的描述)

实验三通过单片机I/O对多位数码管进行位扫描的显示方式而设计的典型应用方案。方案如图所示:

方案中电路为了保证数码管有足够的亮度,采用总线驱动集成电路74LS244做为段码的驱动器。74LS244每位可以吸收34~54mA电流,而数码管每段的电流为20mA,74LS244足以做数码管的字段驱动器;采用大功率三极管T8050做为数码管公共极的驱动,对于数码管峰值电流为140mA,而T8050的输出电流可以达到1500mA,是数码管峰值电流的十倍以上,所以也满足数码管公共极的驱动需要。方案采用四个单位共阳极,0.8的数码管做为显示器。一个复位按键电路,按键信号由P3.2口输入。P2.0~P2.6做为段码的输出,P1.0~P1.2做为74LS238地址位的输出口,扫描每一位数码管。

对于74LS238输出口可以接八个单位的数码管,在此方案中只接四位,对应74LS238的输出口分别为:Y0、Y1、Y2、Y3,而Y4、Y5、Y6、Y7悬空。

方案的功能是刚上电时,四位数码管显示数据为0。林案C 150V______________________________________________________________________________________________________________________

检测是否有按键,如果没有,则保持以前的状态显示,如果有按键,则更换显示数据。显示的数据依次为1234,4321,2367,4567,76,3267,8546,4574,1296。

    、实验工具

        硬件:电脑、电源DC5V、仿真器、烧写器、演示板、示波器

        软件:Keil51编译器,Protel99SE、仿真器软件、烧写器软件

    、元器件列表    

名称规格数量名称规格数量
瓷片电容1041电阻2K1
33P210K2
电解电容100UF/16V14.7K

4
10UF/16V12007
发光二极管红,Φ5

1复位开关1
电源座1C51

DIP1
三极管T8050,直插

4ULN2003A

DIP1
数码管共阳,0.8

4晶振12M,直插

1
74LS238DIP1
、原理图

图5:实验三原理图

原理图说明:实验三原理图是为实现单片机控制数码管动态驱动显示功能而设计的电路。采用DC5V供电,发光二极管D2做为电源指示,R3做为D2的限流分压电阻,电容C3和电解电容C7做为电源滤波电容,电阻R2和按键S1组成按键电路,信号由P3.2输入,电容C8、电容C9和晶振Y2组成单片机外围晶振电路,电容C10和电容R6组成单片机的复位电路,U1(74LS244)做为字段的驱动集成电路,Q1、Q2、Q3和Q4做为共阳极数码管的位扫描控制电路和驱动电路。P2.0~P2.6做为段码的输出口,P1.0~P1.2做为74LS238的地址输出位,控制扫描四位数码管显示,在此只接74LS238的底四位。在此处用74LS238的原因是74LS238输出的有效电平为高电平,刚好符合数码管显示扫描控制的功能!

    、软件流程图

流程1:实验一程序流程图

    、源程序代码

/******************************************************************************/

/*此程序是单片机动态显示的处理程序。

/*针对P2.0~P2.6输出段码信息,P1.0~P1.2向74ls238输出扫描地址而设计的。

/******************************************************************************/

#include"reg52.h"

sbit    KEY = P3^2;            //定义按键的输入脚

#define uchar     unsigned char

#define uint    unsigned int

//定义段码

uchar LEDScanCode[8]={0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7};

uchar LEDSegCode[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

uint LEDDispCode[9]={1234,1321,2367,1567,16,3267,1546,1574,1296};

/******************************************************************************/

/*延时程序,每个函数延时1ms

/*输入参数为:t 

/******************************************************************************/

Delay1ms(uchar t){

    uint    Count0,Count1;

for(Count0 = 0;Count0 < t;Count0 ++){

        for(Count1 = 0;Count1 < 60;Count1 ++){

            ;

        }

    }

}

main(){

    P0 = 0xff;            //I/O初始化

    P1 = 0xff;

    P2 = 0xff;

    P3 = 0xff;

    

    uchar Count,CountTemp,CountTemp2;            //定义一个计数器

    uchar DisplayBuf[4],DisplayTemp;        //定义一个和显示对应寄存器

for(Count = 0;Count < 4;Count ++){

        DisplayBuf[Count] = LEDSegCode[0];    //初始化方案四位数码管为0

    }

    Count = 0;    //从第一个数码管开始显示和扫描

    CountTemp = 0;  //从LEDDispCode[]第一个要显示的数据进行显示

    while(1){

        if(!KEY){        //如果有按键输入

            Delay1ms(10);   //延时10ms

            if(!KEY){    //确认按键

                DisplayTemp = LEDDispCode[CountTemp];    //将要显示的数据取出,分别放在四个寄存中

                for(CountTemp2 = 0;CountTemp2 < 4;CountTemp2 ++){    //通过串口输出四个0段码,分别送给四个数码管

                    DisplayBuf[CountTemp2] = DisplayTemp % 10;       //分别取出个位、十位、百位、千位数交送到串口输出。

                    DisplayTemp /= 10;

                }

                if(CountTemp ++ > 9)CountTemp = 0;//如果9个数据都显示完了,再重复从第一个数据开始显示                    

            }

        }

        P2 = DisplayBuf[Count];    //将字段码输出

        P1 = LEDScanCode[Count]; //输出扫描地址

        Delay1ms();//延时1ms时间,这个比较重要。

        if(Count++ >= 4)Count = 0; //只针对四位数码管进行扫描

        

    }    

}

    、实验步骤

        、依次接收仿真器、仿真板、电源

        、打开电源并打开仿真软件

        、调入调试程序

、运行程序,观察数码管显示是否为0。

、有按键输入,数码管数据按1234,4321,2367,4567,76,3267,8546,4574,1296依次轮流显示。一GC 00__________________________________________________________________________________________________________________________

    、常见问题

    、实验总结

八、实验(四)

    、实验说明(实验的描述)

实验四是针对多位(可达300位以上)不同大小(0.36~8英寸)的数码管单片机串口扫描的显示方式而设计的典型应用方案。

图4:单片机扫描多位数码管方案设计图

如方案图所示,电路为了保证数码管有足够的亮度,采用达林顿管集成电路ULN2003做为数码管段驱动器,ULN2003每位驱动脚驱动电流可以达500mA,耐压可达50V,如果按每位的每段电流为10mA,这样可以驱动50个数码管。采用大功率三极管TIP42C做为共阳极数码管公共极驱动驱动,驱动电流为6A,耐压可达100V,如果按数码管的峰值电流为70mA计算,可以驱动85个数码管。总计行列计算:50x85 = 4250个数码管。

方案采用串口移位芯片74HC595芯片,通过串口输出段码信息,数据分别送到每行的数码管中。采用74LS154,通过地址可以扫描驱动每列的数码管。

此方案的显示设定为两行三列共六位数码管。段控制做为行,共两行,位控制做为列,共三列。

方案的功能是刚上电时,设置串口工作方式为0,四位数码管显示数据为0。林案C 150V______________________________________________________________________________________________________________________

检测是否有按键,如果没有,则保持以前的状态显示,如果有按键,则更换显示数据。显示的数据依次为1234,4321,2367,4567,76,3267,8546,4574,1296。        

    、实验工具

        硬件:电脑、电源DC5V、仿真器、烧写器、演示板、示波器

        软件:Keil51编译器,Protel99SE、仿真器软件、烧写器软件

    、元器件列表    

名称规格数量名称规格数量
瓷片电容1042电阻2K1
33P210K2
电解电容100UF/16V14.7K

7
10UF/16V13007
4700UF/50V174HC595DIP2
发光二极管红,Φ5

1复位开关1
电源座1C51

DIP1
三极管TIP42C,直插

3ULN2003A

DIP2
数码管共阳,0.8

6晶振12M,直插

1
7805174LS154DIP1
、原理图

图6:实验四原理图

原理图说明:实验四原理图是为实现单片机串口通过串入并出芯片74HC595输出段码信息,通过74LS145输出动态扫描功能而设计的电路。

此电路为多位数码管显示的小型应用电路。采用由稳压电源集成电路7805和电容共同组成一个稳压电源为整个电路供电并输出DC5V电压,采用DC9V~12V供电,在7805前端,采用电容C7和C8做为前端的滤波稳压的电路,C8一般采用容量比较大和耐压较高的电容,目前是防止输出电源不稳定而设计的;在7805后端,采用C9和C10电容做为7805后端的稳压和滤波,在此参数要求不是很高。发光二极管D2做为电源指示,R7做为D2的限流分压电阻,电阻R6和按键S2组成按键电路,信号由P3.2输入,电容C3、电容C13和24M晶振Y2组成单片机外围晶振电路,电容C14和电容R8组成单片机的复位电路。

单片机串口接74HC595电路做为段码输出,74HC595具有移位寄存器和锁存器相互控制的功能,在移位时,不会影响显示,数码管就不会出现显示抖动的现象。为了保证数码管的亮度,在此采用专用集成电路ULN2003做为数码管字段的电流驱动电路,驱动电流可达500mA,耐压可达50V。在每位数码管的公共极增加了大功率驱动电路TIP42C,驱动电流可达6A,耐压可达100V。P2.1~P2.4做为74LS154地址输入口,P2.0做为74LS154的输出控制位,74LS154是一个四-十六译码器,功能和74LS138相似。

对于ULN2003(U2和U15)可以驱动50个数码管,在此选用其中的三列做为例子。TIP42C可以驱动85个数码管,在此每只只驱动两个数码管。

    、软件流程图

流程1:实验一程序流程图

    、源程序代码

        /******************************************************************************/

/*此程序是单片机动态显示的处理程序。

/*针对串口输出段码信息,采用带锁存器和移位寄存器分开的串入并出芯片74HC595。

/*P2口控制4-16译码器输出地址信息,共控制六位数码管

/*段位控制为行,位控制为列,共两行三列。

/******************************************************************************/

#include"reg52.h"

sbit    KEY = P3^2;            //定义按键的输入脚

sbit    REG_WRITE = P1.0;        //定义数码管电源控制开关

sbit    CLR_595 = P1.1;            //定义1清除位

#define uchar     unsigned char

#define uint    unsigned int

//定义段码

uchar LEDSegCode[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

uint LEDDispCode[9]={1234,1321,2367,1567,16,3267,1546,1574,1296};

/******************************************************************************/

/*延时程序,每个函数延时1ms

/*输入参数为:t 

/******************************************************************************/

Delay1ms(uchar t){

    uint    Count0,Count1;

for(Count0 = 0;Count0 < t;Count0 ++){

        for(Count1 = 0;Count1 < 60;Count1 ++){

            ;

        }

    }

}

main(){

    P0 = 0xff;            //I/O初始化

    P1 = 0xff;

    P2 = 0xff;

    P3 = 0xff;

                    //串口中断初始化-定义为0方式

    SCON = 0x0;            //设置串口中断方式0

    IE = 0x90            //允许单片机总中断和串口中断0

    uchar Count,CountTemp;        //定义两个计数器

    uchar DisplayBuf;        //定义一个和显示对应寄存器

    CLR_595 = 1;            //使595 CLR端置高

    DisplayBuf = LEDSegCode[0];    //初始化方案四位数码管为0

    

    for(Count = 0;Count < 4;Count ++){//通过串口输出四个0的段码,分别送给四个数码管,送到595移位寄存器中

        SBUF = DisplayBuf;

    }

    REG_WRITE = 1;            //将移位寄存器的数据写入锁存器    

    Delay1ms(1);            

    REG_WRITE = 0;

    CountTemp = 0;

    while(1){

        if(!KEY){        //如果有按键输入

            Delay1ms(10);   //延时10ms

            if(!KEY){    //确认按键

                LED_POWER = 0;            //断开数码管电源,防止出现显示闪烁

                CLR_595 = 0;            //给74ls1输出一个2ms的低电平脉冲,清除输出状态

                Delay1ms(1); 

                CLR_595 = 1;

                DisplayBuf = LEDSegCode[Count];//取出要显示的数据

                for(Count = 0;Count < 4;Count ++){//通过串口输出四个0段码,分别送给四个数码管

                    SBUF = DisplayBuf % 10;   //分别取出个位、十位、百位、千位数交送到串口输出。

                    DisplayBuf /= 10;

                }

                if(CountTemp ++ > 9)CountTemp = 0;//如果9个数据都显示完了,再重复从第一个数据开始显示

                REG_WRITE = 1;            //将移位寄存器的数据写入锁存器    

                Delay1ms(1);            

                REG_WRITE = 0;                                

            }

        }

    }    

}

    、实验步骤

        、依次接收仿真器、仿真板、电源

        、打开电源并打开仿真软件

        、调入调试程序

、运行程序,观察数码管显示是否为0。

、有按键输入,数码管数据按1234,4321,2367,4567,76,3267,8546,4574,1296依次轮流显示。一GC 00__________________________________________________________________________________________________________________________

    、常见问题

    对数码管了解较少甚至不了解

    解决方法:对各种数码管进行讲解,重点讲解数码管的类型、引脚、工作电压可工作电流等。

    不能确定数码管是共阴极或共阳极

解决方法:用万用表测量并点亮小型数码管的各个段

对扫描方式不了解

    解决方法:分步骤讲解扫描方式的工作过程和视觉滞留现象

    、实验总结

通过本项目对电子装置中常用的显示装置数码管有比较全面而透彻的了解并会选型及设计合适的驱动电路和编写合理的驱动程序。以便在以后开发电子产品时灵活运用数码管进行显示。下载本文

显示全文
专题