Top Banner
Copyright http: //www.myvtc.edu.cn 2006 单单单单单单单单单单单单单单单数数数数数数 数数数数数数数数数数数数 数数数数数数 数数数数数 数数数数 2-4 单单单单单单单单单单 单单 ()
41

2-4 汇编语言程序设计方法(二)

Jan 19, 2016

Download

Documents

afya

2-4 汇编语言程序设计方法(二). 单片机常见汇编语言程序设计举例: 数制转换程序 算术和逻辑运算类程序设计 查表程序设计 子程序设计 定时程序. ·. ·. ·. ·. ·. ·. ·. ·. ·. B. A. 22H. 21H. 20H. 1 、数制转换. 例 1 : 将 20H 单元的两个压缩 BCD 码拆开变成 ASCII 码,存入 21H 、 22H 单元。 ( 假设 20H 中的 BCD 码为 00110100). 什么是 BCD 码? 什么是 ASII 码?. 高四位 ASII 码. 0011. 低四位 ASII 码. - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

单片机常见汇编语言程序设计举例:数制转换程序算术和逻辑运算类程序设计查表程序设计子程序设计定时程序

2-4 汇编语言程序设计方法(二)

Page 2: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

1 、数制转换 例例 11 ::将 20H 单元的两个压缩 BCD 码拆开变成 ASCII 码,存

入 21H 、 22H 单元。 ( 假设 20H 中的 BCD 码为 00110100)

什么是 BCD 码?什么是 ASII 码?

···

···

···

20H20H

21H21H

22H22H

AA

BB

0011压缩 BCD

0011

0011

0100

低四位 ASII 码高四位 ASII 码

Page 3: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

方法 1:将 BCD 码除以 10H ,恰好是将 BCD 码分别移到了 A、 B的低 4位。然后再各自与 30H 相或,即成为 ASCII 码。

方法 2:利用半字节交换指令来实现。

Page 4: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

ORG 0000H

MOV A , 20H

MOV B , #10H

DIV AB

ORL B , #30H

MOV 21H , B

ORL A , #30H

MOV 22H , A

SJMP $

END

开始

(20H)A

10HB

A/B (A 中为高 4 位 BCD 码, B 中为低 4 位 BCD 码 )

B+30HB

B(22H)

A+30HA

A(21H)

结束

数制转换程序 1--- 方法 1

源程序如下:

···

···

···

20H20H

21H21H

22H22H

AA

BB

0011 0100

PCPC

PCPC

0011 0100

0001 0000PCPC

001100000000 0100

PCPC0011 0100

PCPC

PCPC

PCPC

0011

PCPC

Page 5: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

ORG 0000H

MOV R0 , #20H

MOV A , #30H

XCHD A , @R0

MOV 21H , A

MOV A , @R0

SWAP A

ANL A, #0FH

ORL A , #30H

MOV 22H, A

SJMP $

END

简单程序例 1--- 方法2

开始

#20HR0

#30HA

A 的低 4 位( 20H) 的低 4位 A(21H)

(20H)A

A 的低 4 位 A 的高 4 位

A(22H)

结束

A+30HA

PCPC

PCPC

PCPC

PCPC

PCPC

PCPC

PCPC

PCPC

源程序如下:···

···

···

20H20H

21H21H

22H22H

AA

R0R0

0011

0010 0000

0011

0100

000001000011 0100

0011 0000

0011 00000011

PCPC

0011

PCPC

Page 6: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

BCD 码十进制转换成二进制

例:假如在内部 RAM40H 单元中存储有一个压缩 BCD 编码的两位十进制数,设计一段程序把这个数转换成二进制数并存入 41H 单元中。

16 ( 40H )

余数

商为二进制的高四位

余为二进制的低四位

解题思路:

将高四位乘以 0AH,再加上低四位即可。

Page 7: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

程序清单ORG 0000HMOV A , 40HMOV B , #16DIV ABMOV 20H , BMOV

B , #0AHMUL ABADD A , 20HMOV 41H , ASJMP $END

