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