MSC-51单片机指令中的查表问题

MSC-51单片机指令中的查表问题,第1张

查表程序是要从一个专门的数据区内找到你所需要的那个数。这个数在表中的位置,由表首地址、数在表内相对表首地址的偏移量、一个数据的字节数等因素来确定。

具体方法是:将表首地址放入DPTR中,偏移量放入A中,用查表指令MOVC A,@A+DPTR来完成从数据区取数。有如下几种情况:

1、如果数据区的长度不超过256个字节(累加器A的容量之内),且数据是单字节的,则不需要另外处理;

2、因为如果数据区的长度不超过256个字节,但数据是双字节的,需要将偏移量乘2,第一次读出一个字节保存,将地址加1后再读第二字节(类推:一个数据是n字节,则偏移量乘n,每次读出一个字节保存,将地址加1后再读下一字节,直到一个数全部读出)。

3、如果数据区的长度超过了256个字节,因为A已经存放不了256以上的偏移量,此时需要事先将偏移量加入到DPTR中去(即数据的真实地址全部放到DPTR中了),再将A清零后使用查表指令。同样也要如上区分单字节数和多字节数。

你所给例就是数据区的长度超过了256个字节,且数据为双字节的情况。程序解释如下,供参考。

MOV DPTR,#TAB ;表首地址入DPTR

MOV A,R3

CLR C

RLC A ;偏移量的低8位乘2在A中,移出的最高位在C中

XCH A,R2 ;乘2后的偏移量的低8入R2中,偏移量的高8位入A中

RLC A;偏移量的高8位乘2在A中

XCH A,R2 ;偏移量的高低字节归位,至此完成了偏移量乘2

ADD A,DPL

MOV DPL,A

MOV A,DPH

ADDC A,R2

MOV DPH,A;将偏移量加到DPTR中,至此DPTR中就是数据第一个字节的实际地址

CLR A ;A清零,因为偏移量已经加入,DPTR内容不需要再修正。

MOVC A,@A+DPTR读数据第一个字节

MOV R2,A读数据第一个字节存入R2中

CLR A ;A清零

INC DPTR ;地址加“1”,准备读下一个字节

MOVC A,@A+DPTR

MOV R3,A 读数据第一个字节存入R3中

RET

TAB: DW XXXXHTAB为表首地址,共1024个双字节数据项,共2048个字节

DW XXXXH

......

DW XXXXH

LTB2:

-------------------下面是R2R3乘以2

MOV A, R3

CLR C

RLC A

MOV R3, A

XCH A, R2

RLC A

XCH R2, A

------------------下面是表首地址加上R2R3

MOV DPTR, #TAB2

ADD A, DPL (R2R3)+(DPTR)→(DPTR)

MOV DPL, A

MOV A, DPH

ADDC A, R2

MOV DPH, A

------------------下面是查表,查出两个字节

CLR A

MOVC A, @A + DPTR

MOV R2,A

CLR A

INC DPTR

MOVC A, @A + DPTR

MOV R3,A

RET

----

这个程序,是根据两个字节的数据来查表,查出的,也是两个字节。

如果先弄懂了一个字节的查表程序,看这个程序,也就没有什么难的了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12027029.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存