取出 30H 数据除以 16 ,商 A ,余 B

将十位数的二进制数加上个位数,结果 41H

将十位数乘以 0AH ,其结果不会超过一个字节,在 A 中

Page 8: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

2. 算术和逻辑运算类程序设计多字节 BCD 码十进制数相加例:假如在 MCS-51 单片机内部 RAM 中 30H~37H 单元、 38H~3FH 单元分别存放有两个 8 字节 BCD 码十进制数,设计一段程序将这两个数相加,并把结果存于 2FH~37H单元中,小地址存数据的高字节。

解题思路:先清 Cy 位,把( 37H )和( 3FH )进行带Cy 相加,在进行十进制调整,结果存于 37H 单元中;把( 36H )和( 3EH )进行带 Cy 相加,在进行十进制调整……循环至结束,结果把最高字节的 Cy 存入 2FH 单元。

Page 9: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

流程与程序清单 ORG 0000H MOV R2,#08H MOV R0,#37H MOV R1,#3FH CLR CLOP:MOV A,@R0

ADDC A,@R1DA AMOV @R0,ADEC R0DEC R1DJNZ R2,LOPCLR ARLC AMOV 2FH,ASJMP $END

设定循环次数, R0 和 R1 分别指向加数和被加数的首地址

相加,并回存结果

开始

R037H (被加数首地址)R13FH (加数首地址)R208H (循环次数)清 Cy 位

加数和被加数相加,十进制调整,并回存

Cy 存入 2FH 单元

结束

调整数据指针R0 ( R0 ) -1R1 ( R1 ) -1

(R2)-1=0?N

Y

R0 和 R1 分别指向加数和被加数的下一地址,判断循环次数

存进位标志

Page 10: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

极值查找程序例:在 MCS-51 单片机内部 RAM 的 40H-47H 单元中存有 8 个

无符号数,设计一段程序找出其中的最大值 , 并存放到 48H 单元中。

这是一个求最大值的问题。解题思路:先把( A )( 40H ),然后将( 41H )和( A )

进行比较,如果( 41H ) > ( A ),则( A )( 41H ),然后和下一个字节进行比较,依次类推,最后( A )必定是最大值。

40H 41H 42H 43H 44H 45H 46H 47H

48H

Page 11: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

开始

R040H (数据区首地址)R207H (循环次数)A((R0)) (取第一个数)

R0(R0)+1( 指向下一个数)B ((R0))

结束

A≥B?

N

Y

A (B)

(R2)-1=0?

48H(A)

N

Y

ORG 0000H

MOV R2,#07H

MOV R0,#40H

MOV A,@R0

LOOP:INC R0

MOV B,@R0

CJNE A,B,NEX

NEX: JNC NET

MOV A,B

NET: DJNZR2,LOOP

MOV 48H,A

SJMP $

END

设定循环次数 R1 , R0 作为数据指针,指向数据区第一个字节

取出下一个字节,存入 B

如果 (A)<(B),

则 (A)(B)

次数到否,到则取出 (A)48H

Page 12: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

排序程序程序名 : BUBBLE

功能 :将片内 RAM 数据块由大到小排序

入口参数: R0 指向数据块首地址, R2 存放数据块长度

出口参数:仍存放原来位置

占用资源: R0 , R1 , R2 , R3 , R5 , A , PSW ; 00H位

Page 13: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

BUBBLLE : MOV A , R0 MOV R1 , A MOV A , R2 MOV R5 , ABUBB1 : CLR 00H DEC R5 MOV A , @R1 BUB1 : INC R1 MOV B , @R1 CJNE

A , B , BUB0BUB0 : JNC BUB2 SETB 00H XCH A , @R1

BUB2 : DEC R1 MOV @R1,A INC R1 MOV A,@R1 DJNZ R5 , BUB1 MOV A , R0 MOV R1 , A MOV A , R2 MOV R5 , A JB 00H , BUBB1 RET

Page 14: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

