⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dpjjx26.htm

📁 单片机入门教程.rar
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<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&#9;&#9;EQU&#9;P2.7&#9;;</font><FONT FACE="宋体" LANG="ZH-CN">第一位数码管的位控制</font></P>
<P ALIGN="JUSTIFY"><FONT FACE="System,黑体" LANG="ZH-CN">SECOND &#9;EQU&#9;P2.6&#9;;</font><FONT FACE="宋体" LANG="ZH-CN">第二位数码管的位控制</font></P>
<P ALIGN="JUSTIFY"><FONT FACE="System,黑体" LANG="ZH-CN">DISPBUFF&#9;EQU&#9;5AH&#9;;</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">&#9;ORG&#9;0000H</P>
<P ALIGN="JUSTIFY">&#9;AJMP&#9;START</P>
<P ALIGN="JUSTIFY">&#9;ORG&#9;30H</P>
<P ALIGN="JUSTIFY">START:</P>
</FONT><P ALIGN="JUSTIFY"><FONT FACE="System,黑体" LANG="ZH-CN">&#9;MOV&#9;SP,#5FH&#9;&#9;;</font><FONT FACE="宋体" LANG="ZH-CN">设置堆栈</font></P><P ALIGN="JUSTIFY">
<FONT FACE="宋体" LANG="ZH-CN">&#9;</font><FONT FACE="System,黑体" LANG="ZH-CN">MOV&#9;P1,#0FFH</font></P><FONT FACE="System,黑体" LANG="ZH-CN">
<P ALIGN="JUSTIFY">&#9;MOV&#9;P0,#0FFH</P>
</FONT><P ALIGN="JUSTIFY"><FONT FACE="System,黑体" LANG="ZH-CN">&#9;MOV&#9;P2,#0FFH&#9;;</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">&#9;</font><FONT FACE="System,黑体" LANG="ZH-CN">MOV&#9;DISPBUFF,#0&#9;;</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">&#9;MOV&#9;DISPBUFF+1,#1&#9;;</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">&#9;LCALL&#9;DISP&#9;&#9;;</font><FONT FACE="宋体" LANG="ZH-CN">调用显示程序</font></P><P ALIGN="JUSTIFY">
<FONT FACE="宋体" LANG="ZH-CN">&#9;</font><FONT FACE="System,黑体" LANG="ZH-CN">AJMP&#9;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">&#9;PUSH&#9;ACC&#9;&#9;;ACC</font><FONT FACE="宋体" LANG="ZH-CN">入栈</font></P><P ALIGN="JUSTIFY">
<FONT FACE="宋体" LANG="ZH-CN">&#9;</font><FONT FACE="System,黑体" LANG="ZH-CN">PUSH&#9;PSW&#9;&#9;;PSW</FONT><FONT FACE="宋体" LANG="ZH-CN">入栈</font></P><P ALIGN="JUSTIFY">
<FONT FACE="宋体" LANG="ZH-CN">&#9;</font><FONT FACE="System,黑体" LANG="ZH-CN">MOV&#9;A,DISPBUFF&#9;;</FONT><FONT FACE="宋体" LANG="ZH-CN">取第一个待显示数</font></P><P ALIGN="JUSTIFY">
<FONT FACE="宋体" LANG="ZH-CN">&#9;</font><FONT FACE="System,黑体" LANG="ZH-CN">MOV&#9;DPTR,#DISPTAB&#9;;</FONT><FONT FACE="宋体" LANG="ZH-CN">字形表首地址</font></P><P ALIGN="JUSTIFY">
<FONT FACE="宋体" LANG="ZH-CN">&#9;</font><FONT FACE="System,黑体" LANG="ZH-CN">MOVC&#9;A,@A+DPTR&#9;;</FONT><FONT FACE="宋体" LANG="ZH-CN">取字形码</font></P><P ALIGN="JUSTIFY">
<FONT FACE="宋体" LANG="ZH-CN">&#9;</font><FONT FACE="System,黑体" LANG="ZH-CN">MOV&#9;P0,A&#9;&#9;;</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">&#9;</font><FONT FACE="System,黑体" LANG="ZH-CN">CLR&#9;FIRST&#9;&#9;;</FONT><FONT FACE="宋体" LANG="ZH-CN">开第一位显示器位口</font></P><P ALIGN="JUSTIFY">
<FONT FACE="宋体" LANG="ZH-CN">&#9;</font><FONT FACE="System,黑体" LANG="ZH-CN">LCALL&#9;DELAY&#9;&#9;;</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">&#9;</font><FONT FACE="System,黑体" LANG="ZH-CN">SETB&#9;FIRST&#9;&#9;;</FONT><FONT FACE="宋体" LANG="ZH-CN">关闭第一位显示器(开始准备第二位的数据)</font></P><P ALIGN="JUSTIFY">
<FONT FACE="宋体" LANG="ZH-CN">&#9;</font><FONT FACE="System,黑体" LANG="ZH-CN">MOV&#9;A,DISPBUFF+1&#9;;</FONT><FONT FACE="宋体" LANG="ZH-CN">取显示缓冲区的第二位</font></P><P ALIGN="JUSTIFY">
<FONT FACE="宋体" LANG="ZH-CN">&#9;</font><FONT FACE="System,黑体" LANG="ZH-CN">MOV&#9;DPTR,#DISPTAB&#9;</font></P><FONT FACE="System,黑体" LANG="ZH-CN">
<P ALIGN="JUSTIFY">&#9;MOVC&#9;A,@A+DPTR</P>
</FONT><P ALIGN="JUSTIFY"><FONT FACE="System,黑体" LANG="ZH-CN">&#9;MOV&#9;P0,A&#9;&#9;;</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">&#9;</font><FONT FACE="System,黑体" LANG="ZH-CN">CLR&#9;SECOND&#9;&#9;;</FONT><FONT FACE="宋体" LANG="ZH-CN">开第二位显示器</font></P><P ALIGN="JUSTIFY">
<FONT FACE="宋体" LANG="ZH-CN">&#9;</font><FONT FACE="System,黑体" LANG="ZH-CN">LCALL&#9;DELAY&#9;&#9;;</FONT><FONT FACE="宋体" LANG="ZH-CN">延时</font></P><P ALIGN="JUSTIFY">
<FONT FACE="宋体" LANG="ZH-CN">&#9;</font><FONT FACE="System,黑体" LANG="ZH-CN">SETB&#9;SECOND&#9;&#9;;</FONT><FONT FACE="宋体" LANG="ZH-CN">关第二位显示</font></P><P ALIGN="JUSTIFY">
<FONT FACE="宋体" LANG="ZH-CN">&#9;</font><FONT FACE="System,黑体" LANG="ZH-CN">POP&#9;PSW</font></P><FONT FACE="System,黑体" LANG="ZH-CN">
<P ALIGN="JUSTIFY">&#9;POP&#9;ACC</P>
<P ALIGN="JUSTIFY">&#9;RET</P>
</FONT><P ALIGN="JUSTIFY"><FONT FACE="System,黑体" LANG="ZH-CN">DELAY:&#9;&#9;&#9;;</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">&#9;</font><FONT FACE="System,黑体" LANG="ZH-CN">PUSH&#9;PSW</font></P><FONT FACE="System,黑体" LANG="ZH-CN">
<P ALIGN="JUSTIFY">&#9;SETB&#9;RS0</P>
<P ALIGN="JUSTIFY">&#9;MOV&#9;R7,#50</P>
<P ALIGN="JUSTIFY">D1:&#9;MOV&#9;R6,#10</P>
<P ALIGN="JUSTIFY">D2:&#9;DJNZ&#9;R6,$</P>
<P ALIGN="JUSTIFY">&#9;DJNZ&#9;R7,D1</P>
<P ALIGN="JUSTIFY">&#9;POP&#9;PSW</P>
<P ALIGN="JUSTIFY">&#9;RET</P>
<P ALIGN="JUSTIFY">DISPTAB:DB 28H,7EH,0a4H,64H,72H,61H,21H,7CH,20H,60H&#9;</P>
<P ALIGN="JUSTIFY">&#9;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&#9;&#9;EQU&#9;59H&#9;;</font><FONT FACE="宋体" LANG="ZH-CN">计数器,显示程序通过它得知现正显示哪个数码管</font></P>
<P ALIGN="JUSTIFY"><FONT FACE="System,黑体" LANG="ZH-CN">FIRST&#9;&#9;EQU&#9;P2.7&#9;;</font><FONT FACE="宋体" LANG="ZH-CN">第一位数码管的位控制</font></P>
<P ALIGN="JUSTIFY"><FONT FACE="System,黑体" LANG="ZH-CN">SECOND &#9;EQU&#9;P2.6&#9;;</font><FONT FACE="宋体" LANG="ZH-CN">第二位数码管的位控制</font></P>
<P ALIGN="JUSTIFY"><FONT FACE="System,黑体" LANG="ZH-CN">DISPBUFF&#9;EQU&#9;5AH&#9;;</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">&#9;ORG&#9;0000H</P>
<P ALIGN="JUSTIFY">&#9;AJMP&#9;START</P>
</FONT><P ALIGN="JUSTIFY"><FONT FACE="System,黑体" LANG="ZH-CN">&#9;ORG&#9;000BH&#9;&#9;;</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">&#9;</font><FONT FACE="System,黑体" LANG="ZH-CN">AJMP&#9;DISP&#9;&#9;;</FONT><FONT FACE="宋体" LANG="ZH-CN">显示程序</font></P><P ALIGN="JUSTIFY">
<FONT FACE="宋体" LANG="ZH-CN">&#9;</font><FONT FACE="System,黑体" LANG="ZH-CN">ORG&#9;30H</font></P><FONT FACE="System,黑体" LANG="ZH-CN">
<P ALIGN="JUSTIFY">START:</P>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -