单片机的查表程序 1、在单片机 开发过程中、一些非线性得控制过程、最适合做一个表格来、时时改变系统得参数、达到控制得目得、最常得如产生正弦得得程、就就是建一个大得数组时时改变输出得8位字节送给外部DA、由D A生成一个完整得正弦波、当然了、LED显示也就是一个例子、通过建一个数组来实现段码得点亮点灭、下面就就是一个L ED表-d 1 git s 0#d e f 1 ne SEG a 0x 0 1#de f ine SEG b 0x02# define S EG_c 0 x0 4# define SEG d 0x 0 8#d e f ine SE G e 0 x 1 0 ? # d efi ne S EG f 0x2 2、0 ? # defineSEG g 0x 4 0# de f in e S E G_dot 0x80? uns igned chardig it s : 10 :(S EG_a|S EG _b | SE G_ c|S E Gd|SEG_eE G_f) ,SEGb|SE G_c),/ 1(S EGa|SEG b|S E G_ d| S E G_e|SEG_g),/ 2? (SEG_a | SE G b| S EG_ c | S E G_d |SEG_ g ),(SEG b |SEG_c|SEG_c|SE Gf|SEG_g),/4? (S EG _ a |SEG_ c|SEG_dSEGf|SEG_ 3、g),/ 5? (SEG_ a|SEG_ c |SEG_d|S EGe | S EG _ f |SEG_g),/6?(SEGa| SE G _b|SEG_c),/ 7(SE G _a | SEG _b| S EG_ c| SE G d |SE G_ e |SE G _f| S EG _g), /8(SEG a|SE G_b|S E G_ c| SE G_d | S E Gf| S EG g)/ 9? ;C 查表就太简单了 t emp2 = digits s h ow data i :; 一句搞定,C中还有一个s w it c h语句也就是一个很好得用查表语句C5 1汇编就相对麻烦一点、不过M 4、CS 51指令系统中有专用得查表指令 :M O VC A,A+DO V A ,A+PC、MO VC A, A +DPTR指令,DP TR作为基址寄存器时,其值为16位而且可根据需要设计, 故可用于在64 KR OM范围内查表。编写查表程序时,首先把表得首址送入 DPTR中,再将要查找得数据序号( 或下表值 )送入A中,然后就可以使用该指令进行查表操作 ,并将结果送累加器 A中。MOVC A,A +P C指令,PC作为基址寄存器时,其值由指令得位置确定,它只能设在查表指令操作码下得2 5 6个字节范围内。编写查表程序时,首先把查表数据得序号送入A中,再把从查表指令到表得首地址间得偏移量与A值相加 5、,然后使用该指令进行查表操作,并把结果送累加器A中。下面就是把内部 RAM 30H-37 H单中得十六进制数依次转换为ASC I I码,并存入内部RAM 6 0H-6FH 单之中。用查表法编写程序分析:由于十六进制数就是从 0F,对应得AS CII码为3 0H4 6 H,每一个单存放得1 6进制数,转换为 ASCII码后分别存入2个单,低位存低地址,高位存高地址。用 A NL A ,#0F H分别取高4位与低 4 位。进行查表转换成相应得ASCI I码。M 0 VCAJMP MAI NINIT lALORG0 0 50 HMAININITIAL;给3 0 H 37H赋初值 ? M0V 6、R 0,#30 H ;设置存数指针R 0初值MOVR1 ,#00H;设置赋值变量个数计数寄存器 R1( 循环计数器)初值MOVDPTR,#initialtabA , A+DP TR 程序如下: ? ORG 00 00HNEXTINITIA L:MO V A,R1MOVC A,A+DPTR ;查表数据送累加器 A ?MOV R0,AINC R0 ;指针增一 ? INC Rl ;循环计数器增一CJN E R1, # 8 , N E XTI N IT I AL ;判给 3 0H-3FH 赋初值完否MAIN:? MOV R0,#30 H ;设置十六进制数地址指针M0 V Rl, #60H;设置A S 7、C II码地址指针MOV R7,# 08H ;需拼装得十六进制数字节个数MOV DPTR,#ACSII TAB ? ABC:M0VA,R0 ;取十六进制数 ? MOVB,A ;暂存ANL A,0F0H ;取十六进制数得字节高位 ? RR A ;取十六进制数得字节高 4 位移到字节得低 4RR A? RR AMOVCA,A + D P TR ;查表数据送累加器? MOV R1,A ;保存转换结果 ? INC R1 ;转换结果指针增一? M O V A,B ? ANL A ,# 0 FH;取十六进制数得字节低4位 ? MOVC A,A+DPTR ; 查表数据送累加器AM0V R1,A ;保存转换结 8、果I NC R1 ;转换结果指针增一7, ABC ;继续? SJM P $INC R0 ;转换数据指针增一 ? DJNZ Riniti a Itab:;给 30 H 3 7 H 赋值用初值表 ?D B 2 3H , 6DH, 0 9H , 7 FH,8CH , l EH , 4 B H ,5AHACSIITAB: ;0F, 对应得 ASCII 码表D B “0123 4 5678”? DB ” 9ABC DEFM OVC A,A + P C 程序如下:? ORG 0 0 0 0 H ? A JM P MA I NINIT IA LOR G 0 0 5 0 HMAININIT 9、 IAL: ;给30 H-37H 赋初值MOV R 0 ,#30H;设置存数指针R0初值MOV R 1,# 0 0H ;设置赋值变量个数计数寄存器R1(循环计数器)初值 ? MO V D P TR,#ini a 1 ta b ? NEXT I NI T IA L :MOV A,R1? MOVC A, A+DPT R ;查表数据送累加器 A ? MOV R 0,A ? IN C R0 ;指针增一? INC R1;循环计数器增一? CJN E R1 , #8,NE XT I N ITIAL;判给3 0 H 3F H赋初值完否? MAIN:MO VR0,30H ;设置十六进制数地址指针MOVMOVD 10、PT R, #ACSI I TABABC:? MOV A,R0 ;取十六进制数MOVB,A ;暂存R1,#6 0 H ;设置ASC I I码地址指针 ? MOV R 7 ,#08H;需拼装得十六进制数字节个数ANLA,0F0H ;取十六进制数得字节高 4位 ? RR A ;取十六进制数得字节高 4位移到字节得低4位RRRR AAC A L LTR AN AC SA II ;查表数据送累加器 A ? MOV R1,A ;保存转换结果INCR1;转换结果指针增一MOVA,ANLOVR1,A ;保存转换结果INCR1;转换结果指针增一INCR0;转换数据指针增一 ? D J NZ R7,A B C 11、;继续? SJMP $1 n itialt ab:;给 3 OH 3 7H 赋值用初值表 ? DB 23H, 6 DH,09H,7 FH , 8 CH,1EH,4 B H, 5 ATRAN ACSAII: ? IN CA ;查表之前A加1就是因为MOVC指令与数据表之间有一个地址单得间隔( RET 指令) ? MOVCA, A +PC ;由于数据表紧跟 MOVC指令之后,因此以PC作为基址寄存器比较方便、RETACSI ITAB: ;0F, 对应得ASCII 码表 ? DB “0” ? DB 9ABCDEF”en dA, # 0FH ;取十六进制数得字节低4位? AC AL L T RA NA C S AII ;查表数据送累加器A? M其它单片机跟C5 1查表类似、下面介绍松翰得 单片机得查表程序、松翰单片机查表就是通过X、丫寄存 器来达到指向得表得目得如下b0 mov z , #b0 mo V y ,#seg t a b $M ? b0m o v a, f r e qh ; 1 ed
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/65424.html