键控移位例:有一电路如图所示,设计一个程序实现以下功能: SW 按下第 1次, VD1 发光; SW 按下第 2 次, VD1 、 VD2 发光; SW 按下第 3次, VD1 、 VD2 、 VD3 发光…… SW 按下第 7 次, VD1—VD7 发光; SW 按下第 8 次, VD1 发光; SW 按下第 9 次, VD1 、 VD2发光……依次轮回。

解题思路:本例涉及到查询按键按下的过程, SW 没有按下时 P2.0 为高电平,按下为低电平。实际应该查询的是 P2.0 的下降沿, P2.0 有一个下降沿,表明有一个按键按下, LED 的状态应该改变一次。

EA/VP31

X119

X218

RESET9

INT012

INT113

T014

T115

P1.01

P1.12

P1.23

P1.34

P1.45

P1.56

P1.67

P1.78

P0.0 39

P0.138

P0.2 37

P0.3 36

P0.435

P0.5 34

P0.633

P0.7 32

P2.0 21

P2.1 22

P2.223

P2.3 24

P2.4 25

P2.5 26

P2.6 27

P2.728

RD17

WR 16

PSEN 29

ALE/P30

TXD 11

RXD10

AT89C51

C230pF

C330pF

Y16.000MHZ

GND

SW

VD1

VD2

VD3

VD4

VD5

VD6

VD7 R2 330

R3 330

R4 330

R5 330

R6 330

R7 330

R8 330

R9 4.7KGND

VCC

R1

10K

+ C147uF

GND

VCC

VCC

Page 15: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

程序清单SW BIT P2.0 ORG 0000HLOOP0: SETB SW

MOV A,#01HMOV R7,#07H

LOOP1: MOV C,SWMOV R6,#255

DELAY: NOPNOPDJNZ R6,DELAYANL C,/SWJNC LOOP1RLC AORL A,#01HMOV P2,ADJNZ R7,LOOP1SJMP LOOP0END

置 P2.0 为输入方式,确定循环次数为 7

延时消抖判断是否有下降沿,有则移位,否则继续查询

显示输出,如果循环次数到则重新开始

初态

次态

Page 16: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

数据排序程序例:将片内 RAM 中 20H-27H 中的数据按照从小到大的顺序重新排

列。解题思路:见下图

RAM 地址 20H 21H 22H 23H 24H 25H 26H 27H

原始数据 66H 11H 10H 34H 67H 01H 89H A0H

1 01H 11H 10H 34H 67H 66H 89H A0H

2 01H 10H 11H 34H 67H 66H 89H A0H

3 01H 10H 11H 34H 67H 66H 89H A0H

4 01H 10H 11H 34H 66H 67H 89H A0H

5 01H 10H 11H 34H 66H 67H 89H A0H

6 01H 10H 11H 34H 66H 67H 89H A0H

7 01H 10H 11H 34H 66H 67H 89H A0H

Page 17: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

R1←20H , R0 ←(R1)+1R3 ←08H

B←((R1)) ,R2 ←(R3)-1查找最小值并和 (R1) 单元互换

R3-1=0?

END

R1 ←(R1)+1

N

Y

程序流程:

Page 18: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

程序清单: ORG 0000H MOV R1, #20H MOV R3, #08HLOOP1: MOV A, R1 ;R0←(R1)+1 INC A MOV R0, A MOV A, R3 ; R2←(R3)-1 DEC A MOV R2, A MOV B, @R1 LOOP: MOV A, @R0 CJNE A, B, MM MM: JNC SS ; 如果 A≥B 跳转 MOV B, A MOV 28H, R0 ; 28h 纪录最小值所在单元的编号 SS: INC R0 DJNZ R2, LOOP MOV R0, 28H ; 最小值单元和 20H 单元内容互换 MOV A, @R1 ; 数据 MOV @R0, A MOV @R1, B INC R1 DJNZ R3, LOOP1 END

Page 19: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

3. 查表程序设计程序使用的专用指令:

MOVC A, @A+PC MOVC A, @A+DPTR

一般情况下 , 常使用后者程序设计一般规则 :先确定表格存放的位置在表格中填入相应的数据查表时先将表格的首地址给 DPTR ,再将要查表的数

据送给 A ,最后用 MOVC A, @A+DPTR

Page 20: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

例 1 :假如在 MCS-51 单片机内部 RAM 中 40H 单元内存放的是一个角度(范围 0- 90 ),设计一段程序,计算出 200sin(), 把结果存入 41H 单元中(结果只取整数)。解题思路:先建立一个相应的数值表格,定义在程序存储器中,利用输入的值进行查表。例程: ORG 0000H MOV DPTR,#TABLE MOV A,40H MOVC A,@A+DPTR MOV 41H,A SJMP$TABLE:DB 0,3,7,10,14,17,21,24,28,31,35,38 DB 41,45,48…199,200,200 END

查表

表格内容

表格的数据是怎么计算

出来的?

Page 21: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

例 2 :假如在 MCS-51 单片机内部 RAM 中 40H 单元内存放的是一个参数x(范围 0-10 ),设计一段程序,计算出 5x3+4x2+3x+1, 把结果存入 41H 和 42H 单元中(高位在前)。

解题思路:先建立一个相应的数值表格(每个为 2 个字节),定义在程序存储器中,利用输入的值进行查表。

例程: ORG 0000H MOV DPTR,#TABLE MOV A,40H

CLR C RLC A

; A*2-->A PUSH ACC

MOVC A,@A+DPTR MOV 41H,A POP ACC INC A MOVC A,@A+DPTR MOV 42H,A SJMP $

TABLE: DW 0001H,000DH,003FH,00B5H,018DH DW 02D1H,04DBH,078DH,0B19H,0F9DH,1537H

END

查表 ,得到高两位数

表格内容

查表 ,得到低两位数

Page 22: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

4. 子程序设计在实际问题中,常常会遇到在一个程序中多次用到相同的

运算或操作,若每遇到这些运算或操作,都从头编起,将使程序繁琐、浪费内存。因此在实际中,经常把这种多次使用的程序段,按一定结构编好,存放在存储器中,当需要时,可以调用这些独立的程序段。通常将这种可以被调用的程序段称为子程序。

主要内容: 1. 主程序与子程序的关系 2. 子程序嵌套 3. 子程序的调用与返回

Page 23: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

主程序与子程序的关系

子程序 SUB

主程序 MAIN

LCALL SUB

调用子程序

子程序入口地址

RET

Page 24: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

ORG 0000H

MAIN: MOV A,#0FEH ;送显示初值

LP: MOV R0,#10 ;送闪烁次数

LP0: MOV P1,A ;点亮 LED

LCALL DELAY ;延时

MOV P1,#0FFH ;熄灭灯

LCALL DELAY ;延时

DJNZ R0,LP0

RL A SJMP LP

END

实 例 : LED 灯 的 闪 烁 点 亮(一)

延时

次数 -1=0

点亮相应的 LED

Y

N

熄灭相应的 LED

延时

初值左移 1 位指向下一个 LED

设闪烁次数

送显示初值

开始

Page 25: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

子程序嵌套

子程序嵌套 ( 或称多重转子 ) 是指在子程序执行过程中,还可以调用另一个子程序。

子程序 SUB1

主程序 MAIN

LCALL SUB1

RET

子程序 SUB2

RET

LCALL SUB2

Page 26: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

子程序嵌套范例:LED

灯闪烁

(

二)

ORG 0000H MAIN: MOV A,#0FEH ;送显示初值 COUN: ACALL FLASH ;调闪烁子程序

RL A ; A左移,下一个灯闪烁 SJMP COUN ;循环不止

FLASH: MOV R0,#10 ;送闪烁次数FLASH1: MOV P1,A ;点亮 LED

LCALL DELAY ;延时 MOV P1,#0FFH ;熄灭灯 LCALL DELAY ;延时 DJNZ R0,FLASH1 ;闪烁次数不够 10 次,继续 RET

DELAY: MOV R3,#0FFH ;延时子程序 DEL2: MOV R4,#0FFH DEL1: NOP DJNZ R4,DEL1 DJNZ R3,DEL2

