查表程序设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

中。
指令“MOVC A,@A+PC”以PC作为基址寄存器,PC的内 容和A的内容作为无符号数,相加后所得的数作为某一程 序存储单元的地址,然后把该地址单元中的内容送到累加 器A中。
4.3
例4-5 节数。 地 址 Y
汇编语言实用程序设计-查表程序设计
子程序的功能为:根据累加器A中的数x(0~9之间)
例4.两个无符号数比较 例4-12 求符号函数的值。
例4-13 散转 例5 :求50H单元后30个数的累加和
例4-16 测试字符串长度的程序。 例4-17 50ms延时程序 练习:写一个延时10ms的子程序。(钟频12MHz )
4.3
汇编语言实用程序设计-分支转移程序设计
例4.两个无符号数比较
(2)分支程序设计
堆栈指令的使 用
TAB1: DB 00H,01H,04H,09H,10H DB 19H,24H,31H,40H,51H
4.3
汇编语言实用程序设计-查表程序设计
例2:求一个0~9的数是立方 ABC: MOV A , R0 特点:x为一字节、y为两字节, y=f(x)在ROM中的地址 RL A 是TAB1+2x及TAB1+2x+1 MOV B, A 入口参数:在R0中; #TAB MOV DPTR, MOVC A, @A+DPTR 出口参数:在R2、R1中,高字节在R2中 MOV R2, A MOV A, B INC A MOVC A, @A+DPTR MOV R1, A RET TAB: DW 0, 1, 8, 27, 64 DW 125, 216, 343, 512, 729
4.3
汇编语言实用程序设计
4.3.3 查表程序设计
数据补偿、修正、计算、转换等各种功能,具有程序简单、 执行速度快等优点。
查表就是根据自变量x,在表格中寻找y,使y=f(x)。
首先是用DB、DW伪指令建表,把握表格中的数据的位置与x的 关系。由x来表达y在程序存储器中的地址,然后用MOVC指令 实现查表。 例如:求x平方时的表格结构。 DB 00H,01H,04H,09H,10H DB 19H,24H,31H,40H,51H 举例:自编例1、例2、例3及课本上的例4-5、例4-6、例4-7。
结束
图 两个无符号数比较流程图
4.3
汇编语言实用程序设计-分支转移程序设计
方法1:使用SUBB指令,依据借位CY状态判断两个数的大小!
ORG CLR MOV SUBB JNC CLR 1000H C A,40H A,41H LED0 P1.1
;清CY为零 ;取第一个数送A ;两数比较 ;CY=0,转至LED0 ;CY=1,(40H)<(41H),点亮P1.1 LED ;跳转到结束
4.3
汇编语言实用程序设计-查表程序设计
指令系统中给用户提供了两条极为有用的查表指令: ⑴ MOVC A,@A+DPTR ⑵ MOVC A,@A+PC 执行查表指令时,发出读程序存储器选通脉冲/PSEN。 指令“MOVC A,@A+DPTR”完成把A中的内容作为一
个无符号数与DPTR中的内容相加,所得结果为某一程序存 储单元的地址,然后把该地址单元中的内容送到累加器A
复习EQU
功能?
有错吗?
包装成子程 序?
START:
LOOP:
LENG EQU 10 SUM EQU 21H BLOCK EQU 22H ORG 0000 LJMP START ORG 0030H CLR A MOV R7, # LENG MOV R0, #BLOCK LCALL LOOP SJMP $ ADD A, @R0 INC R0 DJNZ R7, LOOP MOV SUM, A RET END
4.3
汇编语言实用程序设计-查表程序设计
例3 编写程序,实现 c a 2 b 2 。设a,b,c分别存于内 子程序与查表的综合举例 部RAM的30H,31H,32H三个单元中。程序段如下: START:MOV A,30H ;取a ACALL SQR ;调用查平方表 MOV R1,A ;a2 暂存于R1中 MOV A,31H ;取b ACALL SQR ;调用查平方表 ADD A,R1 ;a2+b2 存于A中 MOV 32H,A ;存结果 SJMP $ SQR :MOV DPTR,#TAB ;子程序 MOVC A,@A+DPTR ; RET TAB :DB 0,1,4,9,16 ,25,36,49,64,81
4.3
汇编语言实用程序设计
一个完整的源程序必备的四个要素:



有ORG 0000H,即源程序的机器码从ROM的0000H单元开 始存放。 通常源程序的存放要跳过中断向量区。实现方法:在0000H 单元存放一条转移指令,转向中断向量区后的主程序的真实 的入口地址,如START、MAIN等。 有END,告知汇编程序,你的源程序结束了。 源程序的主程序框架一定是一个顺序执行的无限循环的程序, 运行过程必须构成一个圈;子程序与主程序相对独立。
汇编语言实用程序设计-分支转移程序设计
有条件转移指令通常可以完成单分支转移 下列两种转移指令可以完成多分支转移 间接转移指令: JMP @A+DPTR; 比较转移指令: CJNE A,direct,rel; CJNE A,#data,rel; CJNE Rn,#data,rel; CJNE @Ri,#data,rel;
1 Y 0 1
X 0 X 0 X﹤0
数据规划:X放40H Y放41H 用CJNE指令,借助于 CY,可以判别X的符号。
4.3
汇编语言实用程序设计-分支转移程序设计
4.3
汇编语言实用程序设计-查表程序设计
例4-6 在一个以MCS-51为核心的温度控制器中,温度 特点:本例的x和y均为双字节无符号数。 例4-6 传感器输出的电压与温度为非线性关系,传感器输 y=f(x)在ROM中的地址 是TAB2+2x及TAB2+2x+1 出的电压已由A/D转换为10位二进制数x。根据测 入口参数:在R2R3 中; 得的不同温度下的电压值数据构成一个表,表中放 R2R3 中; 出口参数:在,x为电压值数据。设测得的电压值x放入 温度值y ***学习双字节无符号数乘2的解决方法。 R2R3中,根据电压值x,查找对应的温度值y,仍 读P81 例4-6 中。 放入R2R3
4.3
汇编语言实用程序设计-查表程序设计
思考题

求 x平方,x在R0中,取值范围在5~15
MOV R0 MOV A, A, R0 MOV DPTR,#TAB1 CLR C MOVC A, SUBB A,@A+DPTR #5 RET MOV DPTR,#TAB1 DB 25, 36, 49, 64,81 MOVC A,@A+DPTR DB 100,121,169,196,225 RET DB 25, 36, 49, 64,81 DB 100,121,169,196,225
SJMP FINISH LED0: CLR FINISH: RET
P1.0 ;CY=0,40H≥(41H),点亮P1.0 LED
4.3
汇编语言实用程序设计-分支转移程序设计
方法2:使用CJNE指令比较,借位CY来判断两个数的大小!
ORG 0000H MOV A,40H CJNE A,41H,COMP JNC LED0 CLR P1.1 SJMP CLR SJMP END FINISH P1.0 $
4.3
汇编语言实用程序设计-查表程序设计
特点:x为单字节、 y均为双字节无符号数。 例4-7设有一个巡回检测报警装置,需对16路输入进行检 例4-7 y=f(x)在ROM中的地址是TAB3+2x及TAB3+2x+1 测,每路有一最大允许值,为双字节数。运行时,需 入口参数:在R2 中; 根据测量的路数,找出每路的最大允许值。看输入值 是否大于最大允许值,如大于就报警。根据上述要求, 出口参数:在R3R4 中; 编一个查表程序。 ***又一种单字节无符号数乘2的解决方法。 取路数为x(0~15),y为最大允许值,事先存放在表格中。 用MOVC A,@A+PC,偏移量的求法。 读P81 例4-7 问题:出口参数R3R4中哪个是高字节?
ABC: ABC:
TAB1: TAB1:
4.3
汇编语言实用程序设计-分支转移程序设计
4.3.7 分支转移程序设计
特点是程序中含有转移指令。 转移指令有分为无条件转移和有条件转移。 有条件分支转移程序按结构类型来分,又分为单分支 转移结构和多分支转移结构。 1.单分支转移结构 程序的判别部分仅有两个出口,两者选一。 2.多分支转移结构 程序的判别部分有两个以上的出口流向。
内部RAM的40H单元和41H单元各存放了一个8位无符号数, 请比较这两个数的大小,比较结果通过单片机对LED的控制显
示出来。即:
若(40H)≥(41H),则P1.0管脚连接的LED发光;
若(40H)<(41H),则P1.1管脚连接的LED发光。
4.3
汇编语言实用程序设计-分支转移程序设计
开始
(40H)-(41H) N CY = 0 ? Y (40H)≥(41H) P1.0灯亮 (40H)<(41H) P1.1灯亮
4.3
汇编语言实用程序设计
ORG 0000H LJMP MAIN MOV ORG 0030H 30H, #20 MAIN: MOV 30H, #20 MOV 40H, #50H CLR MOV 40H, #50H A LCALLCLR A ABC LCALL ABC 按照规则包装成.ASM SJMP $ ABC: MOV R3, #30H MOV R1, #40H CLR A L1: MOV @R1,A INC R1 DJNZ R3, L1 RET END
;?30H ;?40H
START:
LOOP:
LENG EQU 10 SUM EQU 21H BLOCK EQU 22H ORG 0000 LJMP START ORG 0030H CLR A MOV R7, #LENG MOV R0, #BLOCK ADD A, @R0 INC R0 DJNZ R7, LOOP MOV SUM, A END SJMP $ END
COPM:
LED0: FINISH:
;取40H单元数据送A ;两数比较 ;相等后的判别 ;CY=1,(40)<(41H) ;点亮P1.1;连接的LED ;跳转到结束 ;CY=0,40H≥(41H), ;点亮P1.0连接的LED
4.3 例4-12
汇编语言实用程序设计-分支转移程序设计 求符号函数的值。程序框图如图4-6所示。
4.3
汇编语言实用程序设计-分支转移程序设计
4.3
汇编语言实用程序设计-分支转移程序设计
4.3
汇编语言实用程序设计-分支转移程序设计
K=0? 条件成立? N Y 程序段A 程序段B 下条指令 N 程序段A N K=2? N 条件成立? Y N K=1?
Y 分支0 Y 分支1 Y 分支2
4.3
据A的内容查出X对应的平方。
4.3
汇编语言实用程序设计-查表程序设计
例1:求x的平方,x:0~9 特点:x、y均为一字节, y=f(x)在ROM中的地址是TAB1+x ABC: MOV ABC: MOV MOV PUSH MOVC PUSH RET MOV MOVC POP POP RET A, A, R0 R0 DPTR,#TAB1 DPH ;保存DPH A,@A+DPTR DPL ;保存DPL DPTR,#TAB1 A,@A+DPTR DPL ;恢复DPL DPH ;恢复DPH
查x的平方表y,根据x的值查出相应的平方y。x和y均为单字 子程序 ADD A,#01H
MOVC A,@A+PC 的学习
Y+2
Y+3 Y+4
MOVC A,@A+PC
RET DB 00H,01H,04H,09H,10H DB 19H,24H,31H,40H,51H
第1条指令 ADD
A,#01H 的作用是加上偏移量,可以根
第九课
复习 4.3 汇编语言实用程序设计
4.3.3 查表程序设计
4.3.7 分支转移程序设计 4.3.8 循环程序设计
复习
源自文库
一个源程序的四个要素 子程序:形式、功能、入口参数、出口参数 子程序的调用:调用过程示意图 子程序调用及返回指令的执行过程 子程序的现场保护和参数传递 查表程序
相关文档
最新文档