Copyright http: //www.myvtc.edu.cn 2006 单单单单单单单单单单单单单单单: 数数数数数数 数数数数数数数数数数数数 数数数数数数 数数数数数 数数数数 2-4 单单单单单单单单单单 单单 ()
Jan 19, 2016
Copyright http://www.myvtc.edu.cn 2006
单片机常见汇编语言程序设计举例:数制转换程序算术和逻辑运算类程序设计查表程序设计子程序设计定时程序
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 码
Copyright http://www.myvtc.edu.cn 2006
方法 1:将 BCD 码除以 10H ,恰好是将 BCD 码分别移到了 A、 B的低 4位。然后再各自与 30H 相或,即成为 ASCII 码。
方法 2:利用半字节交换指令来实现。
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
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
Copyright http://www.myvtc.edu.cn 2006
BCD 码十进制转换成二进制
例:假如在内部 RAM40H 单元中存储有一个压缩 BCD 编码的两位十进制数,设计一段程序把这个数转换成二进制数并存入 41H 单元中。
16 ( 40H )
余数
商为二进制的高四位
余为二进制的低四位
解题思路:
将高四位乘以 0AH,再加上低四位即可。
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 中
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 单元。
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 分别指向加数和被加数的下一地址,判断循环次数
存进位标志
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
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
Copyright http://www.myvtc.edu.cn 2006
排序程序程序名 : BUBBLE
功能 :将片内 RAM 数据块由大到小排序
入口参数: R0 指向数据块首地址, R2 存放数据块长度
出口参数:仍存放原来位置
占用资源: R0 , R1 , R2 , R3 , R5 , A , PSW ; 00H位
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
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
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
延时消抖判断是否有下降沿,有则移位,否则继续查询
显示输出,如果循环次数到则重新开始
初态
次态
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
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
程序流程:
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
Copyright http://www.myvtc.edu.cn 2006
3. 查表程序设计程序使用的专用指令:
MOVC A, @A+PC MOVC A, @A+DPTR
一般情况下 , 常使用后者程序设计一般规则 :先确定表格存放的位置在表格中填入相应的数据查表时先将表格的首地址给 DPTR ,再将要查表的数
据送给 A ,最后用 MOVC A, @A+DPTR
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
查表
表格内容
表格的数据是怎么计算
出来的?
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
查表 ,得到高两位数
表格内容
查表 ,得到低两位数
Copyright http://www.myvtc.edu.cn 2006
4. 子程序设计在实际问题中,常常会遇到在一个程序中多次用到相同的
运算或操作,若每遇到这些运算或操作,都从头编起,将使程序繁琐、浪费内存。因此在实际中,经常把这种多次使用的程序段,按一定结构编好,存放在存储器中,当需要时,可以调用这些独立的程序段。通常将这种可以被调用的程序段称为子程序。
主要内容: 1. 主程序与子程序的关系 2. 子程序嵌套 3. 子程序的调用与返回
Copyright http://www.myvtc.edu.cn 2006
主程序与子程序的关系
子程序 SUB
主程序 MAIN
LCALL SUB
调用子程序
子程序入口地址
RET
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
设闪烁次数
送显示初值
开始
Copyright http://www.myvtc.edu.cn 2006
子程序嵌套
子程序嵌套 ( 或称多重转子 ) 是指在子程序执行过程中,还可以调用另一个子程序。
子程序 SUB1
主程序 MAIN
LCALL SUB1
RET
子程序 SUB2
RET
LCALL SUB2
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
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
Copyright http://www.myvtc.edu.cn 2006
子程序设计注意事项 (1) 要给每个子程序起一个名字 ,也就是入口地址的代号。 (2) 要能正确地传递参数。即首先要有入口条件,说明进入子程序时,它所要处理的数据放在何处 (如:是放在 A中还是放在某个工作寄存器中等 )。另外,要有出口条件,即处理的结果存放在何处。 (3) 注意保护现场和恢复现场。在子程序使用累加器、工作寄存器等资源时,要先将其原来的内容保存起来,即保护现场。当子程序执行完毕,在返回主程序之前,要将这些内容再取出,送还到累加器、工作寄存器等原单元中,这一过程称为恢复现场。
例 4.11 查表子程序。
注意: 1.入口参数和出口参数的位置
2. 现场的保护与恢复。
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 $
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
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为循环次数。传递参数,调用运算子程序
存放结果
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 运算子程序
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(机器周期数 )=(循环体机器周期数 ) ×循环次数 + 初始化机
器周期数
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
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
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
Copyright http://www.myvtc.edu.cn 2006
习题选讲 例 3. 参照下图设计一个彩灯控制程序,让 8 个 led 按照自己的设想发光,显示的样式尽可能的丰富。
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 会呈现流水彩灯的效果。
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
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
你发现数据的特点
了吗?
Copyright http://www.myvtc.edu.cn 2006
本章小结修改上例中 Tab 中的数据,使显示方式尽可能的丰富。
本章要求:了解 MCS-51 单片机的 7种寻址方式;掌握数据传送与交换、算术运算、逻辑运算、控制转移、
位操作 5 类共 111条指令的功能,特别是每一类指令中比较常用的指令;
掌握MCS-51 单片机汇编语言程序的基本格式及伪指令;了解程序的基本结构(顺序结构、分支结构、循环结构)
和程序设计的基本方法;掌握数制转换、算术运算、极值查找等典型程序的设计;掌握子程序的设计方法及其参数传递方法。