单片机查表程序的用法

发布者:JoyfulSpirit最新更新时间:2016-11-23 来源: eefocus关键字:单片机  查表程序 手机看文章 扫描二维码
随时随地手机看文章

在单片机开发过程中.一些非线性的控制过程.最适合做一个表格来.时时改变系统的参数.达到控制的目的.最常的如产生正弦的的程.就是建一个大的数组时时改变输出的8位字节送给外部DA.由DA生成一个完整的正弦波.当然了.LED显示也是一个例子.通过建一个数组来实现段码的点亮点灭.下面就是一个LED表---digits[0]

#define SEG_a 0x01
#define SEG_b 0x02
#define SEG_c 0x04
#define SEG_d 0x08
#define SEG_e 0x10
#define SEG_f 0x20
#define SEG_g 0x40
#define SEG_dot 0x80
unsigned char digits[10] = {
 (SEG_a|SEG_b|SEG_c|SEG_d|SEG_e|SEG_f),   // 0
 (SEG_b|SEG_c),         // 1
 (SEG_a|SEG_b|SEG_d|SEG_e|SEG_g),    // 2
 (SEG_a|SEG_b|SEG_c|SEG_d|SEG_g),    // 3
 (SEG_b|SEG_c|SEG_c|SEG_f|SEG_g),    // 4
 (SEG_a|SEG_c|SEG_d|SEG_f|SEG_g),    // 5
 (SEG_a|SEG_c|SEG_d|SEG_e|SEG_f|SEG_g),   // 6
 (SEG_a|SEG_b|SEG_c),             // 7
 (SEG_a|SEG_b|SEG_c|SEG_d|SEG_e|SEG_f|SEG_g), // 8
 (SEG_a|SEG_b|SEG_c|SEG_d|SEG_f|SEG_g)  // 9
 };

C查表就太简单了temp2 = digits[ show_data[i] ];一句搞定,C中还有一个switch语句也是一个很好的用查表语句

C51汇编就相对麻烦一点.不过MCS-51指令系统中有专用的查表指令:MOVC A,@A+DPTR和MOV A,@A+PC.

segtab:

 dw 000ch
 dw 000ah
 dw 000ch ;0
 
 dw 000ch
 dw 0000h
 dw 0000h ;1
 
 dw 0008h
 dw 000eh
 dw 0004h ;2
 ......................

希望看了此文之后.大家对查表的一个清楚认识


MOVC A,@A+DPTR指令,DPTR作为基址寄存器时,其值为16位而且可根据需要设计,故可用于在64KROM范围内查表。编写查表程序时,首先把表的首址送入DPTR中,再将要查找的数据序号(或下表值)送入A中,然后就可以使用该指令进行查表操作,并将结果送累加器A中。 
MOVC A,@A+PC指令,PC作为基址寄存器时,其值由指令的位置确定,它只能设在查表指令操作码下的256个字节范围内。编写查表程序时,首先把查表数据的序号送入A中,再把从查表指令到表的首地址间的偏移量与A值相加,然后使用该指令进行查表操作,并把结果送累加器A中。

下面是把内部RAM 30H-37H单元中的十六进制数依次转换为ASCII码,并存入内部RAM 60H-6FH单元之中。用查表法编写程序。 
分析:由于十六进制数是从0~F,对应的ASCII码为30H~46H,每一个单元存放的16进制数,转换为ASCII码后分别存入2个单元,低位存低地址,高位存高地址。用ANL A ,#0FH 分别取高4位和低4位。 进行查表转换成相应的ASCII码。

MOVC  A , @A+DPTR 程序如下: 
ORG  0000H 
AJMP  MAININITIAL 
ORG  0050H 
MAININITIAL: ;给30H-37H赋初值 
MOV R0,#30H ;设置存数指针R0初值 
MOV R1,#00H ;设置赋值变量个数计数寄存器R1(循环计数器)初值 
MOV DPTR,#initialtab 
NEXTINITIAL: 
MOV A,R1 
MOVC A,@A+DPTR ;查表数据送累加器A 
MOV @R0,A 
INC R0 ;指针增一 
INC R1 ;循环计数器增一 
CJNE R1,#8,NEXTINITIAL ;判给30H-3FH赋初值完否 
MAIN: 
MOV R0,#30H ;设置十六进制数地址指针 
MOV R1,#60H ;设置ASCII码地址指针 
MOV R7,#08H ;需拼装的十六进制数字节个数 
MOV DPTR,#ACSIITAB 
ABC: 
MOV A,@R0 ;取十六进制数 
MOV B,A ;暂存 
ANL A,#0F0H ;取十六进制数的字节高4位 
RR A ;取十六进制数的字节高4位移到字节的低4位 
RR A 
RR A 
RR A 
MOVC A,@A+DPTR ;查表数据送累加器A 
MOV @R1,A ;保存转换结果 
INC R1 ;转换结果指针增一 
MOV A,B 
ANL A,#0FH ;取十六进制数的字节低4位 
MOVC A,@A+DPTR ;查表数据送累加器A 
MOV @R1,A ;保存转换结果 
INC R1 ;转换结果指针增一 
INC R0 ;转换数据指针增一 
DJNZ R7,ABC ;继续 
SJMP $

