4.4.2查表程序设计
- 格式:doc
- 大小:38.50 KB
- 文档页数:4
4.4.2 查表程序设计
在许多情况下,本来通过计算才能解决的问题也可以改用查表方法解决,而且要简便的多。因此,在实际单片机应用中,常常需要编制查表程序以缩短程序长度并提高程序执行效率。
所谓查表是根据存放都在ROM中数据表格的项数来查找与它对应的表中值。例如,查Y=X2(设X为0~9)的平方表时,可以预计算出X为0~9时的Y值作为数据表格,存放子啊起始地址为DTAB的ROM存储器中,并使X的值和数据表格的项数(所查数据的实际地址对DTAB的偏移量)一一对应。这样,就可以根据DTAB+X找到与X对应的Y值。采用MCS —51汇编语言进行查表尤为方便,它有两条专门的查表指令:
MOVC A,@A+DPTR
MOVC A, @A+PC
第一条查表指令采用DPTR存放数据表格的起始地址,其查表的过程比较的简单。查表前需要把数据表格起始地址存入DPTR,然后把所查表的项数送入累加器A,最后使用MOVC A ,@A+DPTR完成查表。
采用MOVC A,@A+PC指令查表,其步骤可分为如下三步。
(1)使用传送指令把所查数据表格的项数送入累加器A。
(2)使用ADD A,#data指令对累加器A进行修正。Data值由下式确定。
PC+data=数据表起始地址DTAB
其中,PC是查表实例MOVC A,@A+PC的下一条指令码的起始地址。因此,data值实际上等于查表指令和数据表格之间的字节数。
(3)采用查表指令MOVC A,@A+PC完成查表。
查表程序主要用于代码转换,代码显示,实时值的查表计算和按命令号实现转移等。
【例4.13】已知R0低4位有一个十六进制数(0~F中的一个),请编写他的转换成相应的ASCLL码并送入R0的程序。
解:本题给出三种求解方案:两种是计算求解,一宗是查表求解,请比较他们的优势。
(1)计算求解1:由ASCLL码字符表可知0~9的ASCLL码为30H~39H,A~F的ASCLL 为41H~46H.因此,计算求解的思路是:若R0<=9,则R0内容只需加30H,若
R0>9,则R0需加37H。相应程序为:
ORG 0400H
MOV A,R0 ;取转换值到A
ANL A,#0FH ;屏蔽高4位
CJNE A,#10,NEXT1 ;A和10比较
NEXT1: JNC NEXT2 ;若A>9,则转NEXT2
ADD A,#30H ;若A<10,则A—A+30H
SJMP DONE ;转DONE
NEXT2:ADD A,#37H ;A—A+37H
DONE: MOV R0,A ;存结果
SJMP $
END
(2)计算求解2:本方案先把R0中的内容加上90H,并作十进制调整,然后再用ADDC 指令使R0中的内容加上40H,也做十进制调整,所得结果即为相应的ASCLL码。
本方案实际上与第一种方案类同,只是使用了十进制调整指令。当R0<10时,经过上述处理相当于R0中的内容加了30H;当R0=0AH时,加上90H并进行十进制调整后,低4位的辅助进位位加到高4位变为A0H,对高4位进一步调整便得到00H,最后只用ADDC指
令(Cy=1)加上40H实际上相当于加上41H。相应的程序为:
ORG 0400H
MOV A,R0 ;取转换值到A
ANL A,#0FH ;屏蔽高4位
ADD A,#90H ; A中的内容加90H
DA A ;十进制调整
ADDC A,#40H ;A中的内容加40H
DA A ;十进制调整
MOV R0,A ;存转换结果
SJMP $
END
(3)查表求解:查表求解时,两条查表指令均可以使用,现以MOVC A,@A+PC指令为例给出相应程序。
ORG 0400H
MOV A,R0 ;取转换值到A
ANL A,@0FH ;屏蔽高4位
ADD A, #03H ;地址调整
MOVC A,@A+PC ;查表
MOV R0,A ;存结果
SJMP $
ASCTAB: DB ‘0’,’1’,’2’,’3’,’4’
DB ‘5’,’6’,’7’,’8’,’9’
DB ‘A’,’B’,’C’,’D’,E’,’F’
END
【例4.14】已知BLOCK1位起始地址的数据块i(数据晨光长度在LEN单元),数据块中每个存储单元中的高、低4位分别为两个十六进制数,请通过编程把他们转换为相应的ASCLL 码,并放在从CLOCK2开始的连续存储单元(低4位ASCLL码在前,高4位ASCLL码在后)。
解:由于每个存储单元中放有两个十六进制数,因此每个存储单元中的十六进制数因分别转换成ASCLL码。这就需要两次使用查表指令MOVC A,@A+PC,这两条查表指令在程序中的位置是不同的,故两次对PC调整的值也不相同。在编程时,可以先把整个程序编完,然后再计算两条假发指令中的data修正值,并填入相应位置。相应参考程序为:
ORG 0500H
LEN DATA 20H
BLOCK1 DATA 21H
BLOCK2 DATA 51H
MOV R0,#BLOCK1 ;BLOCK1送R0
MOV R1,#BLOCK2 ;BLOCK2送R1
LOOP: MOV A,@R0 ;取源数据块中数
ANL A,#0FH ;取出低4位
ADD A,#17 ;第一次地址调整
MOVC A,@A+PC ;第一次查表
MOV @R1,A ;第一次转换结果
MOV A,@R0 ;重新取出被转换数
SWAP A ;高4位调入低4位