RET END

Page 27: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

子程序的调用与返回 问题:问题:子程序调用、返回到主程序中的正确位置,并接著执行主程序中的后续指令呢?

为了解决这个问题,我们采用了堆栈技术。

子程序 SUB1

主程序 MAIN

RET

子程序 SUB2

RET

20102013

21102113

2100 2200

20 13

2013

PC21 13

1321

堆栈指针 SP 堆栈

LCALL SUB1 LCALL SUB2

21 1320 13

Page 28: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

子程序设计注意事项 (1) 要给每个子程序起一个名字 ,也就是入口地址的代号。 (2) 要能正确地传递参数。即首先要有入口条件,说明进入子程序时,它所要处理的数据放在何处 (如:是放在 A中还是放在某个工作寄存器中等 )。另外,要有出口条件,即处理的结果存放在何处。 (3) 注意保护现场和恢复现场。在子程序使用累加器、工作寄存器等资源时,要先将其原来的内容保存起来,即保护现场。当子程序执行完毕,在返回主程序之前,要将这些内容再取出,送还到累加器、工作寄存器等原单元中,这一过程称为恢复现场。

例 4.11 查表子程序。

注意: 1.入口参数和出口参数的位置

2. 现场的保护与恢复。

Page 29: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

子程序的参数传递

范例:计算平方和范例:计算平方和 c=ac=a22+b+b22

ORG 0000H ;主程序MOV SP,#3FH ;设置栈底MOV A,31H ;取数 a 存放到累加器 A 中作为入口参数LCALL SQR ;计算 aa22

MOV R1,A ;出口参数——平方值存放在 A 中MOV A,32H ;取数 b 存放到累加器 A 中作为出口参数LCALL SQR ;计算 bb22

ADD A,R1 ;求和MOV 33H,A ;存放结果SJMP $

Page 30: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

;; 子程序:子程序: SQRSQR;;功能:通过查表求出平方值功能:通过查表求出平方值 y=xy=x22

;;入口参数:入口参数: xx存放在累加器存放在累加器 AA 中中;;出口参数:求得的平方值出口参数:求得的平方值 yy存放在存放在 AA 中中;;占用资源:累加器占用资源:累加器 AA ,数据指针,数据指针 DPTRDPTR

SQR : USH DPH ;保护现场,将主程序中 DPTR 的高八位放入堆栈 PUSH DPL ;保护现场,将主程序中 DPTR 的低八位放入堆栈 MOV DPTR,#TABLE ;在子程序中重新使用 DPTR, 表首地址→ DPTR MOVC A, @A+DPTR ;查表 POP DPL ;恢复现场,将主程序中 DPTR 的低八位从堆栈中弹出 POP DPH ;恢复现场,将主程序中 DPTR 的高八位从堆栈中弹出 RETTABLE: DB 0,1,4,9,16,25,36,49,64,81

Page 31: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

例:假如在 MCS-51 单片机外部 RAM 中 00H—07H 单元中依次存放有 8 个无符号数 Xi(i为 0-7 ),设计一段程序计算出 Yi=Xi

2 ,并把结果存于外部 RAM 10H 开始的 16个单元中( Yi 占用两个字节,高位在前);再计算 Zi=Xi÷2 ,并把 Zi 依次存放在 Xi 所在的单元。

解题思路:在本例中, Yi=Xi2 和 Zi=Xi÷2都比较复杂,我们可以分别使用子程序。

程序清单: ORG 0000HMOV R0,#00HMOV R1,#10HMOV R2,#08H

LOOP: MOVX A,@R0LCALL DIVIDELCALL SQUAREMOVX @R1,BINC R1MOVX @R1,ADJNZ R2,LOOPSJMP $

END

R0 和 R1 作为数据指针, R2为循环次数。传递参数,调用运算子程序

存放结果

Page 32: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

DIVIDE:PUSHACC

CLR CRRC AMOVX

@R0,APOP

ACCRET

SQUARE:MOV B,AMUL ABRETEND

Zi=Xi÷2 运算子程序

Yi=Xi2 运算子程序

Page 33: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

5. 定时程序单重循环延时例 1: 假设单片机的 fosc=12MHz, 计算单片机执行下面程序消耗

的时间。DELAY: MOV R5,#TIME ;1 机器周期 MM : NOP ;1 机器周期 DJNZ R5,MM ;2 机器周期 RET ;2 机器周期执行完以上 4条语句 , 所花时间 :T=(1+ ( 1+2)×TIME) +2 ×1s推广计算式 :T(机器周期数 )=(循环体机器周期数 ) ×循环次数 + 初始化机

器周期数

Page 34: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

多重循环延时例 1: 假设单片机的 fosc=12MHz, 计算单片机执行下面程序消耗的

时间。DELAY2: MOV R3,#TIME1 ;1 机器周期 LOOP1: MOV R2,#TIME2 ;1 机器周期 LOOP2: NOP ;1 机器周期 DJNZ R2,LOOP2 ;2 机器周期 DJNZ R3,LOOP1 ;2 机器周期 RET ;2 机器周期 执行完以上 6条语句 , 所花时间 : T=(1+(1+ ( 1+2)×TIME2+2)×TIME1 +2) ×1s

Page 35: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

习题选讲 例 1. 设计一段程序实现如下功能:找出从片内 RAM30h 开始的 16 个单元中最小值所在的单元,并将该单元的值替换成 0ffh 。(最小单元可能不止一个)ORG 000H

LJMP MAIN ORG 100H MAIN: ;; 给片内 RAM30H 单元开始的 16 个单元赋值。 MOV R0,#30H MOV R1,#(table1-table) MOV DPTR,#TABLE LOP: CLR A MOVC A,@A+DPTR MOV @R0,A INC R0 INC DPTR DJNZ R1,LOP;; 查找片内 RAM30H 单元开始的 16 个单元的最小值,并存于 B 寄存器。 MOV R0,#30H MOV R1,#(table1-table) MOV B,#0FFH LOP0: MOV A,@R0 CJNE A,B,$+3 JNC LOP1 MOV B,@R0 LOP1: INC R0 DJNZ R1,LOP0

;; 读出片内 RAM30H 单元开始的 16 个单元的内容,并和最小值比较,相等则把该单元的值替换成 0ffh. MOV R0,#30H MOV R1,#(table1-table) LOP2: MOV A,@R0 CJNE A,B,LOP3 MOV @R0,#0FFH LOP3: INC R0 DJNZ R1,LOP2 SJMP $

TABLE: DB 10H,25H,2H,00H,12H,33H,45H,00H,78H DB 80H,0AAH,0BBH,12H,23H,34H,00H TABLE1:

END

Page 36: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

习题选讲 例 2. 设计一段程序实现逻辑运算: P1.7=P1.6 ( P1.5 P1.4⊙ )

分析:在位逻辑运算指令中只有 ANL 、 ORL 、 CPL 指令,没有 XRL(异或)和同或指令,所以对上述表达式进行等效转换后为:

P1.7=P1.6* ( P1.5*P1.4+/P1.5*/P1.4 )

ORG 0000h LJMP START ORG 50h START: MOV C,P1.4 CPL C ANL C,/P1.5 ;C=/P1.4*/P1.5 MOV F0,C ;F0=C=/P1.4*/P1.5 MOV C,P1.4 ANL C,P1.5 ;C=P1.4*P1.5 ORL C,F0 ;C=C+F0=P1.4*P1.5+/P1.4*/P1.5= P1.5 P1.4⊙ ANL C,P1.6 ;C=P1.6*(P1.5 P1.4)⊙ MOV P1.7,C ;P1.7=C=P1.6*(P1.5 P1.4)⊙ SJMP $ END

Page 37: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

习题选讲 例 3. 参照下图设计一个彩灯控制程序,让 8 个 led 按照自己的设想发光,显示的样式尽可能的丰富。

Page 38: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

工作原理

当 P1 。 0~P1 。 7 中的某端口为高电平时,对应的发光二极

