📄 dpjjx12.htm
字号:
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb_2312-80">
<META NAME="Generator" CONTENT="Microsoft FrontPage 5.0">
<TITLE>单片机指令(三)</TITLE>
</HEAD>
<BODY background="../back.jpg">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=2>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">单片机指令(三)</P>
</FONT>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<FONT SIZE=2>2</font><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>、累加器</FONT><FONT SIZE=2>A</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>与片外</FONT><FONT SIZE=2>RAM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>之间的数据传递类指令</font></P>
<FONT SIZE=2>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">MOVX A,@Ri</P>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">MOVX @Ri,A</P>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">MOVX	#9; A,@DPTR</P>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">MOVX @DPTR,A</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">说明:</P>
</FONT>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<FONT SIZE=2>1</font><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>)在</FONT><FONT SIZE=2>51</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>中,与外部存储器</FONT><FONT SIZE=2>RAM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>打交道的只可以是</FONT><FONT SIZE=2>A</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>累加器。所有需要送入外部</FONT><FONT SIZE=2>RAM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>的数据必需要通过</FONT><FONT SIZE=2>A</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>送去,而所有要读入的外部</FONT><FONT SIZE=2>RAM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>中的数据也必需通过</FONT><FONT SIZE=2>A</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>读入。在此我们可以看出内外部</FONT><FONT SIZE=2>RAM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>的区别了,内部</FONT><FONT SIZE=2>RAM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>间可以直接进行数据的传递,而外部则不行,比如,要将外部</FONT><FONT SIZE=2>RAM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>中某一单元(设为</FONT><FONT SIZE=2>0100H</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>单元的数据)送入另一个单元(设为</FONT><FONT SIZE=2>0200H</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>单元),也必须先将</FONT><FONT SIZE=2>0100H</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>单元中的内容读入</FONT><FONT SIZE=2>A</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>,然后再送到</FONT><FONT SIZE=2>0200H</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>单元中去。</font></P>
<p style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=2>2)要读或写外部的</font><FONT SIZE=2>RAM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>,当然也必须要知道</FONT><FONT SIZE=2>RAM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>的地址,在后两条指令中,地址是被直接放在</FONT><FONT SIZE=2>DPTR</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>中的。而前两条指令,由于</FONT><FONT SIZE=2>Ri</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>(即</FONT><FONT SIZE=2>R0</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>或</FONT><FONT SIZE=2>R1</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>)只是一个</FONT><FONT SIZE=2>8</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>位的寄存器,所以只提供低</FONT><FONT SIZE=2>8</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>位地址。因为有时扩展的外部</FONT><FONT SIZE=2>RAM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>的数量比较少,少于或等于</FONT><FONT SIZE=2>256</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>个,就只需要提供</FONT><FONT SIZE=2>8</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>位地址就够了。</font><font size="2"></LI></font><FONT FACE="宋体" LANG="ZH-CN" SIZE=3></p>
<p style="line-height: 150%; margin-top: 0; margin-bottom: 0"></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">
3)使用时应当首先将要读或写的地址送入</FONT><FONT SIZE=2>DPTR</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>或</FONT><FONT SIZE=2>Ri</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>中,然后再用读写命令。</font><font size="2"></LI></font><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><p style="line-height: 150%; margin-top: 0; margin-bottom: 0"></P></font>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=2>例:将外部</font><FONT SIZE=2>RAM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>中</FONT><FONT SIZE=2>100H</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>单元中的内容送入外部</FONT><FONT SIZE=2>RAM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>中</FONT><FONT SIZE=2>200H</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>单元中。</font></P>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<FONT SIZE=2>MOV DPTR</font><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>,</FONT><FONT SIZE=2>#0100H</font></P>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<FONT SIZE=2>MOVX A</font><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>,</FONT><FONT SIZE=2>@DPTR</font></P>
<FONT SIZE=2>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">MOV DPTR,#0200H</P>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">MOVX @DPTR,A</P>
</FONT>
<p style="line-height: 150%; margin-top: 0; margin-bottom: 0"> </p>
<p style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<font face="宋体" size="2">3、</font><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>程序存储器向累加器</font><FONT SIZE=2>A</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>传送指令</font><font size="2"></LI></font></p>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<FONT SIZE=2> MOVC A</font><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>,</FONT><FONT SIZE=2>@A+DPTR</font></P>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=2> 本指令是将</font><B><I><FONT SIZE=2>ROM</font></i></B><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>中的数送入</FONT><FONT SIZE=2>A</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>中。本指令也被称为查表指令,常用此指令来查一个已做好在</FONT><B><I><FONT SIZE=2>ROM</font></i></B><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>中的表格</font></P>
<FONT FACE="宋体" LANG="ZH-CN" SIZE=2>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">
说明:</P></font>
<p style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=2>
此条指令引出一个新的寻址方法:变址寻址。本指令是要在</font><FONT SIZE=2>ROM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>的一个地址单元中找出数据,显然必须知道这个单元的地址,这个单元的地址是这样确定的:在执行本指令立脚点</FONT><FONT SIZE=2>DPTR</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>中有一个数,</FONT><FONT SIZE=2>A</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>中有一个数,执行指令时,将</FONT><FONT SIZE=2>A</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>和</FONT><FONT SIZE=2>DPTR</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>中的数加起为,就成为要查找的单元的地址。</font><font size="2"></LI></font><FONT FACE="宋体" LANG="ZH-CN" SIZE=3></p>
<p style="line-height: 150%; margin-top: 0; margin-bottom: 0"></P>
</FONT>
<p style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=2>1)查找到的结果被放在</font><FONT SIZE=2>A</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>中,因此,本条指令执行前后,</FONT><FONT SIZE=2>A</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>中的值不一定相同。</font><font size="2"></LI></font><FONT FACE="宋体" LANG="ZH-CN" SIZE=3></p>
<p style="line-height: 150%; margin-top: 0; margin-bottom: 0"></P></font>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=2> 例:有一个数在</font><FONT SIZE=2>R0</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>中,要求用查表的方法确定它的平方值(此数的取值范围是</FONT><FONT SIZE=2>0-5</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>)</font></P>
<DIR>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<FONT SIZE=2>MOV DPTR</font><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>,</FONT><FONT SIZE=2>#TABLE</font></P>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<FONT SIZE=2>MOV A</font><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>,</FONT><FONT SIZE=2>R0</font></P>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<FONT SIZE=2>MOVC A</font><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>,</FONT><FONT SIZE=2>@A+DPTR</font></P>
<FONT SIZE=2>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">.</P>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">.</P>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">TABLE:	DB 0,1,4,9,16,25</P>
</FONT>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=2>设</font><FONT SIZE=2>R0</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>中的值为</FONT><FONT SIZE=2>2</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>,送入</FONT><FONT SIZE=2>A</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>中,而</FONT><FONT SIZE=2>DPTR</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>中的值则为</FONT><FONT SIZE=2>TABLE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>,则最终确定的</FONT><FONT SIZE=2>ROM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>单元的地址就是</FONT><FONT SIZE=2>TABLE+2</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>,也就是到这个单元中去取数,取到的是</FONT><FONT SIZE=2>4</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>,显然它正是</FONT><FONT SIZE=2>2</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>的平方。其它数据也可以类推。</font></P><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0"><HR ALIGN="RIGHT" WIDTH="4%" SIZE=1><HR ALIGN="RIGHT" WIDTH="4%" SIZE=1><HR ALIGN="RIGHT" WIDTH="4%" SIZE=1></FONT>
<FONT FACE="宋体" LANG="ZH-CN" SIZE=2>
<p style="line-height: 150%; margin-top: 0; margin-bottom: 0">标号的真实含义:从这个地方也可以看到另一个问题,我们使用了标号来替代具体的单元地址。事实上,标号的真实含义就是地址数值。在这里它代表了,</FONT><FONT SIZE=2>0</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>,</FONT><FONT SIZE=2>1</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>,</FONT><FONT SIZE=2>4</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>,</FONT><FONT SIZE=2>9</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>,</FONT><FONT SIZE=2>16</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>,</FONT><FONT SIZE=2>25</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>这几个数据在</FONT><FONT SIZE=2>ROM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>中存放的起点位置。而在以前我们学过的如</FONT><FONT SIZE=2>LCALL DELAY</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>指令中,</FONT><FONT SIZE=2>DELAY </FONT>
<FONT FACE="宋体" LANG="ZH-CN" SIZE=2>则代表了以</FONT><FONT SIZE=2>DELAY</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>为标号的那段程序在</FONT><FONT SIZE=2>ROM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>中存放的起始地址。事实上,</FONT><FONT SIZE=2>CPU</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>正是通过这个地址才找到这段程序的。</p>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>
<p style="line-height: 150%; margin-top: 0; margin-bottom: 0"></P>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0"><HR ALIGN="RIGHT" WIDTH="4%" SIZE=1></FONT>
<FONT FACE="宋体" LANG="ZH-CN" SIZE=2>
<p style="line-height: 150%; margin-top: 0; margin-bottom: 0">可以通过以下的例子再来看一看标号的含义:</p>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>
<p style="line-height: 150%; margin-top: 0; margin-bottom: 0"></P>
<P ALIGN="JUSTIFY" style="line-height: 150%; margin-top: 0; margin-bottom: 0"><HR ALIGN="RIGHT" WIDTH="4%" SIZE=1></FONT>
<p style="line-height: 150%; margin-top: 0; margin-bottom: 0"><FONT SIZE=2>MOV DPTR</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2>,</FONT><FONT SIZE=2>#100H</p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -