4.4.2查表程序设计

  • 格式:doc
  • 大小:38.50 KB
  • 文档页数:4

下载文档原格式

  / 10
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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位