单片机教学(九)
单片机指令(三)2、累加器 A 与片外 RAM 之间的数据传递类指令 MOVX A,@RiMOVX @Ri,AMOVX #9; A,@DPTRMOVX @DPTR,A 说明:
1)在 51 中,与外部存储器 RAM 打交道的只可以是 A 累加器。所有需要送入外部 RAM 的数据必需要通过 A 送去,而所有要读入的外部 RAM 中的数据也必需通过 A 读入。在此我们可以看出内外部 RAM 的区别了,内部 RAM 间可以直接进行数据的传递,而外部则不行,比如,要将外部 RAM 中某一单元(设为 0100H 单元的数据)送入另一个单元(设为 0200H 单元),也必须先将 0100H 单元中的内容读入 A,然后再送到 0200H 单元中去。
2)要读或写外部的 RAM,当然也必须要知道 RAM 的地址,在后两条指令中,地址是被直接放在 DPTR 中的。而前两条指令,由于 Ri(即 R0 或 R1)只是一个 8 位的寄存器,所以只提供低 8 位地址。因为有时扩展的外部 RAM 的数量比较少,少于或等于 256 个,就只需要提供 8 位地址就够了。
3)使用时应当首先将要读或写的地址送入 DPTR 或 Ri 中,然后再用读写命令。例:将外部 RAM 中 100H 单元中的内容送入外部 RAM 中 200H 单元中。MOV DPTR,#0100HMOVX A,@DPTRMOV DPTR,#0200HMOVX @DPTR,A
3、程序存储器向累加器 A 传送指令 MOVC A,@A+DPTR 本指令是将 ROM 中的数送入 A 中。本指令也被称为查表指令,常用此指令来查一个已做好在 ROM 中的表格说明: 此条指令引出一个新的寻址方法:变址寻址。本指令是要在 ROM 的一个地址单元中找出数据,显然必须知道这个单元的地址,这个单元的地址是这样确定的:在执行本指令立脚点 DPTR 中有一个数,A 中有一个数,执行指令时,将 A 和 DPTR 中的数加起为,就成为要查找的单元的地址。
1)查找到的结果被放在 A 中,因此,本条指令执行前后,A 中的值不一定相同。 例:有一个数在 R0 中,要求用查表的方法确定它的平方值(此数的取值范围是 0-5)MOV DPTR,#TABLEMOV A,R0MOVC A,@A+DPTR..TABLE: DB 0,1,4,9,16,25 设 R0 中的值为 2,送入 A 中,而 DPTR 中的值则为 TABLE,则最终确定的 ROM 单元的地址就是 TABLE+2,也就是到这个单元中去取数,取到的是 4,显然它正是 2 的平方。
其它数据也可以类推。------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------标号的真实含义:从这个地方也可以看到另一个问题,我们使用了标号来替代具体的单元地址。
事实上,标号的真实含义就是地址数值。在这里它代表了,0,1,4,9,16,25 这几个数据在 ROM 中存放的起点位置。而在以前我们学过的如 LCALL DELAY 指令中,DELAY 则代表了以 DELAY 为标号的那段程序在 ROM 中存放的起始地址。事实上,CPU 正是通过这个地址才找到这段程序的。--------------------------------------------------------------------------------可以通过以下的例子再来看一看标号的含义:--------------------------------------------------------------------------------MOV DPTR,#100H--------------------------------------------------------------------------------MOV A,R0--------------------------------------------------------------------------------MOVC A,@A+DPTR--------------------------------------------------------------------------------.ORG 0100H.DB 0,1,4,9,16,25 如果 R0 中的值为 2,则最终地址为 100H+2 为 102H,到 102H 单元中找到的是 4。
这个可以看懂了吧?那为什么不这样写程序,要用标号呢?不是增加疑惑吗?如果这样写程序的话,在写程序时,我们就必须确定这张表格在 ROM 中的具体的位置,如果写完程序后,又想在这段程序前插入一段程序,那么这张表格的位置就又要变了,要改 ORG 100H 这句话了,我们是经常需要修改程序的,那多麻烦,所以就用标号来替代,只要一编译程序,位置就自动发生变化,我们把这个麻烦事交给计算机