本帖最后由 angmall 于 2017-3-15 23:43 编辑
-
- ;点亮P2口的多个LED灯闪烁
- ;该程序是单片机学习中最简单最基础的,
- ;通过程序了解如何控制端口的高低电平
- ORG 0000H ;意思是该条指令从ROM的0000H单元开始存放,
- LJMP MAIN ;LJMP longjump简写
- ORG 030H ;意思是此指令从ROM的30H开始存放,该指令是为了绕开0003H,000BH,0013H,001BH.....等中断入口而设置.
- MAIN: ;主循环
- MOV P2, #00H ; P2口 赋初值
- ACALL DELAY ; 单片机ACALL是短调用子程序的意思。
- MOV P2, #0FFH ; 此方法使用bit位对单个端口赋值 换成二进制是1111 1111
- ACALL DELAY
- AJMP MAIN ; 是无条件跳转指令之一,叫做绝对跳转。 AJMP的范围为正负2K单元。
- DELAY: ; 延时 523277个机器周期
- MOV R5, #04H ; 典型延时程序 523277个机器周期
- F3: MOV R6, #0FFH ;
- F2: MOV R7, #0FFH ;
- F1: DJNZ R7,F1 ; DJNZ是减一判断
- DJNZ R6,F2 ;
- DJNZ R5,F3 ;
- RET
- END
复制代码
;例如MOV指令,执行这条指令需要一个机器周期。DJNZ指令,执行这条指令需要2个机器周期。
;延时程序共有三层循环
;一层循环n:R7*2 = 255*2 = 510个机器周期 (DJNZ 2个机器周期)
;二层循环m:R6*(n+3) = 255*513 = 130815个机器周期 (DJNZ 2个机器周期 + R5赋值 1个机器周期 = 3个机器周期)
;三层循环: R5*(m+3) = 4*130818 = 523272个机器周期 (DJNZ 2个机器周期 + R6赋值 1个机器周期= 3个机器周期)
;循环外: 5个机器周期 子程序调用 2个机器周期 + 子程序返回 2个机器周期 + R7赋值 1个机器周期 = 5个机器周期
;延时总时间 = 三层循环 + 循环外 = 523272+5 = 523277个机器周期
;计算公式:延时时间=[(2*R7+3)*R6+3]*R5+5
ORG 0000H
LJMP MAIN ;意思是该条指令从ROM的0000H单元开始存放,
ORG 0030H
MAIN:MOV ..... ;意思是此指令从ROM的30H开始存放,该指令是为了绕开0003H,000BH,0013H,001BH.....等中断入口而设置.
ORG指令属于伪指令,不控制程序执行,只是控制汇编过程,也就是说,ORG指令在汇编过程中,告诉紧随其后的指令存放的位置.所以在程序执行时,从0000H单元取出长转移指令LJMP MAIN后,自然会转移到主程序MAIN:MOV.......了.
|