對于復(fù)雜的計算,單片機的速度顯得偏慢。
最好的辦法是人工事先算出全部的結(jié)果,依次存放在ROM中,需要計算時,直接從ROM中查出結(jié)果即可。
查表有兩條指令:
MOVC A, @A + PC
MOVC A, @A + DPTR
前者不使用DPTR,節(jié)省資源,但是其中有個“偏移量”頗為難算,它涉及到指令機器碼的字節(jié)數(shù),通常是編譯一遍之后,由人工來數(shù),“偏移量”究竟是應(yīng)該多少,經(jīng)常有錯誤出現(xiàn),且不便于修改程序。
做而論道有一個利用編譯系統(tǒng)自動計算偏移量的方法,下面給出一個例子。
;================================================================
要求利用MOVC A, @A + PC指令,編寫一查平方表程序,將片內(nèi)30H ~ 39H內(nèi)的數(shù)查出平方值,然后送入40H ~ 49H單元。
應(yīng)該預(yù)先在30H ~ 39H存入數(shù)據(jù)為 1,3,5,7,9,2,4,6,8,10。
;-----------------------------------------------------------------------
程序如下:
org 0000h
mov 30h, #1 ;先存放預(yù)置數(shù)據(jù)
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 ;調(diào)用子程序
sjmp $
;-----------------------------------------------------------------------
;查表法求平方的程序如下。
SQRT:
MOV R0, #30H ;數(shù)據(jù)源地址
MOV R1, #40H ;數(shù)據(jù)目的地址
MOV R2, #10 ;共有10個數(shù)
LOOP:
MOV A, @R0
ADD A, #S_TAB - CHA ;自動計算“偏移量”
MOVC A, @A + PC
CHA:
MOV @R1, A
INC R0
INC R1
DJNZ R2, LOOP
RET
S_TAB:
DB 0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196
;================================================================
;完