📄 单片机指令(三).htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0047)http://www.onestudy.net/download/elec/dpj10.htm -->
<!-- saved from url=(0048)http://www.21icsearch.com/pmcu/dpjjx/dpjjx12.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></HEAD>
<BODY bgColor=#ccffcc background=""><FONT lang=ZH-CN face=宋体 size=3>
<P align=justify>单片机指令(三)</P></FONT>
<P align=justify><FONT size=3>2</FONT><FONT lang=ZH-CN face=宋体
size=3>、累加器</FONT><FONT size=3>A</FONT><FONT lang=ZH-CN face=宋体
size=3>与片外</FONT><FONT size=3>RAM</FONT><FONT lang=ZH-CN face=宋体
size=3>之间的数据传递类指令</FONT></P><FONT size=3>
<P align=justify>MOVX A,@Ri</P>
<P align=justify>MOVX @Ri,A</P>
<P align=justify>MOVX A,@DPTR</P>
<P align=justify>MOVX @DPTR,A</P></FONT><FONT lang=ZH-CN face=宋体 size=3>
<P align=justify>说明:</P></FONT>
<P align=justify><FONT size=3>1</FONT><FONT lang=ZH-CN face=宋体
size=3>)在</FONT><FONT size=3>51</FONT><FONT lang=ZH-CN face=宋体
size=3>中,与外部存储器</FONT><FONT size=3>RAM</FONT><FONT lang=ZH-CN face=宋体
size=3>打交道的只可以是</FONT><FONT size=3>A</FONT><FONT lang=ZH-CN face=宋体
size=3>累加器。所有需要送入外部</FONT><FONT size=3>RAM</FONT><FONT lang=ZH-CN face=宋体
size=3>的数据必需要通过</FONT><FONT size=3>A</FONT><FONT lang=ZH-CN face=宋体
size=3>送去,而所有要读入的外部</FONT><FONT size=3>RAM</FONT><FONT lang=ZH-CN face=宋体
size=3>中的数据也必需通过</FONT><FONT size=3>A</FONT><FONT lang=ZH-CN face=宋体
size=3>读入。在此我们可以看出内外部</FONT><FONT size=3>RAM</FONT><FONT lang=ZH-CN face=宋体
size=3>的区别了,内部</FONT><FONT size=3>RAM</FONT><FONT lang=ZH-CN face=宋体
size=3>间可以直接进行数据的传递,而外部则不行,比如,要将外部</FONT><FONT size=3>RAM</FONT><FONT lang=ZH-CN
face=宋体 size=3>中某一单元(设为</FONT><FONT size=3>0100H</FONT><FONT lang=ZH-CN face=宋体
size=3>单元的数据)送入另一个单元(设为</FONT><FONT size=3>0200H</FONT><FONT lang=ZH-CN face=宋体
size=3>单元),也必须先将</FONT><FONT size=3>0100H</FONT><FONT lang=ZH-CN face=宋体
size=3>单元中的内容读入</FONT><FONT size=3>A</FONT><FONT lang=ZH-CN face=宋体
size=3>,然后再送到</FONT><FONT size=3>0200H</FONT><FONT lang=ZH-CN face=宋体
size=3>单元中去。</FONT></P>
<OL start=2><FONT lang=ZH-CN face=宋体 size=3>
<P align=justify></FONT>
<LI><FONT lang=ZH-CN face=宋体 size=3>要读或写外部的</FONT><FONT size=3>RAM</FONT><FONT
lang=ZH-CN face=宋体 size=3>,当然也必须要知道</FONT><FONT size=3>RAM</FONT><FONT
lang=ZH-CN face=宋体 size=3>的地址,在后两条指令中,地址是被直接放在</FONT><FONT
size=3>DPTR</FONT><FONT lang=ZH-CN face=宋体 size=3>中的。而前两条指令,由于</FONT><FONT
size=3>Ri</FONT><FONT lang=ZH-CN face=宋体 size=3>(即</FONT><FONT
size=3>R0</FONT><FONT lang=ZH-CN face=宋体 size=3>或</FONT><FONT
size=3>R1</FONT><FONT lang=ZH-CN face=宋体 size=3>)只是一个</FONT><FONT
size=3>8</FONT><FONT lang=ZH-CN face=宋体 size=3>位的寄存器,所以只提供低</FONT><FONT
size=3>8</FONT><FONT lang=ZH-CN face=宋体 size=3>位地址。因为有时扩展的外部</FONT><FONT
size=3>RAM</FONT><FONT lang=ZH-CN face=宋体 size=3>的数量比较少,少于或等于</FONT><FONT
size=3>256</FONT><FONT lang=ZH-CN face=宋体 size=3>个,就只需要提供</FONT><FONT
size=3>8</FONT><FONT lang=ZH-CN face=宋体 size=3>位地址就够了。</FONT><FONT lang=ZH-CN
face=宋体 size=3>
<P></P>
<P align=justify></FONT></P>
<LI><FONT lang=ZH-CN face=宋体 size=3>使用时应当首先将要读或写的地址送入</FONT><FONT
size=3>DPTR</FONT><FONT lang=ZH-CN face=宋体 size=3>或</FONT><FONT
size=3>Ri</FONT><FONT lang=ZH-CN face=宋体 size=3>中,然后再用读写命令。</FONT><FONT
lang=ZH-CN face=宋体 size=3>
<P></P></FONT></LI></OL>
<P align=justify><FONT lang=ZH-CN face=宋体 size=3>例:将外部</FONT><FONT
size=3>RAM</FONT><FONT lang=ZH-CN face=宋体 size=3>中</FONT><FONT
size=3>100H</FONT><FONT lang=ZH-CN face=宋体 size=3>单元中的内容送入外部</FONT><FONT
size=3>RAM</FONT><FONT lang=ZH-CN face=宋体 size=3>中</FONT><FONT
size=3>200H</FONT><FONT lang=ZH-CN face=宋体 size=3>单元中。</FONT></P>
<P align=justify><FONT size=3>MOV DPTR</FONT><FONT lang=ZH-CN face=宋体
size=3>,</FONT><FONT size=3>#0100H</FONT></P>
<P align=justify><FONT size=3>MOVX A</FONT><FONT lang=ZH-CN face=宋体
size=3>,</FONT><FONT size=3>@DPTR</FONT></P><FONT size=3>
<P align=justify>MOV DPTR,#0200H</P>
<P align=justify>MOVX @DPTR,A</P></FONT>
<OL start=3><FONT size=3></FONT><FONT lang=ZH-CN face=宋体 size=3>
<P align=justify></FONT>
<LI><FONT lang=ZH-CN face=宋体 size=3>程序存储器向累加器</FONT><FONT size=3>A</FONT><FONT
lang=ZH-CN face=宋体 size=3>传送指令</FONT><FONT lang=ZH-CN face=宋体 size=3>
<P></P></FONT></LI></OL>
<DIR><FONT lang=ZH-CN face=宋体 size=3></FONT>
<P align=justify><FONT size=3>MOVC A</FONT><FONT lang=ZH-CN face=宋体
size=3>,</FONT><FONT size=3>@A+DPTR</FONT></P>
<P align=justify><FONT lang=ZH-CN face=宋体 size=3>本指令是将</FONT><B><I><FONT
size=3>ROM</FONT></I></B><FONT lang=ZH-CN face=宋体 size=3>中的数送入</FONT><FONT
size=3>A</FONT><FONT lang=ZH-CN face=宋体
size=3>中。本指令也被称为查表指令,常用此指令来查一个已做好在</FONT><B><I><FONT
size=3>ROM</FONT></I></B><FONT lang=ZH-CN face=宋体 size=3>中的表格</FONT></P><FONT
lang=ZH-CN face=宋体 size=3>
<P align=justify>说明:</P></FONT></DIR>
<OL><FONT lang=ZH-CN face=宋体 size=3>
<P align=justify></FONT>
<LI><FONT lang=ZH-CN face=宋体 size=3>此条指令引出一个新的寻址方法:变址寻址。本指令是要在</FONT><FONT
size=3>ROM</FONT><FONT lang=ZH-CN face=宋体
size=3>的一个地址单元中找出数据,显然必须知道这个单元的地址,这个单元的地址是这样确定的:在执行本指令立脚点</FONT><FONT
size=3>DPTR</FONT><FONT lang=ZH-CN face=宋体 size=3>中有一个数,</FONT><FONT
size=3>A</FONT><FONT lang=ZH-CN face=宋体 size=3>中有一个数,执行指令时,将</FONT><FONT
size=3>A</FONT><FONT lang=ZH-CN face=宋体 size=3>和</FONT><FONT
size=3>DPTR</FONT><FONT lang=ZH-CN face=宋体
size=3>中的数加起为,就成为要查找的单元的地址。</FONT><FONT lang=ZH-CN face=宋体 size=3>
<P></P>
<P align=justify></FONT></P>
<LI><FONT lang=ZH-CN face=宋体 size=3>查找到的结果被放在</FONT><FONT size=3>A</FONT><FONT
lang=ZH-CN face=宋体 size=3>中,因此,本条指令执行前后,</FONT><FONT size=3>A</FONT><FONT
lang=ZH-CN face=宋体 size=3>中的值不一定相同。</FONT><FONT lang=ZH-CN face=宋体 size=3>
<P></P></FONT></LI></OL>
<DIR>
<P align=justify><FONT lang=ZH-CN face=宋体 size=3>例:有一个数在</FONT><FONT
size=3>R0</FONT><FONT lang=ZH-CN face=宋体
size=3>中,要求用查表的方法确定它的平方值(此数的取值范围是</FONT><FONT size=3>0-5</FONT><FONT lang=ZH-CN
face=宋体 size=3>)</FONT></P>
<P align=justify><FONT size=3>MOV DPTR</FONT><FONT lang=ZH-CN face=宋体
size=3>,</FONT><FONT size=3>#TABLE</FONT></P>
<P align=justify><FONT size=3>MOV A</FONT><FONT lang=ZH-CN face=宋体
size=3>,</FONT><FONT size=3>R0</FONT></P>
<P align=justify><FONT size=3>MOVC A</FONT><FONT lang=ZH-CN face=宋体
size=3>,</FONT><FONT size=3>@A+DPTR</FONT></P><FONT size=3>
<P align=justify>.</P>
<P align=justify>.</P>
<P align=justify>TABLE: DB 0,1,4,9,16,25</P></FONT>
<P align=justify><FONT lang=ZH-CN face=宋体 size=3>设</FONT><FONT
size=3>R0</FONT><FONT lang=ZH-CN face=宋体 size=3>中的值为</FONT><FONT
size=3>2</FONT><FONT lang=ZH-CN face=宋体 size=3>,送入</FONT><FONT
size=3>A</FONT><FONT lang=ZH-CN face=宋体 size=3>中,而</FONT><FONT
size=3>DPTR</FONT><FONT lang=ZH-CN face=宋体 size=3>中的值则为</FONT><FONT
size=3>TABLE</FONT><FONT lang=ZH-CN face=宋体 size=3>,则最终确定的</FONT><FONT
size=3>ROM</FONT><FONT lang=ZH-CN face=宋体 size=3>单元的地址就是</FONT><FONT
size=3>TABLE+2</FONT><FONT lang=ZH-CN face=宋体
size=3>,也就是到这个单元中去取数,取到的是</FONT><FONT size=3>4</FONT><FONT lang=ZH-CN face=宋体
size=3>,显然它正是</FONT><FONT size=3>2</FONT><FONT lang=ZH-CN face=宋体
size=3>的平方。其它数据也可以类推。</FONT></P><FONT lang=ZH-CN face=宋体 size=3>
<P align=justify>
<HR align=right width="4%" SIZE=1>
<HR align=right width="4%" SIZE=1>
<HR align=right width="4%" SIZE=1>
标号的真实含义:从这个地方也可以看到另一个问题,我们使用了标号来替代具体的单元地址。事实上,标号的真实含义就是地址数值。在这里它代表了,</FONT><FONT
size=3>0</FONT><FONT lang=ZH-CN face=宋体 size=3>,</FONT><FONT
size=3>1</FONT><FONT lang=ZH-CN face=宋体 size=3>,</FONT><FONT
size=3>4</FONT><FONT lang=ZH-CN face=宋体 size=3>,</FONT><FONT
size=3>9</FONT><FONT lang=ZH-CN face=宋体 size=3>,</FONT><FONT
size=3>16</FONT><FONT lang=ZH-CN face=宋体 size=3>,</FONT><FONT
size=3>25</FONT><FONT lang=ZH-CN face=宋体 size=3>这几个数据在</FONT><FONT
size=3>ROM</FONT><FONT lang=ZH-CN face=宋体 size=3>中存放的起点位置。而在以前我们学过的如</FONT><FONT
size=3>LCALL DELAY</FONT><FONT lang=ZH-CN face=宋体 size=3>指令中,</FONT><FONT
size=3>DELAY </FONT><FONT lang=ZH-CN face=宋体 size=3>则代表了以</FONT><FONT
size=3>DELAY</FONT><FONT lang=ZH-CN face=宋体 size=3>为标号的那段程序在</FONT><FONT
size=3>ROM</FONT><FONT lang=ZH-CN face=宋体 size=3>中存放的起始地址。事实上,</FONT><FONT
size=3>CPU</FONT><FONT lang=ZH-CN face=宋体 size=3>正是通过这个地址才找到这段程序的。
<P></P>
<P align=justify>
<HR align=right width="4%" SIZE=1>
可以通过以下的例子再来看一看标号的含义:
<P></P>
<P align=justify>
<HR align=right width="4%" SIZE=1>
</FONT><FONT size=3>MOV DPTR</FONT><FONT lang=ZH-CN face=宋体 size=3>,</FONT><FONT
size=3>#100H
<P></P></FONT><FONT lang=ZH-CN face=宋体 size=3>
<P align=justify>
<HR align=right width="4%" SIZE=1>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -