返回主页 单片机教程XL2000开发板 单片机学习 自制编程器 单片机资料 软件下载 电子技术产品介绍如何购买 进入论坛

单片机教程第1课  教学资料单片机教程第18课  算术指令
单片机教程第2课  好书推荐单片机教程第19课  逻辑指令
单片机教程第3课  单片机不易掌握的概念单片机教程第20课  逻辑指令
单片机教程第4课  实战一:流水灯单片机教程第21课  转移指令
单片机教程第5课  实战二:唱歌单片机教程第22课  位操作
单片机教程第6课  测试一单片机教程第23课  计数定时器
单片机教程第7课  新教程前言单片机教程第24课  计数定时器
单片机教程第8课  总体规划单片机教程第25课  中断系统
单片机教程第9课  概述单片机教程第26课  中断练习
单片机教程第10课  单片机结构单片机教程第27课  定时计数实验2
单片机教程第11课  基本概念单片机教程第28课  串行口
单片机教程第12课  延时程序分析单片机教程第29课  串口实例
单片机教程第13课  延时程序分析单片机教程第30课  数码管编程
单片机教程第14课  并口结构单片机教程第31课  动态数码管编程
单片机教程第15课  结构分析单片机教程第32课  键盘接口编程
单片机教程第16课  寻址方式单片机教程第33课  键盘扫描编程
单片机教程第17课  上机练习 单片机教程第34课  指令介绍        平凡的单片机教程

LED数码显示器的连接与编程

在单片机系统中,通常用LED数码显示器来显示各种数字或符号。由于它具有显示清晰、亮度高、使用电压低、寿命长的特点,因此使用非常广泛。

1.       八段LED显示器

引入:还记得我们小时候玩的火柴棒游戏吗,几根火柴棒组合起来,可以拼成各种各样的图形,LED显示器实际上也是这么一个东西。

八段LED显示器由8个发光二极管组成。基中7个长条形的发光管排列成字形,另一个贺点形的发光管在显示器的右下角作为显示小数点用,它能显示各种数字及部份英文字母。LED显示器有两种不同的形式:一种是8个发光二极管的阳极都连在一起的,称之为共阳极LED显示器;另一种是8个发光二极管的阴极都连在一起的,称之为共阴极LED显示器。如下图所示。`

共阴和共阳结构的LED显示器各笔划段名和安排位置是相同的。当二极管导通时,相应的笔划段发亮,由发亮的笔划段组合而显示的各种字符。8个笔划段hgfedcba对应于一个字节(8位)的D7 D6 D5 D4 D3 D2 D1 D0,于是用8位二进制码就可以表示欲显示字符的字形代码。例如,对于共阴LED显示器,当公共阴极接地(为零电平),而阳极hgfedcba各段为0111011时,显示器显示"P"字符,即对于共阴极LED显示器,“P”字符的字形码是73H。如果是共阳LED显示器,公共阳极接高电平,显示“P”字符的字形代码应为100011008CH)。这里必须注意的是:很多产品为方便接线,常不按规则的方法去对应字段与位的关系,这时字形码就必须根据接线来自行设计了,后面我们会给出一个例子。

2.       静态显示接口

在单片机应用系统中,显示器显示常用两种方法:静态显示和动态扫描显示。所谓静态显示,就是每一个显示器都要占用单独的具有锁存功能的I/O接口用于笔划段字形代码。这样单片机只要把要显示的字形代码发送到接口电路,就不用管它了,直到要显示新的数据时,再发送新的字形码,因此,使用这种方法单片机中CPU的开销小。可以提供单独锁存的I/O接口电路很多,这里以常用的串并转换电路74LS164为例,介绍一种常用静态显示电路,以使大家对静态显示有一定的了解。

MCS-51单片机串行口方式押为移们寄存器方式,外接674LS164作为6LED显示器的静态显示接口,把8031RXD作为数据输出线,TXD作为移位时钟脉冲。74LS164TTL单向8位移位寄存器,可实现串行输入,并行输出。其中AB(第12脚)为串行数据输入端,2个引脚按逻辑与运算规律输入信号,公一个输入信号时可并接。T(第8脚)为时钟输入端,可连接到串行口的TXD端。每一个时钟信号的上升沿加到T端时,移位寄存器移一位,8个时钟脉冲过后,8位二进制数全部移入74LS164中。R(第9脚)为复位端,当R=0时,移位寄存器各位复0,只有当R=1时,时钟脉冲才起作用。Q1…Q8(第3-610-13引脚)并行输出端分别接LED显示器的hg---a各段对应的引脚上。关于74LS164还可以作如下的介绍:所谓时钟脉冲端,其实就是需要高、低、高、低的脉冲,不管这个脉冲是怎么来的,比如,我们用根电线,一端接T,一端用手拿着,分别接高电平、低电平,那也是给出时钟脉冲,在74LS164获得时钟脉冲的瞬间(再讲清楚点,是在脉冲的沿),如果数据输入端(第12引脚)是高电平,则就会有一个1进入到74LS164的内部,如果数据输入端是低电平,则就会有一个0进入其内部。在给出了8个脉冲后,最先进入74LS164的第一个数据到达了最高位,然后再来一个脉冲会有什么发生呢?再来一个脉冲,第一个脉冲就会从最高位移出,就象车站排队买票,栏杆就那么长,要从后面进去一个人,前面必须要从前面走出去一个人才行。

搞清了这一点,下面让我们来看电路,67LS164首尾相串,而时钟端则接在一起,这样,当输入8个脉冲时,从单片机RXD端输出的数据就进入到了第一片74LS164中了,而当第二个8个脉冲到来后,这个数据就进入了第二片74LS164,而新的数据则进入了第一片74LS164,这样,当第六个8个脉冲完成后,首次送出的数据被送到了最左面的164中,其他数据依次出现在第一、二、三、四、五片74LS164中。有个问题,在第一个脉冲到来时,除了第一片74LS164中接收数据外,其他各片在干吗呢?它们也在接收数据,因为它们的时钟端都是被接在一起的,可是数据还没有送到其他各片呢,它们在接收什么数据呢?。。。。。。其实所谓数据不过是一种说法而已,实际就是电平的高低,当第一个脉冲到来时,第一片164固然是从单片机接收数据了,而其它各片也接到前一片的Q8上,而Q8是一根电线,在数字电路中它只可能有两种状态:低电平或高电平,也就是“0”“1”。所以它的下一片74LS164也相当于是在接收数据啊。只是接收的全部是01而已。这个问题放在这儿说明,可能有朋友不屑一顾,而有的朋友可能还是不清楚,这实际上涉及到数的本质的问题,如果不懂的,请仔细思考,并找一些数字电路的数,理解164的工作原理,再来看这个问题,或者去看看我的另一篇文章《初学单片机易掌握的概念》。务必搞懂,搞懂了这一点,你的级别就高过初学者,可谓入门者了。

入口:把要显示的数分别放在显示缓冲区60H-65H6个单元中,并且分别对应各个数码管LED0-LED5

出口:将预置在显示缓冲区中的6个数成相应的显示字形码,然后输出到显示器中显示。

显示程序如下:

DISP:     MOV       SCON,#00H         ;初始化串行口方式0

              MOV       R1,#06H                     ;显示6位数

              MOV       R0,#65H                     ;60H-65H为显示缓冲区

              MOV       DPTR,#SEGTAB  ;字形表的入口地址

LOOP:

              MOV       A,@R0                 ;取最高位的待显示数据

              MOVC    A,@A+DPTR        ;查表获取字形码

              MOV       SBUF,A                ;送串口显示

DELAY:  JNB              TI,DELAY             ;等待发送完毕

              CLR              TI                         ;清发送标志

              DEC              R0                        ;指针下移一位,准备取下一个待显示数

              DJNZ     R1,LOOP                    ;直到6个数据全显示完。

              RET

SETTAB:                                          ;字形表,前面有介绍,以后我们再介绍字形表的制作。

              DB  03H9FH 27H 0DH 99H 49H 41H 1FH 01H 09H 0FFH

;                    0 1 2 34 5 6 7 8 9 消隐码

测试用主程序

       ORG       0000H

       AJMP     START

       ORG       30H

START:         MOV       SP,#6FH

                     MOV       65H,#0

              MOV       64H,#1

                     MOV       63H,#2

                     MOV       62H,#3

              MOV       61H,#4

                     MOV       60H,#5

                     LCALL    DISP

              SJMP     $

如果按图示数码管排列,则以上主程序将显示的是543210,想想看,如果要显示012345该怎样送数?

下面我们来分析一下字形表的制作问题。先就上述标准的图形来看吧。写出数据位和字形的对应关系并列一个表如下(设为共阳型,也就是相应的输出位为0时笔段亮)

数据位

D7

D6

D5

D4

D3

D2

D1

D0

字形码

笔段位

A

B

C

D

E

F

G

H

0

0

0

0

0

0

0

1

1

03H

1

1

0

0

1

1

1

1

1

9FH

2

0

0

1

0

0

1

1

1

27H

3

0

0

0

0

1

1

0

1

0DH

4

1

0

0

1

1

0

0

1

99H

5

0

1

0

0

1

0

0

1

49H

6

0

1

0

0

0

0

0

1

41H

7

0

0

0

1

1

1

1

1

1FH

8

0

0

0

0

0

0

0

1

01H

9

0

0

0

0

1

0

0

1

09H

如何,字形表会做了吧,就是这样列个表格,根据要求(0亮或1亮)写出相应位的01,就成了。做个练习,写出A-F的字形码吧。

如果为了接线方便而打乱了接线的顺序,那么字形表又该如何接呢?也很简单,一样地列表啊。以新实验板为例,共阳型。接线如下:

P0.7 P0.6 P0.5 P0.4 P0.3 P0.2P0.1 P0.0

C E H D G F A B

则字形码如下所示:

;0 00101000 28H

;1 01111110 7EH

;2 10100100 0A4H

;3 01100100 64H

;4 01110010 72H

;5 01100001 61H

;6 00100001 21H

;7 01111100 7CH

;8 00100000 20H

;9 01100000 60H

作为练习,大家写出A-F的字形代码。

本来这里是讲解显示器的静态接口的,到此应当可算结束了,但是我还想接着上面讲到的数的本质的问题再谈一点。单片机中有一些术语、名词本来是帮助我们理解事物的,但有时我们会被这些术语的相关语义所迷惑,以致不能进一步认清他们的本质,由此往往陷入困惑的境界。只有深入地了解了74LS164的工作特性,才能真正理解何谓串行的数据。有兴趣的朋友还可以再看看我网站上其他资料中的银行利率屏的设计一文。