initialtab: ;给30H-37H赋值用初值表 
DB 23H,6DH,09H,7FH,8CH,1EH,4BH,5AH

ACSIITAB: ;0~F,对应的ASCII码表 
DB "012345678" 
DB "9ABCDEF"

END

MOVC A,@A+PC程序如下: 
ORG 0000H 
AJMP MAININITIAL 
ORG 0050H 
MAININITIAL: ;给30H-37H赋初值 
MOV R0,#30H ;设置存数指针R0初值 
MOV R1,#00H ;设置赋值变量个数计数寄存器R1(循环计数器)初值 
MOV DPTR,#initialtab 
NEXTINITIAL: 
MOV A,R1 
MOVC A,@A+DPTR ;查表数据送累加器A 
MOV @R0,A 
INC R0 ;指针增一 
INC R1 ;循环计数器增一 
CJNE R1,#8,NEXTINITIAL ;判给30H-3FH赋初值完否 
MAIN: 
MOV R0,#30H ;设置十六进制数地址指针 
MOV R1,#60H ;设置ASCII码地址指针 
MOV R7,#08H ;需拼装的十六进制数字节个数 
MOV DPTR,#ACSIITAB 
ABC: 
MOV A,@R0 ;取十六进制数 
MOV B,A ;暂存 
ANL A,#0F0H ;取十六进制数的字节高4位 
RR A ;取十六进制数的字节高4位移到字节的低4位 
RR A 
RR A 
RR A 
ACALL TRANACSAII ;查表数据送累加器A 
MOV @R1,A ;保存转换结果 
INC R1 ;转换结果指针增一 
MOV A,B 
ANL A,#0FH ;取十六进制数的字节低4位 
ACALL TRANACSAII ;查表数据送累加器A 
MOV @R1,A ;保存转换结果 
INC R1 ;转换结果指针增一 
INC R0 ;转换数据指针增一 
DJNZ R7,ABC ;继续 
SJMP $

initialtab: ;给30H-37H赋值用初值表 
DB 23H,6DH,09H,7FH,8CH,1EH,4BH,5AH

TRANACSAII: 
INC A ;查表之前A加1是因为MOVC指令与数据表之间有一个地址单元的间隔(RET指令) 
MOVC A,@A+PC ;由于数据表紧跟MOVC指令之后,因此以PC作为基址寄存器比较方便. 
RET 
ACSIITAB: ;0~F,对应的ASCII码表 
DB "012345678" 
DB "9ABCDEF"

end

其它单片机跟C51查表类似.下面介绍松翰的单片机的查表程序.松翰单片机查表是通过X.Y寄存器来达到指向的表的目的如下

 b0mov z,#segtab$L
 b0mov y,#segtab$M
 b0mov a,freqh  ;led 3

 add z,a
 b0bts0 fc
 incms y;表加1
 nop
 movc


关键字:单片机  查表程序 引用地址:单片机查表程序的用法

上一篇:任意进制数转换为十进制数的C程序
下一篇:单片机中用C语言查表和移位问题

推荐阅读最新更新时间:2024-03-16 15:21

单片机实验----控制数码管的动态显示
本次实验任务如下: 一、动态显示与静态显示的比较 1.什么是动态显示 驱动电路可以使数码管正常显示数据,数码管的驱动方式有两种:动态显示驱动和静态显示驱动。 动态驱动是将所有数码管的8个显示笔划a,b,c,d,e,f,g,dp的同名端连在一起。 另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制。 当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是哪个数码管会显示出字形,取决于单片机对位选通COM端电路的控制。 2.什么是静态显示 静态显示驱动静态驱动也称直流驱动。 静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动。 3.优缺点对比 二、
[单片机]
<font color='red'>单片机</font>实验----控制数码管的动态显示
瑞萨蝉联“中国MCU市场年度成功企业”
3月9日-10日,在上海召开的“2010年中国半导体市场年会IC Market China 2010”上,株式会社瑞萨科技(以下简称瑞萨)以2009年经营业绩优异、企业成长迅速、发展前景良好、产品与技术创新性强等四大优势,获得“2009年中国MCU市场年度成功企业”殊荣。这已是瑞萨连续第二年荣膺此项行业内的权威奖项。 由中国半导体行业协会(CSIA)、中国电子信息产业发展研究院(赛迪集团)与上海市集成电路行业协会(SICA)共同主办的中国半导体市场年会,作为一年一度中国半导体行业内的重要市场活动,其专业性与权威性不言而喻。在“洞悉变革趋势,把握复苏契机”的主题下,本次年会所颁发的奖项也从另一个侧面肯定了瑞萨在2009
[单片机]
MSP430单片机低功耗控制与系统工作模式详解
CPU内状态寄存器SR中的SCG1、SCG2、OscOff和CPUOff位是 重要的低功耗控制位。只要任意中断被响应,上述控制位就被压入堆栈保存,中断处理之后,又可以恢复先前的工作方式。在中断处理子程序执行期间,通过间接访 问堆栈数据,可以操作这些位;这样允许程序在中断返回(RETI)后,以另一种功耗方式继续运行。各控制位作用如下: SCG1:当SCG1复位时,使能SMCLK;SCG1置位则禁止SMCLK。 SCG0:当SCG0复位时,直流发生器被激活,只有SCG0被置位且DCOCLK信号没有用于MCLK或SMCLK,直流发生器才能被禁止。 OscOff:当OscOff复位时,LFXT晶体振荡器激活,只有当OscOff
[单片机]
自动图像报警系统研究及单片机实现
    摘要:全面介绍了基于图像的自动报警系统的实现方法,克服了传统单点信号报警的缺陷,并采用先进的RISC结构单片机和高密度FLASH、CPLD技术,使系统具有实时响应和自适应能力。     关键词:图像报警 RISC FLASH CPLD 自适应     报警系统广泛应用于银行、饭店、交通管理以及智能大厦等场所和领域。传统的自动报警装置,大多采用单点信号报警,即在某一特定位置安放传感器,当该采集点处的物理量达到报警门限时,就向中心控制计算机发出报警请求信号。这种报警装置的优点是安装便利,反应迅速,但其适用范围较小,对单点噪声过分敏感而导致误报,在防止误报和漏报两方面不可兼得等先天缺陷,限制了它不能被应用于情
