查表程序:
所谓查表法,就是对一些复杂的函数运算如sinx,x+x^2等,事先把其全部可能范围的函数值按一定的规律编成表格(实际上是ROM的内存单元)存放在计算机的ROM中(是程序存储器)。当用户程序中需要使用这些函数时,直接按编排好的索引寻找答案。这种方法节省了运算步骤,使程序更简便,执行速度更快。在控制应用场合或智能仪器仪表中,经常使用查表法。
为了实现查表功能:在51系列单片机中专门设置了两条查表指令:
MOVC A,@A+DPTR ;常用,一般DPTR做基地址,A做游标,这样就可以访问一个特定的表格了
MOVC A,@A+PC
例子:
已知数据0~9的平方,设变量x的值在累加器A中,查表后求x^2的值,并放回A中保存。试编写程序
假设:RAM的40H,41H,分别放着03H,09H,求其平方,放在A中
注:这里03H表示十进制3,025H表示十进制25,本来025不等于25,但是为了简便,并且在内存中存的都是16进制,所以这里直接用16进制数值等价于十进制数值
解:源代码入下:
ORG 0000H
LJMP INIT
ORG 0100H
INIT: ;初始化,向RAM的40H,41H单元中存放3和9用来查表
MOV R0,#40H
MOV @R0,#03H
INC R0
MOV @R0,#09H
MAIN:
MOV R0,#40H
MOV DPTR,#TABLE ;让DPTR指向TABLE,A中存放表格中的带访问的下标,下标从0开始
MOV A,@R0
MOVC A,@A+DPTR ;访问TABLE[3]
INC R0
MOV A,@R0
MOVC A,@A+DPTR ;访问TABLE[9]
SJMP $
TABLE: ;存放在ROM中的表格,TABLE的地址理论上可以取得ROM中的任何地址
DB 00H,01H,04H,09H,16H
DB 25H,36H,49H,64H,81H
END
分析结果:
寄存器结果:
ROM中的表格: 怎末查看这个表格,很简单,在调试的时候看DPTR里的值,就是表格在ROM中的地址