管亮,为低电平灭。我们只要控制 P1 口各位的电平状态,就可以控制 8 只 LED 的亮与灭。

例如使( P1 ) =01010101B=55H , D7 、 D5 、 D3 、 D14 只

LED 灭, D6 、 D4 、 D2 、 D04 只 LED 亮,从效果上看亮与灭

是相间隔的;反之,使( P1 ) =10101010B=AAH ,则另外

4 只 LED 亮,若反复以一定时间间隔不断从 P1 口轮流输出 5

5H 和 AAH ,则 P1 口上 8 只 LED 会呈现流水彩灯的效果。

Page 39: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

开始开始

55H55H送送 PP11 口口

延时延时 0.30.3 秒秒

AAHAAH送送 PP11 口口

延时延时 0.30.3 秒秒

流水式彩灯程序流程图流水式彩灯程序流程图

ORG 0000H ORG 0000H

LOOPLOOP : : MOV P1,#55H MOV P1,#55H

;将立即数;将立即数 55H55H 送送 PP11 端口端口LCALL TIME LCALL TIME ;调延时子程序;调延时子程序 TIMETIME

MOV P1,#0AAH MOV P1,#0AAH

;将立即数;将立即数 AAHAAH 送送 PP11 端口端口LCALL TIME LCALL TIME ;调延时子程序;调延时子程序 TIMETIME

SJMP LOOP SJMP LOOP ;转移到;转移到 LOOPLOOP

TIMETIME : : MOV R6,#200 MOV R6,#200 ;延时子程序;延时子程序 TIMETIME

TIME1TIME1 :: MOV R7,#200 MOV R7,#200

TIME2TIME2 :: NOPNOP

NOPNOP

NOPNOP

DJNZ R7,TIME2DJNZ R7,TIME2

DJNZ R6,TIME1DJNZ R6,TIME1

RETRET

ENDEND

Page 40: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

44 )开幕式与闭幕式彩灯程序)开幕式与闭幕式彩灯程序 ORGORG 0000H0000H

LJMPLJMP MAIN MAIN ;跳转到主程序;跳转到主程序ORGORG 0030H0030H

MAINMAIN :: MOVMOV R0,#8 R0,#8 ;; R0R0 送循环次数送循环次数 88MOVMOV DPTR,#TAB DPTR,#TAB ;给数据指针赋值;给数据指针赋值

LOOPLOOP :: MOVMOV A,#00H A,#00H ;;MOVCMOVC A,@ A + DPTRA,@ A + DPTRMOVMOV P1,AP1,ALCALLLCALL TIMETIMEINCINC DPLDPLDJNZDJNZ R0,LOOPR0,LOOPSJMPSJMP MAINMAIN

TIMETIME :: MOV MOV R6,#200R6,#200TIME1TIME1 :: MOV MOV R7,#200R7,#200TIME2TIME2 :: NOPNOP

NOPNOPNOPNOPDJNZ DJNZ R7,TIME2R7,TIME2DJNZ DJNZ R6,TIME1R6,TIME1RETRET

TABTAB :: DB 81H,0C3H,0E7H,0FFH,18H,3CH,7EH,0FFHDB 81H,0C3H,0E7H,0FFH,18H,3CH,7EH,0FFH

END END

你发现数据的特点

了吗?

Page 41: 2-4   汇编语言程序设计方法(二)

Copyright http://www.myvtc.edu.cn 2006

本章小结修改上例中 Tab 中的数据,使显示方式尽可能的丰富。

本章要求:了解 MCS-51 单片机的 7种寻址方式;掌握数据传送与交换、算术运算、逻辑运算、控制转移、

位操作 5 类共 111条指令的功能,特别是每一类指令中比较常用的指令;

掌握MCS-51 单片机汇编语言程序的基本格式及伪指令;了解程序的基本结构(顺序结构、分支结构、循环结构)

和程序设计的基本方法;掌握数制转换、算术运算、极值查找等典型程序的设计;掌握子程序的设计方法及其参数传递方法。