[传感技术]
物联网操作系统热潮来临,开路者庆科冷静对待
谷歌在今年的I/O大会上首次推出了名为 Brillo 的操作系统,基于Android底层框架,仅保留了Android系统的基础功能,支持低功耗蓝牙、Wi-Fi连接。再看国内,华为也于近日发布面向物联网的操作系统LiteOS,腾讯则是发布了TOS+智能硬件开放平台战略...... 这一系列的消息让上海庆科CEO王永虹很是兴奋,因为物联网操作系统终于得到了巨头们的重视。面对巨头们的虎视眈眈,王永虹则显示出非常乐观的心态: 得到巨头们的认可,证明我们这几年至少没有白忙活。大家都进入这一市场,未来才能更好。 与阿里共同发力智能领域 王永虹对笔者介绍了公司在近几年物联网浪潮中取得的成就。2012年庆科开始在家
[物联网]
单片机串口通讯过程
一 1、根据波特率和时钟频率设置T2L、T2H的初值 2、通过辅助寄存器AUXR,设置T2启动运行,极其运行方式 3、通过ES打开串口中断、通过EA打开总中断 二 1、主函数中可以直接使用SBUF=0xXX;向串口发送数据 2、接收完数据后,接收完毕中断标志RI变为1,需软件置零RI=0;使串口重新进入接收准备状态。 3、在串口中断函数 void xxx(void) interrupt 4 中,先RI=0,然后可以通过if(SBUF==0xXX)来判断接到的数据,然后通过编程使单片机做出相应的动作。 4、发送以后,发送完毕中断标志TI变为1,需软件置零TI=0;
[单片机]
详解51单片机学习过程中的四大误区
51单片机的辉煌过去 51单片机指MCS-51系列单片机,CICS指令集。由Intel公司开发,其结构增加了如乘(MUL)、除(DIV)、减(SUBB)、比较(CMP)、16位数据指针、布尔代数运算等指令,以及串行通信能力和5个中断源,内有128个RAM单元及4K的ROM。其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。目前国内的51单片机市场主要为国产宏晶的产品STC系列其号称低功耗,稳定与廉价的特点。 学习51单片机的误区 误区1:51单片机是学习的基础 “51单片机是学习的基础”这句话本身并没有错。在我读本科的时候,当时它无疑是学习的基础——毕竟那时没有更高级的单片机可以供使用,国内更
[单片机]
基于单片机PIC16F74的电动按摩椅的研制
本文介绍了一款采用PIC16F74单片机作为微处理芯片的电动按摩椅控制系统,具体包括有系统的组成和功能介绍、硬件电路的设计、软件功能实现以及抗干扰措施。   1:引言   随着我国经济的迅速发展和人们生活水平的不断提高,按摩椅等保健产品越来越受到欢迎。目前,在电动按摩椅市场上,进口、合资以及国产产品并存。相对而言,进口产品功能强大、按摩方式丰富、外观优美,但同时其价格也非常昂贵。而国内产品功能较简单,产品知名度也相对较低,但是其价格比较低廉。本文主要介绍了一款自主研发的中档电动按摩椅。该产品既有功能比较强大、按摩方式比较丰富、结构简单、外观优美、控制方式简单灵活,产品容易升级的特点,同时其价格却只有国外同等产品的一半。
[单片机]
基于<font color='red'>单片机</font>PIC16F74的电动按摩椅的研制
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved