您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 模板/表格 > 51单片机汇编语言教程23
51单片机汇编语言教程:23课:LED数码管静态显示接口与编程在单片机系统中,常常用LED数码数码管显示器来显示各种数字或符号。由于它具有显示清晰、亮度高、使用电压低、寿命长的特点,因此使用非常广泛。引言:还记得我们小时候玩的“火柴棒游戏”吗,几根火柴棒组合起来,能拼成各种各样的图形,LED数码管显示器实际上也是这么一个东西。八段LED数码管显示器单片机静态显示接口八段LED数码管显示器由8个发光二极管组成。基中7个长条形的发光管排列成“日”字形,另一个贺点形的发光管在数码管显示器的右下角作为显示小数点用,它能显示各种数字及部份英文字母。LED数码管显示器有两种不一样的形式:一种是8个发光二极管的阳极都连在一起的,称之为共阳极LED数码管显示器;另一种是8个发光二极管的阴极都连在一起的,称之为共阴极LED数码管显示器。如下图所示。`共阴和共阳结构的LED数码管显示器各笔划段名和安排位置是相同的。当二极管导通时,对应的笔划段发亮,由发亮的笔划段组合而显示的各种字符。8个笔划段hgfedcba对应于一个字节(8位)的D7D6D5D4D3D2D1D0,于是用8位二进制码就能表示欲显示字符的字形代码。例如,对于共阴LED数码管显示器,当公共阴极接地(为零电平),而阳极hgfedcba各段为0111011时,数码管显示器显示P字符,即对于共阴极LED数码管显示器,“P”字符的字形码是73H。如果是共阳LED数码管显示器,公共阳极接高电平,显示“P”字符的字形代码应为10001100(8CH)。这里必须注意的是:很多产品为方便接线,常不按规则的办法去对应字段与位的关系,这个时候字形码就必须根据接线来自行设计了,后面我们会给出一个例程。在单片机应用系统中,数码管显示器显示常用两种办法:静态显示和动态扫描显示。所谓静态显示,就是每一个数码管显示器都要占用单独的具有锁存功能的I/O接口用于笔划段字形代码。这样单片机只要把要显示的字形代码发送到接口电路,就不用管它了,直到要显示新的数据时,再发送新的字形码,因此,使用这种办法单片机中CPU的开销小。能供给单独锁存的I/O接口电路很多,这里以常用的串并转换电路74LS164为例,介绍一种常用静态显示电路,以使大家对静态显示有一定的了解。MCS-51单片机串行口方式押为移们寄存器方式,外接6片74LS164作为6位LED数码管显示器的静态显示接口,把8031的RXD作为数据输出线,TXD作为移位时钟脉冲。74LS164为TTL单向8位移位寄存器,可实现串行输入,并行输出。其中A、B(第1、2脚)为串行数据输入端,2个管脚按逻辑与运算规律输入信号,公一个输入信号时可并接。T(第8脚)为时钟输入端,可连接到串行口的TXD端。每一个时钟信号的上升沿加到T端时,移位寄存器移一位,8个时钟脉冲过后,8位二进制数全部移入74LS164中。R(第9脚)为复位端,当R=0时,移位寄存器各位复0,只有当R=1时,时钟脉冲才起作用。Q1…Q8(第3-6和10-13管脚)并行输出端分别接LED数码管显示器的hg---a各段对应的管脚上。关于74LS164还能作如下的介绍:所谓时钟脉冲端,其实就是需要高、低、高、低的脉冲,不管这个脉冲是怎么来的,比如,我们用根电线,一端接T,一端用手拿着,分别接高电平、低电平,那也是给出时钟脉冲,在74LS164获得时钟脉冲的瞬间(再讲清楚点,是在脉冲的沿),如果数据输入端(第1,2管脚)是高电平,则就会有一个1进入到74LS164的内部,如果数据输入端是低电平,则就会有一个0进入其内部。在给出了8个脉冲后,最先进入74LS164的第一个数据到达了最高位,然后再来一个脉冲会有什么发生呢?再来一个脉冲,第一个脉冲就会从最高位移出,就象车站排队买票,栏杆就那么长,要从后面进去一本人,前面必须要从前面走出去一本人才行。搞清了这一点,下面让我们来看电路,6片7LS164首尾相串,而时钟端则接在一起,这样,当输入8个脉冲时,从单片机RXD端输出的数据就进入到了第一片74LS164中了,而当第二个8个脉冲到来后,这个数据就进入了第二片74LS164,而新的数据则进入了第一片74LS164,这样,当第六个8个脉冲完成后,首次送出的数据被送到了最左面的164中,其他数据依次出现在第一、二、三、四、五片74LS164中。有个问题,在第一个脉冲到来时,除了第一片74LS164中接收数据外,其他各片在干吗呢?它们也在接收数据,因为它们的时钟端都是被接在一起的,可是数据还没有送到其他各片呢,它们在接收什么数据呢?。。。。。。其实所谓数据不过是一种说法而已,实际就是电平的高低,当第一个脉冲到来时,第一片164固然是从单片机接收数据了,而其它各片也接到前一片的Q8上,而Q8是一根电线,在数字电路中它只可能有两种状态:低电平或高电平,也就是“0”和“1”。所以它的下一片74LS164也相当于是在接收数据啊。只是接收的全部是0或1而已。这个问题放在这儿说明,可能有朋友不屑一顾,而有的朋友可能还是不清楚,这实际上涉及到数的本质的问题,如果不懂的,请仔细思考,并找一些数字电路的数,理解164的工作原理,再来看这个问题,或者去看看我的另一篇文章《27课:关于单片机的一些基本概念》的文章。务必搞懂,搞懂了这一点,你的级别就高过开始学习者,可谓入门者了。入口:把要显示的数分别放在显示缓冲区60H-65H共6个单元中,并且分别对应各个数码管LED0-LED5。出口:将预置在显示缓冲区中的6个数成对应的显示字形码,然后输出到数码管显示器中显示。单片机led显示程序如下:DISP:MOVSCON,#00H;初始化串行口方式0MOVR1,#06H;显示6位数MOVR0,#65H;60H-65H为显示缓冲区MOVDPTR,#SEGTAB;字形表的入口地址LOOP:MOVA,@R0;取最高位的待显示数据MOVCA,@A+DPTR;查表获取字形码MOVSBUF,A;送串行口显示DELAY:JNBTI,DELAY;等待发送完毕CLRTI;清发送标志DECR0;指针下移一位,准备取下一个待显示数DJNZR1,LOOP;直到6个数据全显示完。RETSETTAB:;字形表,前面有介绍,以后我们再介绍字形表的制作。DB03H9FH27H0DH99H49H41H1FH01H09H0FFH;0123456789消隐码单片机显示测试用主程序ORG0000HAJMPSTARTORG30HSTART:MOVSP,#6FHMOV65H,#0MOV64H,#1MOV63H,#2MOV62H,#3MOV61H,#4MOV60H,#5LCALLDISPSJMP$如果按图示数码管排列,则以上主程序将显示的是543210,想想看,如果要显示012345该怎样送数?下面我们来分析一下字形表的制作问题。先就上述“标准”的图形来看吧。写出数据位和字形的对应关系并列一个表如下(设为共阳型,也就是对应的输出位为0时笔段亮)如何,字形表会做了吧,就是这样列个表格,根据要求(0亮或1亮)写出对应位的0和1,就成了。做个练习,写出A-F的字形码吧。如果为了接线方便而打乱了接线的次序,那么字形表又该如何接呢?也很简单,一样地列表啊。以新实验板为例,共阳型。接线如下:P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.0CEHDGFAB则字形码如下所示:;00010100028H;1011111107EH;2101001000A4H;30110010064H;40111001072H;50110000161H;60010000121H;7011111007CH;80010000020H;90110000060H作为练习,大家写出A-F的字形代码。本来这里是讲解单片机数码管显示器的静态接口的,到此应当可算结束了,但是我还想接着上面讲到的数的本质的问题再谈一点。单片机中有一些术语、名词本来是帮助我们理解事物的,但有时我们会被这些术语的相关语义所迷惑,以致不能进一步认清他们的本质,由此一般陷入困惑的境界。只有深入地了解了74LS164的工作特性,才能真正理解何谓串行的数据。有兴趣的朋友还能再看看我网站单片机汇编语言教程:24课:动态扫描显示接口电路及程序24课:动态扫描显示接口电路及程序在单片机系统中动态扫描显示接口是单片机中应用最为广泛的一种显示方式之一。其接口电路是把所有显示器的8个笔划段a-h同名端连在一起,而每一个显示器的公共极COM是各自独立地受I/O线控制。CPU向字段输出口送出字形码时,所有显示器接收到相同的字形码,但究竟是那个显示器亮,则取决于COM端,而这一端是由I/O控制的,所以我们就能自行决定何时显示哪一位了。而所谓动态扫描就是指我们采用分时的办法,轮流控制各个显示器的COM端,使各个显示器轮流点亮。在还有很多关于单片机显示接口的文章,大家可以参考一下在轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的(约1ms),但由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。下图所示就是我们的单片机实验板上的动态扫描接口。由89c51的P0口能灌入较大的电流,所以我们采用共阳的数码管,并且不用限流电阻,而只是用两只1N4004进行降压后给数码管供电,这里仅用了两只,实际上还能扩充。它们的公共端则由PNP型三极管8550控制,显然,如果8550导通,则对应的数码管就能亮,而如果8550截止,则对应的数码管就不可能亮,8550是由P2.7,P2.6控制的。这样我们就能通过控制P27、P26达到控制某个数码管亮或灭的目的。下面的这个单片机程序,就是用实验板上的数码管显示0和1。FIRSTEQUP2.7;第一位数码管的位控制SECONDEQUP2.6;第二位数码管的位控制DISPBUFFEQU5AH;显示缓冲区为5AH和5BHORG0000HAJMPSTARTORG30HSTART:MOVSP,#5FH;设置堆栈MOVP1,#0FFHMOVP0,#0FFHMOVP2,#0FFH;初始化,所显示器,LED灭MOVDISPBUFF,#0;第一位显示0MOVDISPBUFF+1,#1;第二握显示1LOOP:LCALLDISP;调用显示程序AJMPLOOP;主程序到此结束DISP:PUSHACC;ACC入栈PUSHPSW;PSW入栈MOVA,DISPBUFF;取第一个待显示数MOVDPTR,#DISPTAB;字形表首地址MOVCA,@A+DPTR;取字形码MOVP0,A;将字形码送P0位(段口)CLRFIRST;开第一位显示器位口LCALLDELAY;延时1毫秒SETBFIRST;关闭第一位显示器(开始准备第二位的数据)MOVA,DISPBUFF+1;取显示缓冲区的第二位MOVDPTR,#DISPTABMOVCA,@A+DPTRMOVP0,A;将第二个字形码送P0口CLRSECOND;开第二位显示器LCALLDELAY;延时SETBSECOND;关第二位显示POPPSWPOPACCRETDELAY:;延时1毫秒PUSHPSWSETBRS0MOVR7,#50D1:MOVR6,#10D2:DJNZR6,$DJNZR7,D1POPPSWRETDISPTAB:DB28H,7EH,0a4H,64H,72H,61H,21H,7CH,20H,60HEND从上面的单片机例程中能看出,动态扫描显示必须由CPU持续地调用显示程序,才能保证持续持续的显示。上面的这个程序能实现数字的显示,但不太实用,为什么呢?这里仅是显示两个数字,并没有做其他的工作,因此,两个数码管轮流显示1毫秒,没有问题,实际的工作中,当然不可能只显示两个数字,还是要做其他的事情的,这样在二次调用显示程序之间的时间间隔就不一不定了,如果时间间隔比较长,就会使显示不连续。而实际工作中是很难保证所有工作都能在很短时间内完成的。况且这个显
本文标题:51单片机汇编语言教程23
链接地址:https://www.777doc.com/doc-2893619 .html