汇编语言 实验
2.18.6 深大-点灯实验4(使能Ai8051U内置 USB直接 仿真流水灯)
实验程序汇编语言代码
- ;以下是控制P6.0~P6.7引脚上一个LED灯循环亮灭跑马灯的汇编语言程序代码。
- ;特别注意延时子程序汇编语言写法。试通过每一条指令的所花的机器时钟周期计算一下软件延时时间。
- ;251汇编程序
-
- $INCLUDE(AI8051U.INC)
-
- STACK_POIRTER EQU 0D0H ;堆栈开始地址
-
- ORG 0000H
- LJMP MAIN
- ORG 0100H
-
- MAIN:
- SETB EAXFR ;允许访问扩展的特殊寄存器,XFR
- MOV WTST,#00H ;设置取程序代码等待时间,赋值为 0 表示不等待,程序以最快速度运行
- MOV CKCON,#00H ;设置访问片内的 xdata 速度,赋值为 0 表示用最快速度访问,不增加额外的等待时间
- MOV SP, #STACK_POIRTER ;堆栈栈顶设置
- ;端口初始化
- CLR A
- MOV P0M1, A ;设置P0为准双向口
- MOV P0M0, A
- MOV P1M1, A ;设置P1为准双向口
- MOV P1M0, A
- MOV P2M1, A ;设置P2为准双向口
- MOV P2M0, A
- MOV P3M1, A
- MOV P3M0, A
- MOV P4M1, A
- MOV P4M0, A
- MOV P5M1, A
- MOV P5M0, A
- MOV P6M1, A
- MOV P6M0, A
- MOV P7M1, A
- MOV P7M0, A
- MOV P0, #0FFH
- ;变量初始化
- CLR P40 ;流水灯总开关打开
-
- LOOP:
- MOV P0,#00H
- ACALL DELAY500MS ;调用延时子程序
- MOV P0,#0FFH
- ACALL DELAY500MS ;调用延时子程序
-
- CLR P00 ;给P6^0清零,低电平时led亮
- ACALL DELAY500MS ;调用延时子程序
- SETB P00 ;给P6^0置1,高电平时led灭
-
- CLR P01
- ACALL DELAY500MS ;调用延时子程序
- SETB P01
-
- CLR P02
- ACALL DELAY500MS ;调用延时子程序
- SETB P02
-
- CLR P03
- ACALL DELAY500MS ;500MS;调用延时子程序
- SETB P03
-
- CLR P04
- ACALL DELAY500MS ;调用延时子程序
- SETB P04
-
- CLR P05
- ACALL DELAY500MS ;调用延时子程序
- SETB P05
-
- CLR P06
- ACALL DELAY500MS ;调用延时子程序
- SETB P06
-
- CLR P07
- ACALL DELAY500MS
- SETB P07
-
- SJMP LOOP ;无条件跳转至LOOP处
-
- DELAY500MS: ;延时0.5S子程序@40.000MHz
- PUSH DR0 ;保护现场,将双字寄存器DR0(即R0~R3)推入堆栈保存
- MOV WR0,#76 ;将WR0赋值76(思考R0=?R1=?)
- MOV WR2,#19262 ;将WR2赋值19262(思考R2=?R3=?)
- NEXT:
- DEC DR0,#1 ;DR0<-(DR0)-1
- JNE NEXT ;(DR0)≠0,则跳至NEXT标号处即继续-1,知道等于0则执行下一条语句
- POP DR0 ;恢复现场
- RET ;子程序返回
- ;-----------------
-
- END ;汇编程序结束伪指令语句
复制代码
|