📄 动态扫描显示接口.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0047)http://www.onestudy.net/download/elec/dpj24.htm -->
<!-- saved from url=(0048)http://www.21icsearch.com/pmcu/dpjjx/dpjjx26.htm --><HTML><HEAD><TITLE>动态扫描显示接口</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb_2312-80">
<META content="MSHTML 6.00.2800.1106" name=GENERATOR>
<META content="D:\MICROSOFT OFFICE\OFFICE\html.dot" name=Template></HEAD>
<BODY vLink=#800080 link=#0000ff background=""><B><FONT lang=ZH-CN face=宋体
size=5>
<P align=center>动态扫描显示接口</P></FONT></B>
<P align=justify><FONT lang=ZH-CN
face=宋体>动态扫描显示接口是单片机中应用最为广泛的一种显示方式之一。其接口电路是把所有显示器的</FONT><FONT lang=ZH-CN
face=System,黑体>8</FONT><FONT lang=ZH-CN face=宋体>个笔划段</FONT><FONT lang=ZH-CN
face=System,黑体>a-h</FONT><FONT lang=ZH-CN
face=宋体>同名端连在一起,而每一个显示器的公共极</FONT><FONT lang=ZH-CN
face=System,黑体>COM</FONT><FONT lang=ZH-CN face=宋体>是各自独立地受</FONT><FONT lang=ZH-CN
face=System,黑体>I/O</FONT><FONT lang=ZH-CN face=宋体>线控制。</FONT><FONT lang=ZH-CN
face=System,黑体>CPU</FONT><FONT lang=ZH-CN
face=宋体>向字段输出口送出字形码时,所有显示器接收到相同的字形码,但究竟是那个显示器亮,则取决于</FONT><FONT lang=ZH-CN
face=System,黑体>COM</FONT><FONT lang=ZH-CN face=宋体>端,而这一端是由</FONT><FONT
lang=ZH-CN face=System,黑体>I/O</FONT><FONT lang=ZH-CN
face=宋体>控制的,所以我们就可以自行决定何时显示哪一位了。而所谓动态扫描就是指我们采用分时的方法,轮流控制各个显示器的</FONT><FONT
lang=ZH-CN face=System,黑体>COM</FONT><FONT lang=ZH-CN
face=宋体>端,使各个显示器轮流点亮。</FONT></P>
<P align=justify><FONT lang=ZH-CN
face=宋体>在轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的(约</FONT><FONT lang=ZH-CN
face=System,黑体>1ms</FONT><FONT lang=ZH-CN
face=宋体>),但由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。</FONT></P>
<P align=justify><FONT lang=ZH-CN face=宋体>下图所示就是我们的实验板上的动态扫描接口。由</FONT><FONT
lang=ZH-CN face=System,黑体>89C51</FONT><FONT lang=ZH-CN face=宋体>的</FONT><FONT
lang=ZH-CN face=System,黑体>P0</FONT><FONT lang=ZH-CN
face=宋体>口能灌入较大的电流,所以我们采用共阳的数码管,并且不用限流电阻,而只是用两只1N4004进行降压后给数码管供电,这里仅用了两只,实际上还可以扩充。它们的公共端则由</FONT><FONT
lang=ZH-CN face=System,黑体>PNP</FONT><FONT lang=ZH-CN face=宋体>型三极管</FONT><FONT
lang=ZH-CN face=System,黑体>8550</FONT><FONT lang=ZH-CN
face=宋体>控制,显然,如果</FONT><FONT lang=ZH-CN face=System,黑体>8550</FONT><FONT
lang=ZH-CN face=宋体>导通,则相应的数码管就可以亮,而如果</FONT><FONT lang=ZH-CN
face=System,黑体>8550</FONT><FONT lang=ZH-CN face=宋体>截止,则对应的数码管就不可能亮,</FONT><FONT
lang=ZH-CN face=System,黑体>8550</FONT><FONT lang=ZH-CN face=宋体>是由</FONT><FONT
lang=ZH-CN face=System,黑体>P2.7</FONT><FONT lang=ZH-CN face=宋体>,</FONT><FONT
lang=ZH-CN face=System,黑体>P2.6</FONT><FONT lang=ZH-CN
face=宋体>控制的。这样我们就可以通过控制</FONT><FONT lang=ZH-CN face=System,黑体>P27</FONT><FONT
lang=ZH-CN face=宋体>、</FONT><FONT lang=ZH-CN face=System,黑体>P26</FONT><FONT
lang=ZH-CN face=宋体>达到控制某个数码管亮或灭的目的。</FONT></P>
<P align=justify><FONT lang=ZH-CN face=宋体>下面的这个程序,就是用实验板上的数码管显示</FONT><FONT
lang=ZH-CN face=System,黑体>0</FONT><FONT lang=ZH-CN face=宋体>和</FONT><FONT
lang=ZH-CN face=System,黑体>1</FONT><FONT lang=ZH-CN face=宋体>。</FONT></P>
<P align=justify><FONT lang=ZH-CN face=System,黑体>FIRST EQU P2.7 ;</FONT><FONT
lang=ZH-CN face=宋体>第一位数码管的位控制</FONT></P>
<P align=justify><FONT lang=ZH-CN face=System,黑体>SECOND EQU P2.6 ;</FONT><FONT
lang=ZH-CN face=宋体>第二位数码管的位控制</FONT></P>
<P align=justify><FONT lang=ZH-CN face=System,黑体>DISPBUFF EQU 5AH ;</FONT><FONT
lang=ZH-CN face=宋体>显示缓冲区为</FONT><FONT lang=ZH-CN face=System,黑体>5AH</FONT><FONT
lang=ZH-CN face=宋体>和</FONT><FONT lang=ZH-CN face=System,黑体>5BH</FONT></P><FONT
lang=ZH-CN face=System,黑体>
<P align=justify>ORG 0000H</P>
<P align=justify>AJMP START</P>
<P align=justify>ORG 30H</P>
<P align=justify>START:</P></FONT>
<P align=justify><FONT lang=ZH-CN face=System,黑体>MOV SP,#5FH ;</FONT><FONT
lang=ZH-CN face=宋体>设置堆栈</FONT></P>
<P align=justify><FONT lang=ZH-CN face=宋体></FONT><FONT lang=ZH-CN
face=System,黑体>MOV P1,#0FFH</FONT></P><FONT lang=ZH-CN face=System,黑体>
<P align=justify>MOV P0,#0FFH</P></FONT>
<P align=justify><FONT lang=ZH-CN face=System,黑体>MOV P2,#0FFH ;</FONT><FONT
lang=ZH-CN face=宋体>初始化,所显示器,</FONT><FONT lang=ZH-CN
face=System,黑体>LED</FONT><FONT lang=ZH-CN face=宋体>灭</FONT></P>
<P align=justify><FONT lang=ZH-CN face=宋体></FONT><FONT lang=ZH-CN
face=System,黑体>MOV DISPBUFF,#0 ;</FONT><FONT lang=ZH-CN
face=宋体>第一位显示</FONT><FONT lang=ZH-CN face=System,黑体>0</FONT></P>
<P align=justify><FONT lang=ZH-CN face=System,黑体>MOV DISPBUFF+1,#1 ;</FONT><FONT
lang=ZH-CN face=宋体>第二握显示</FONT><FONT lang=ZH-CN face=System,黑体>1</FONT></P><FONT
lang=ZH-CN face=System,黑体>
<P align=justify>LOOP:</P></FONT>
<P align=justify><FONT lang=ZH-CN face=System,黑体>LCALL DISP ;</FONT><FONT
lang=ZH-CN face=宋体>调用显示程序</FONT></P>
<P align=justify><FONT lang=ZH-CN face=宋体></FONT><FONT lang=ZH-CN
face=System,黑体>AJMP LOOP</FONT></P>
<P align=justify><FONT lang=ZH-CN face=System,黑体>;</FONT><FONT lang=ZH-CN
face=宋体>主程序到此结束</FONT></P><FONT lang=ZH-CN face=System,黑体>
<P align=justify>DISP:</P></FONT>
<P align=justify><FONT lang=ZH-CN face=System,黑体>PUSH ACC ;ACC</FONT><FONT
lang=ZH-CN face=宋体>入栈</FONT></P>
<P align=justify><FONT lang=ZH-CN face=宋体></FONT><FONT lang=ZH-CN
face=System,黑体>PUSH PSW ;PSW</FONT><FONT lang=ZH-CN face=宋体>入栈</FONT></P>
<P align=justify><FONT lang=ZH-CN face=宋体></FONT><FONT lang=ZH-CN
face=System,黑体>MOV A,DISPBUFF ;</FONT><FONT lang=ZH-CN
face=宋体>取第一个待显示数</FONT></P>
<P align=justify><FONT lang=ZH-CN face=宋体></FONT><FONT lang=ZH-CN
face=System,黑体>MOV DPTR,#DISPTAB ;</FONT><FONT lang=ZH-CN
face=宋体>字形表首地址</FONT></P>
<P align=justify><FONT lang=ZH-CN face=宋体></FONT><FONT lang=ZH-CN
face=System,黑体>MOVC A,@A+DPTR ;</FONT><FONT lang=ZH-CN face=宋体>取字形码</FONT></P>
<P align=justify><FONT lang=ZH-CN face=宋体></FONT><FONT lang=ZH-CN
face=System,黑体>MOV P0,A ;</FONT><FONT lang=ZH-CN face=宋体>将字形码送</FONT><FONT
lang=ZH-CN face=System,黑体>P0</FONT><FONT lang=ZH-CN face=宋体>位(段口)</FONT></P>
<P align=justify><FONT lang=ZH-CN face=宋体></FONT><FONT lang=ZH-CN
face=System,黑体>CLR FIRST ;</FONT><FONT lang=ZH-CN face=宋体>开第一位显示器位口</FONT></P>
<P align=justify><FONT lang=ZH-CN face=宋体></FONT><FONT lang=ZH-CN
face=System,黑体>LCALL DELAY ;</FONT><FONT lang=ZH-CN face=宋体>延时</FONT><FONT
lang=ZH-CN face=System,黑体>1</FONT><FONT lang=ZH-CN face=宋体>毫秒</FONT></P>
<P align=justify><FONT lang=ZH-CN face=宋体></FONT><FONT lang=ZH-CN
face=System,黑体>SETB FIRST ;</FONT><FONT lang=ZH-CN
face=宋体>关闭第一位显示器(开始准备第二位的数据)</FONT></P>
<P align=justify><FONT lang=ZH-CN face=宋体></FONT><FONT lang=ZH-CN
face=System,黑体>MOV A,DISPBUFF+1 ;</FONT><FONT lang=ZH-CN
face=宋体>取显示缓冲区的第二位</FONT></P>
<P align=justify><FONT lang=ZH-CN face=宋体></FONT><FONT lang=ZH-CN
face=System,黑体>MOV DPTR,#DISPTAB </FONT></P><FONT lang=ZH-CN face=System,黑体>
<P align=justify>MOVC A,@A+DPTR</P></FONT>
<P align=justify><FONT lang=ZH-CN face=System,黑体>MOV P0,A ;</FONT><FONT
lang=ZH-CN face=宋体>将第二个字形码送</FONT><FONT lang=ZH-CN face=System,黑体>P0</FONT><FONT
lang=ZH-CN face=宋体>口</FONT></P>
<P align=justify><FONT lang=ZH-CN face=宋体></FONT><FONT lang=ZH-CN
face=System,黑体>CLR SECOND ;</FONT><FONT lang=ZH-CN face=宋体>开第二位显示器</FONT></P>
<P align=justify><FONT lang=ZH-CN face=宋体></FONT><FONT lang=ZH-CN
face=System,黑体>LCALL DELAY ;</FONT><FONT lang=ZH-CN face=宋体>延时</FONT></P>
<P align=justify><FONT lang=ZH-CN face=宋体></FONT><FONT lang=ZH-CN
face=System,黑体>SETB SECOND ;</FONT><FONT lang=ZH-CN face=宋体>关第二位显示</FONT></P>
<P align=justify><FONT lang=ZH-CN face=宋体></FONT><FONT lang=ZH-CN
face=System,黑体>POP PSW</FONT></P><FONT lang=ZH-CN face=System,黑体>
<P align=justify>POP ACC</P>
<P align=justify>RET</P></FONT>
<P align=justify><FONT lang=ZH-CN face=System,黑体>DELAY: ;</FONT><FONT lang=ZH-CN
face=宋体>延时</FONT><FONT lang=ZH-CN face=System,黑体>1</FONT><FONT lang=ZH-CN
face=宋体>毫秒</FONT></P>
<P align=justify><FONT lang=ZH-CN face=宋体></FONT><FONT lang=ZH-CN
face=System,黑体>PUSH PSW</FONT></P><FONT lang=ZH-CN face=System,黑体>
<P align=justify>SETB RS0</P>
<P align=justify>MOV R7,#50</P>
<P align=justify>D1: MOV R6,#10</P>
<P align=justify>D2: DJNZ R6,$</P>
<P align=justify>DJNZ R7,D1</P>
<P align=justify>POP PSW</P>
<P align=justify>RET</P>
<P align=justify>DISPTAB:DB 28H,7EH,0a4H,64H,72H,61H,21H,7CH,20H,60H </P>
<P align=justify>END</P></FONT>
<P align=justify><FONT lang=ZH-CN face=宋体>从上面的例子中可以看出,动态扫描显示必须由</FONT><FONT
lang=ZH-CN face=System,黑体>CPU</FONT><FONT lang=ZH-CN
face=宋体>不断地调用显示程序,才能保证持续不断的显示。</FONT></P>
<P align=justify><FONT lang=ZH-CN
face=宋体>上面的这个程序可以实现数字的显示,但不太实用,为什么呢?这里仅是显示两个数字,并没有做其他的工作,因此,两个数码管轮流显示</FONT><FONT
lang=ZH-CN face=System,黑体>1</FONT><FONT lang=ZH-CN
face=宋体>毫秒,没有问题,实际的工作中,当然不可能只显示两个数字,还是要做其他的事情的,这样在二次调用显示程序之间的时间间隔就不一不定了,如果时间间隔比较长,就会使显示不连续。而实际工作中是很难保证所有工作都能在很短时间内完成的。况且这个显示程序也有点“浪费”,每个数码管显示都要占用</FONT><FONT
lang=ZH-CN face=System,黑体>1</FONT><FONT lang=ZH-CN
face=宋体>个毫秒的时间,这在很多合是不允许的,怎么办呢?我们可以借助于定时器,定时时间一到,产生中断,点亮一个数码管,然后马上返回,这个数码管就会一直亮到下一次定时时间到,而不用调用延时程序了,这段时间可以留给主程序干其他的事。到下一次定时时间到则显示下一个数码管,这样就很少浪费了。</FONT></P>
<P align=justify><FONT lang=ZH-CN face=System,黑体>Counter EQU 59H ;</FONT><FONT
lang=ZH-CN face=宋体>计数器,显示程序通过它得知现正显示哪个数码管</FONT></P>
<P align=justify><FONT lang=ZH-CN face=System,黑体>FIRST EQU P2.7 ;</FONT><FONT
lang=ZH-CN face=宋体>第一位数码管的位控制</FONT></P>
<P align=justify><FONT lang=ZH-CN face=System,黑体>SECOND EQU P2.6 ;</FONT><FONT
lang=ZH-CN face=宋体>第二位数码管的位控制</FONT></P>
<P align=justify><FONT lang=ZH-CN face=System,黑体>DISPBUFF EQU 5AH ;</FONT><FONT
lang=ZH-CN face=宋体>显示缓冲区为</FONT><FONT lang=ZH-CN face=System,黑体>5AH</FONT><FONT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -