资源描述:
《单片机的查表程序.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、在单片机开发过程中.一些非线性的控制过程.最适合做一个表格来.时时改变系统的参数.达到控制的目的.最常的如产生正弦的的程.就是建一个大的数组时时改变输出的8位字节送给外部DA.由DA生成一个完整的正弦波.当然了.LED显示也是一个例子.通过建一个数组来实现段码的点亮点灭.下面就是一个LED表---digits[0]#defineSEG_a 0x01#defineSEG_b 0x02#defineSEG_c 0x04#defineSEG_d 0x08#defineSEG_e 0x10#defineSEG_f 0x20#defineSEG_g 0x40#defineSE
2、G_dot 0x80unsignedchardigits[10]={ (SEG_a
3、SEG_b
4、SEG_c
5、SEG_d
6、SEG_e
7、SEG_f), //0 (SEG_b
8、SEG_c), //1 (SEG_a
9、SEG_b
10、SEG_d
11、SEG_e
12、SEG_g), //2 (SEG_a
13、SEG_b
14、SEG_c
15、SEG_d
16、SEG_g), //3 (SEG_b
17、SEG_c
18、SEG_c
19、SEG_f
20、SEG_g), //4 (SEG_a
21、SEG_c
22、SEG_d
23、SEG_f
24、SEG_g), //5 (SEG_a
25、SEG_c
26、SEG_d
27、
28、SEG_e
29、SEG_f
30、SEG_g), //6 (SEG_a
31、SEG_b
32、SEG_c), //7 (SEG_a
33、SEG_b
34、SEG_c
35、SEG_d
36、SEG_e
37、SEG_f
38、SEG_g), //8 (SEG_a
39、SEG_b
40、SEG_c
41、SEG_d
42、SEG_f
43、SEG_g) //9 };C查表就太简单了temp2=digits[show_data[i]];一句搞定,C中还有一个switch语句也是一个很好的用查表语句C51汇编就相对麻烦一点.不过MCS-51指令系统中有专用的查表指令:MOVCA,@A+DPTR和MOVA,@A+PC.MOVC
44、A,@A+DPTR指令,DPTR作为基址寄存器时,其值为16位而且可根据需要设计,故可用于在64KROM范围内查表。编写查表程序时,首先把表的首址送入DPTR中,再将要查找的数据序号(或下表值)送入A中,然后就可以使用该指令进行查表操作,并将结果送累加器A中。MOVCA,@A+PC指令,PC作为基址寄存器时,其值由指令的位置确定,它只能设在查表指令操作码下的256个字节范围内。编写查表程序时,首先把查表数据的序号送入A中,再把从查表指令到表的首地址间的偏移量与A值相加,然后使用该指令进行查表操作,并把结果送累加器A中。下面是把内部RAM30H-37H单元中的十六进制
45、数依次转换为ASCII码,并存入内部RAM60H-6FH单元之中。用查表法编写程序。分析:由于十六进制数是从0~F,对应的ASCII码为30H~46H,每一个单元存放的16进制数,转换为ASCII码后分别存入2个单元,低位存低地址,高位存高地址。用ANLA,#0FH分别取高4位和低4位。进行查表转换成相应的ASCII码。MOVC A,@A+DPTR程序如下:ORG 0000HAJMP MAININITIALORG 0050HMAININITIAL:;给30H-37H赋初值MOVR0,#30H;设置存数指针R0初值MOVR1,#00H;设置赋值变量个数计数寄存器R1(
46、循环计数器)初值MOVDPTR,#initialtabNEXTINITIAL:MOVA,R1MOVCA,@A+DPTR;查表数据送累加器AMOV@R0,AINCR0;指针增一INCR1;循环计数器增一CJNER1,#8,NEXTINITIAL;判给30H-3FH赋初值完否MAIN:MOVR0,#30H;设置十六进制数地址指针MOVR1,#60H;设置ASCII码地址指针MOVR7,#08H;需拼装的十六进制数字节个数MOVDPTR,#ACSIITABABC:MOVA,@R0;取十六进制数MOVB,A;暂存ANLA,#0F0H;取十六进制数的字节高4位RRA;取十六进
47、制数的字节高4位移到字节的低4位RRARRARRAMOVCA,@A+DPTR;查表数据送累加器AMOV@R1,A;保存转换结果INCR1;转换结果指针增一MOVA,BANLA,#0FH;取十六进制数的字节低4位MOVCA,@A+DPTR;查表数据送累加器AMOV@R1,A;保存转换结果INCR1;转换结果指针增一INCR0;转换数据指针增一DJNZR7,ABC;继续SJMP$initialtab:;给30H-37H赋值用初值表DB23H,6DH,09H,7FH,8CH,1EH,4BH,5AHACSIITAB:;0~F,对应的ASCII码表DB"012345678