查表程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
查表程序设计
在单片机应用系统中,查表程序使用频繁。利用它能避免进行复杂的运算或转换过程,广泛应用于显示、打印字符的转换以及数据补偿、计算、转换等程序中。
查表就是根据自变量x的值,在表中查找y,使y=f(x)。x和y可以是各种类型的数据。表的结构也是多种多样的。表格可以放在程序存储器中,也可以存放在数据存储器中。一般情况下,对自变量x是有变化规律的数据,可以根据这一规律形成地址,对应的y则存放于该地址单元中;对x是没有变化规律的数据,在表中存放x及其对应的y值。前者形成的表格是有序的,后者形成的表格可以是无序的。
例1将l位十六进制数转换为ASCII码。
解: 在前面的例子中,我们介绍了将ASCII码转换为十六进数的程序,本例是其逆变换。这里采用查表的方法完成十六进制数到ASCII码的转换。
建立一个表格,首先确定表格的首地址,在相对于表首的地址单元中存放ASCII码。设十六进制存放在R0中,转换结果存放在R1中。程序为:
ORG 0300H
MOV A, R0
ANL A, #0FH ;屏蔽高位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV R1,A
ORG 0380H
TAB: DB ‘01234567’
DB ‘89ABCDEF’
END
例2 在一个单片机测温装置中,已知电压和温度之间是非线性关系。在校正过程中,电压值取连续的10位二进制数,测量这些电压值对应温度最多可达1024个。用这些校正数据建立一个表格。以电压为相对地址,这样就可以根据测得的不同电压值求出被测温度。
解: 设电压测量值X放在R2、R 3中(10位二进制数占两个字节),求出的温度仍放R2、R3中(也是双字节数)。与X值的对应的温度放在地址为2X加表格的首地址的单元中。程序为:
MOV DPTR, #TAB
MOV A, R3
CLR C
RLC A ;X*2
MOV R3, A
XCH A, R2
RLC A
XCH A, R2
ADD A, DPL ;加表首地址
MOV DPL, A
MOV A, DPH
ADDC A, R2
MOV DPH, A
CLR A
INC DPTR
MOVC A, @A+DPTR
MOV R3, A
RET
TAB: DW
例3通过一个键盘输入一组命令,完成不同的功能。
解: 设从键盘输入的命令字符为‘A’、‘D’、‘E’、‘L’、‘M’、‘X’、‘Z’七种,当键入不同的命令字符时转向不同的处理程序,对应的处理程序的入口标号为XA、XD、XE、XL、XM、XX、XZ。由于输入的字符之间很难找到什么规律,建立表格时将字符和其对应的处理程序的地址一同存入。查表时先查找字符,其后就是处理程序的入口地址。表格以0为结束标志。
入口条件为:命令字符放在A中。程序:
LTB: MOV DPTR, #TAB
MOV B, A
LOOP: CLR A
MOVC A, @A+DPTR
JZ LEND
INC DPTR
CJNZ A, B, LNF
CLR A
MOVC A, @A+DPTR ;取出入口地址第一个字节
MOV B, A
INC DPTR
CLR A
MOVC A, @A+DPTR
MOV DPL, A
MOV DPH, B
CLR A
JMP @A+DPTR ;转向相应处理程序
LNF: INC DPTR
INC DPTR ;继续查
SJMP LOOP
LEND: (查不到处理程序)
TAB: DB ‘A’
DW XA
DB ‘D’
DW XD
DB ‘E’
DW XE
DB ‘L’
DW XL
DB ‘M’
DW XM
DB ‘X’
DW XX
DB ‘Z’
DW XZ
DB 0 ;表格结束标志