51单片机具有两条查表指令,用于从 ROM 中读出预存的数据:
MOVC A, @A + PC
MOVC A, @A + DPTR
其中前一条指令的用法,比较难,使用的时候,需要计算一个“偏移量”。不了解“指令的字节数”的人,都不清楚应该如何计算。
“偏移量”的自动计算方法,可见如下问答:
【问】单片机查表程序编写 急!利用MOVC A,@A+PC指令编写一查平方表程序,将片内30H~39H内的数查平方后送入40H~49H单元,30H~39H预先存入数据为 1,3,5,7,9,2,4,6,8,10. 麻烦高手编下程序啊。。。查表的不会写~~
【答】
org 0000hmov 30h, #1
mov 31h, #3
mov 32h, #5
mov 33h, #7
mov 34h, #9
mov 35h, #2
mov 36h, #4
mov 37h, #6
mov 38h, #8
mov 39h, #10
call SQRT
sjmp $
;查表法求平方的程序如下。
SQRT:
MOV R0, #30H
MOV R1, #40H
MOV R2, #10
LOOP:
MOV A, @R0
ADD A, #S_TAB - ($ + 4)
MOVC A, @A + PC
MOV @R1, A
INC R0
INC R1
DJNZ R2, LOOP
RET
S_TAB:
DB 1, 4, 9, 16, 25, 36, 49, 64, 81, 100
;完
然后我说一下“MOVC A, @A+DPTR”查表指令的用法。
【问】汇编语言里面的查表法是什么意思啊。在单片机里面是怎么运行的啊~~~~我不知道汇编里面的查表法究竟是什么意思~~主要是我不知道他的原理是什么。
【答】
51单片机汇编语言有一条查表指令是:
MOVC A, @A + DPTR
它不是单独使用的,要和 DB 伪指令配套使用。
例如:若累加器A中有一个0~9的数,请用查表法求出该数的平方值,设平方表表头地址为1000H。
程序如下:
;-------------------------------------
MOV DPTR, #1000H
MOVC A, @A + DPTR
……
ORG 1000H
DB 0, 1, 4, 9, 16, 25......
;-------------------------------------
DB 伪指令从 ROM 1000H 开始,顺序存放了一系列的“平方”数据。
MOVC A, @A+DPTR 指令中的A,如果等于0,就会在“平方”数据中取出第0个,就是0;
MOVC A, @A+DPTR 指令中的A,如果等于1,就会在“平方”数据中取出第1个,就是1;
MOVC A, @A+DPTR 指令中的A,如果等于2,就会在“平方”数据中取出第2个,就是4;
MOVC A, @A+DPTR 指令中的A,如果等于3,就会在“平方”数据中取出第3个,就是9;
……
MOVC A, @A+DPTR 指令中的A,如果等于9,就会在“平方”数据中取出第9个,就是81。
-------------------------------
=============================================
后记:
这条指令的用法,相对前一条就简单了,事先并不需要计算“偏移量”。但是这条指令必须要使用寄存器DPTR。
大家知道,凡是涉及到片外RAM存储单元的时候,基本上都要使用DPTR,这个DPTR寄存器通常是比较“繁忙”的,它形成了一个片内、片外之间,数据传传输的“瓶颈”。因此在读取ROM数据的时候,能够不用这后一条指令,就不要用它,应该尽量使用前一条指令。
=============================================