查表程序设计是汇编语言基本的程序设计技术之一。它充分利用计算机具有很强的数据查询功能,首先构建一个数据表,然后用查表法代替复杂、费时的数学运算;从而高效地利用计算机来解决实际环境中复杂的计算问题。因此,查表程序在单片机程序设计中被广泛应用,每一个单片机应用系统的开发者都要学会灵活地利用查表技术解决实际问题。
在单片机中,表格具有只读的性质,所以通常将其固化在ROM中。常见的表格有函数关系表、数码显示笔划表、系统常量表三种。
函数关系表
当某个数据处理算法非常复杂,甚至根本没有计算公式时,人们往往通过实验将函数关系列成一张表,并将其固化在ROM中。如温度表等。
数码显示笔划表单片机一般采用数码管或液晶数码板傲显示输出设备。为了按需要显示出各种数字或符号,一般将备种数字或符号的段驱动代码列成笔划表,固化在ROM中,以便配合查表程序构成字符发生器驱动数码管。
系统常量表
存放系统的各种特征参数,如外部设备的配置、数据处理算法中方程系数等。
要对表格数据进行正确的查找,在程序中就需要对表格首地址、表中每个元素所占的字节数、表中元素的总数、当前访问元素的序号四个量进行控制。本文围绕这四个控制量,就如何灵活应用查表技术作进一步的探讨。
查表技术的探讨
基本查表技术基本查表法所面对的主要问题就是要解决如何正确地构建表格,亦即用函数自变量对应当前访问元素的序号,在程序中正确地完成查表运算。编程模式如图1。
例1.用查表法实现一位十六进制数转换为ASCII码子程序。
入口A=元素序号、出口A=ASCII码。
用MOVA,@A+PC指令,程序如下:
在程序中,查表指令用PC作基址寄存器,A中数据为表中元素的序号。由上图可知数据表必须位于MOVC指令地址的-128~+127之内。并且A中序号必须进行地址偏移量的补偿运算,这样才能正确地完成查表运算。
扩展查表技术一般情况下,为了使程序结构清晰,单片机应用程序的地址分配如上图。数据表与程序在存储器中是分开放置的,因此数据表应当不受程序位置的限制,可以在程序存储器64K地址范围内任意安排。
解决的方法是使用MOVCA,@A+DPTR指令进行查表运算。此时,数据指针DPTR作为基址寄存器指向数据表的入口,累加器A中数据仍为元素序号。编程模式如下图所示。
例2.用MOV.A,@A+DPTR指令实现一位十六进制数转换为ASCII码子程序。
利用DPTR做基址寄存器,可以使数据表安排在单片机程序存储器的任意位置。但是,表中序号是放在A中,由于A的限制,故数据表中数据元素的数目不得多于256个。为了处理数据表中数据元素多于256个的情况,就要采用扩展数据表查表法进行程序设计。
扩展数据表查表技术在表中元素数目大于256的情况下,表中序号仅用累加器A来表示是不够的,一般要用双字节来表示表中序号。这样,使用MOVCA,@A+DPTR指令查表时,要用DPTR直接加16位序号才能够正确完成查表运算。因此查表之前必须进行双字节地址的加法运算。编程时要注意低位字节向高位字节进位问题。编程模式如图4。
例3.固定表格中有1024个数据元素,每个元素为一个字节,按R2R3的内容从表格中查出对应的数据元素值。
扩展数据表元素查表技术若表格中的每个数据元素的个数为多个字节,查表运算前要解决表内偏移量的调整和双字节地址运算中低位字节向高位字节进位问题。编程模式见下图。
例4.若例2中每个数据元素为2个字节,查表运算编程如下: