📄 dpjjx15.htm
字号:
<FONT FACE="System" LANG="ZH-CN">MOV	A</font><FONT FACE="宋体" LANG="ZH-CN">,</FONT><FONT FACE="System" LANG="ZH-CN">R0			;</FONT><FONT FACE="宋体" LANG="ZH-CN">从</FONT><FONT FACE="System" LANG="ZH-CN">R0</FONT><FONT FACE="宋体" LANG="ZH-CN">中取数(详见下面说明)</font></P>
<P ALIGN="JUSTIFY"><FONT FACE="System" LANG="ZH-CN">MOV	B</font><FONT FACE="宋体" LANG="ZH-CN">,</FONT><FONT FACE="System" LANG="ZH-CN">#2				</font></P><P ALIGN="JUSTIFY">
<FONT FACE="System" LANG="ZH-CN">MUL	A</font><FONT FACE="宋体" LANG="ZH-CN">,</FONT><FONT FACE="System" LANG="ZH-CN">B</FONT><FONT FACE="宋体" LANG="ZH-CN">			</FONT><FONT FACE="System" LANG="ZH-CN">;A</FONT><FONT FACE="宋体" LANG="ZH-CN">中的值乘</FONT><FONT FACE="System" LANG="ZH-CN">2</FONT><FONT FACE="宋体" LANG="ZH-CN">(详见下面的说明)</font></P>
<P ALIGN="JUSTIFY"><FONT FACE="System" LANG="ZH-CN">JMP	A</font><FONT FACE="宋体" LANG="ZH-CN">,</FONT><FONT FACE="System" LANG="ZH-CN">@A+DPTR	 ;</FONT><FONT FACE="宋体" LANG="ZH-CN">跳转</font></P></DIR>
</DIR>
<P ALIGN="JUSTIFY"><FONT FACE="System" LANG="ZH-CN">TAB:	AJMP	S1</font><FONT FACE="宋体" LANG="ZH-CN">			</FONT><FONT FACE="System" LANG="ZH-CN">;</FONT><FONT FACE="宋体" LANG="ZH-CN">跳转表格</font></P><P ALIGN="JUSTIFY">
<FONT FACE="宋体" LANG="ZH-CN">	</font><FONT FACE="System" LANG="ZH-CN">AJMP	S2</font></P><FONT FACE="System" LANG="ZH-CN">
<P ALIGN="JUSTIFY">	AJMP	S3</P>
<P ALIGN="JUSTIFY">		.</P>
<P ALIGN="JUSTIFY">		.</P>
<P ALIGN="JUSTIFY">		.</P>
</FONT>
<table width="609" border="1" cellspacing="1" cellpadding="1" height="446">
<tr>
<td rowspan="2" width="342">
<p><img src="dpj1302.gif" width="338" height="398"></p>
<p> </p>
<p align="center">图2</p>
</td>
<td width="200"><img src="dpj1301.gif" width="99" height="126"></td>
</tr>
<tr>
<td width="200" height="330">
<p><img src="dpj1303.gif" width="204" height="272"></p>
<p align="center">图3</p>
</td>
</tr>
</table>
<P ALIGN="JUSTIFY"> <FONT FACE="宋体" LANG="ZH-CN">应用背景介绍:在单片机开发中,经常要用到键盘,见上面的</font><FONT FACE="System" LANG="ZH-CN">9</FONT><FONT FACE="宋体" LANG="ZH-CN">个按键的键盘。我们的要求是:当按下功能键</FONT><FONT FACE="System" LANG="ZH-CN">A………..G</FONT><FONT FACE="宋体" LANG="ZH-CN">时去完成不同的功能。这用程序设计的语言来表达的话,就是:按下不同的键去执行不同的程序段,以完成不同的功能。怎么样来实现呢?</font></P>
<P ALIGN="JUSTIFY"> <FONT FACE="宋体" LANG="ZH-CN"> 看图</font><FONT FACE="System" LANG="ZH-CN">2</FONT><FONT FACE="宋体" LANG="ZH-CN">,前面的程序读入的是按键的值,如按下</FONT><FONT FACE="System" LANG="ZH-CN">'A'</FONT><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">'B'</FONT><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">0</FONT><FONT FACE="宋体" LANG="ZH-CN">就转到</FONT><FONT FACE="System" LANG="ZH-CN">S1</FONT><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">S2</FONT><FONT FACE="宋体" LANG="ZH-CN">执行。。。。如何来实现这一功能呢?</font></P>
<P ALIGN="JUSTIFY"> <FONT FACE="宋体" LANG="ZH-CN"> 先从程序的下面看起,是若干个</font><FONT FACE="System" LANG="ZH-CN">AJMP</FONT><FONT FACE="宋体" LANG="ZH-CN">语句,这若干个</FONT><FONT FACE="System" LANG="ZH-CN">AJMP</FONT><FONT FACE="宋体" LANG="ZH-CN">语句最后在存储器中是这样存放的(见图</FONT><FONT FACE="System" LANG="ZH-CN">3</FONT><FONT FACE="宋体" LANG="ZH-CN">),也就是每个</FONT><FONT FACE="System" LANG="ZH-CN">AJMP</FONT><FONT FACE="宋体" LANG="ZH-CN">语句都占用了两个存储器的空间,并且是连续存放的。而</FONT><FONT FACE="System" LANG="ZH-CN">AJMP	S1</FONT><FONT FACE="宋体" LANG="ZH-CN">存放的地址是</FONT><FONT FACE="System" LANG="ZH-CN">TAB</FONT><FONT FACE="宋体" LANG="ZH-CN">,到底</FONT><FONT FACE="System" LANG="ZH-CN">TAB</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</FONT><FONT FACE="宋体" LANG="ZH-CN">,</FONT><FONT FACE="System" LANG="ZH-CN">#TAB</FONT><FONT FACE="宋体" LANG="ZH-CN">执行完了之后,</FONT><FONT FACE="System" LANG="ZH-CN">DPTR</FONT><FONT FACE="宋体" LANG="ZH-CN">中的值就是</FONT><FONT FACE="System" LANG="ZH-CN">TAB</FONT><FONT FACE="宋体" LANG="ZH-CN">,第二句是</FONT><FONT FACE="System" LANG="ZH-CN">MOV
A</FONT><FONT FACE="宋体" LANG="ZH-CN">,</FONT><FONT FACE="System" LANG="ZH-CN">R0</FONT><FONT FACE="宋体" LANG="ZH-CN">,我们假设</FONT><FONT FACE="System" LANG="ZH-CN">R0</FONT><FONT FACE="宋体" LANG="ZH-CN">是由按键处理程序获得的键值,比如按下</FONT><FONT FACE="System" LANG="ZH-CN">A</FONT><FONT FACE="宋体" LANG="ZH-CN">键,</FONT><FONT FACE="System" LANG="ZH-CN">R0</FONT><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">B</FONT><FONT FACE="宋体" LANG="ZH-CN">键,</FONT><FONT FACE="System" LANG="ZH-CN">R0</FONT><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">B</FONT><FONT FACE="宋体" LANG="ZH-CN">键,则执行完第二条指令后,</FONT><FONT FACE="System" LANG="ZH-CN">A</FONT><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">B</FONT><FONT FACE="宋体" LANG="ZH-CN">后应当执行</FONT><FONT FACE="System" LANG="ZH-CN">S2</FONT><FONT FACE="宋体" LANG="ZH-CN">这段程序,让我们来看一看是否是这样呢?第三条、第四条指令是将</FONT><FONT FACE="System" LANG="ZH-CN">A</FONT><FONT FACE="宋体" LANG="ZH-CN">中的值乘</FONT><FONT FACE="System" LANG="ZH-CN">2</FONT><FONT FACE="宋体" LANG="ZH-CN">,即执行完第</FONT><FONT FACE="System" LANG="ZH-CN">4</FONT><FONT FACE="宋体" LANG="ZH-CN">条指令后</FONT><FONT FACE="System" LANG="ZH-CN">A</FONT><FONT FACE="宋体" LANG="ZH-CN">中的值是</FONT><FONT FACE="System" LANG="ZH-CN">2</FONT><FONT FACE="宋体" LANG="ZH-CN">。下面就执行</FONT><FONT FACE="System" LANG="ZH-CN">JMP
@A+DPTR</FONT><FONT FACE="宋体" LANG="ZH-CN">了,现在</FONT><FONT FACE="System" LANG="ZH-CN">DPTR</FONT><FONT FACE="宋体" LANG="ZH-CN">中的值是</FONT><FONT FACE="System" LANG="ZH-CN">TAB</FONT><FONT FACE="宋体" LANG="ZH-CN">,而</FONT><FONT FACE="System" LANG="ZH-CN">A+DPTR</FONT><FONT FACE="宋体" LANG="ZH-CN">后就是</FONT><FONT FACE="System" LANG="ZH-CN">TAB+2</FONT><FONT FACE="宋体" LANG="ZH-CN">,因此,执行此句程序后,将会跳到</FONT><FONT FACE="System" LANG="ZH-CN">TAB+2</FONT><FONT FACE="宋体" LANG="ZH-CN">这个地址继续执行。看一看在</FONT><FONT FACE="System" LANG="ZH-CN">TAB+2</FONT><FONT FACE="宋体" LANG="ZH-CN">这个地址里面放的是什么?就是</FONT><FONT FACE="System" LANG="ZH-CN">AJMP	S2</FONT><FONT FACE="宋体" LANG="ZH-CN">这条指令。因此,马上又执行</FONT><FONT FACE="System" LANG="ZH-CN">AJMP		S2</FONT><FONT FACE="宋体" LANG="ZH-CN">指令,程序将跳到</FONT><FONT FACE="System" LANG="ZH-CN">S2</FONT><FONT FACE="宋体" LANG="ZH-CN">处往下执行,这与我们的要求相符合。</font></P>
<P ALIGN="JUSTIFY">
<FONT FACE="宋体" LANG="ZH-CN">请大家自行分析按下键“</font><FONT FACE="System" LANG="ZH-CN">A</FONT><FONT FACE="宋体" LANG="ZH-CN">”、“</FONT><FONT FACE="System" LANG="ZH-CN">C</FONT><FONT FACE="宋体" LANG="ZH-CN">”、“</FONT><FONT FACE="System" LANG="ZH-CN">D</FONT><FONT FACE="宋体" LANG="ZH-CN">”</FONT><FONT FACE="System" LANG="ZH-CN">……</FONT><FONT FACE="宋体" LANG="ZH-CN">之后的情况。</font></P>
<P ALIGN="JUSTIFY"> <FONT FACE="宋体" LANG="ZH-CN"> 这样我们用</font><FONT FACE="System" LANG="ZH-CN">JMP	@A+DPTR</FONT><FONT FACE="宋体" LANG="ZH-CN">就实现了按下一键跳到相应的程序段去执行的这样一个要求。再问大家一个问题,为什么取得键值后要乘</FONT><FONT FACE="System" LANG="ZH-CN">2</FONT><FONT FACE="宋体" LANG="ZH-CN">?如果例程下面的所有指令换成</FONT><FONT FACE="System" LANG="ZH-CN">LJMP</FONT><FONT FACE="宋体" LANG="ZH-CN">,即:</font></P>
<P ALIGN="JUSTIFY"><FONT FACE="System" LANG="ZH-CN">LJMP	S1,LJMP		S2……</font><FONT FACE="宋体" LANG="ZH-CN">这段程序还能正确地执行吗?如果不能,应该怎么改?</font></P></BODY>
</HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -