用汇编语言写完整的程序
时间: 2023-10-05 21:08:20 浏览: 80
以下是一个汇编语言的完整程序,用于控制8个发光二极管的显示。程序使用了定时器中断和外部中断来实现不同的显示模式和切换:
```
;定义端口地址
P1 equ 0x90 ;P1口连接发光二极管的阳极
P3 equ 0xB0 ;P3口连接开关
;定义中断向量
ORG 0x0003 ;定时器0中断向量
TIMER0_ISR:
;更新随机数
MOV A, R7
ADD A, #1
MOV R7, A
;跳转到下一种显示模式
INC R5
CJNE R5, #3, L1
MOV R5, #0
L1: RETI ;返回中断
ORG 0x000B ;外部中断0向量
SWITCH_ISR:
;读取开关的状态
MOV A, P3
ANL A, #0x01
CJNE A, #0x01, MODE1 ;如果开关状态为1,跳转到MODE1
CJNE A, #0x00, MODE2 ;如果开关状态为0,跳转到MODE2
MODE1: ;第一种显示模式
MOV R0, #8 ;初始化计数器
MOV R1, #0x01 ;初始化掩码
L2: MOV P1, R1 ;点亮对应的发光二极管
MOV A, #0xFF ;延时
DJNZ A, $ ;延时
CLR P1.0 ;熄灭当前发光二极管
MOV A, #0xFF ;延时
DJNZ A, $ ;延时
RLC R1 ;左移一位,控制下一个发光二极管
DJNZ R0, L2 ;循环
JMP SWITCH_ISR ;跳转回中断
MODE2: ;第二种显示模式
MOV R0, #8 ;初始化计数器
L3: MOV A, R7 ;获取随机数
ANL A, #0x07 ;将A与0x07进行按位与操作,保证结果在0~7之间
MOV R6, A ;将结果存入R6寄存器
MOV A, #0x01 ;将A清零
RL A ;将A左移R6次
MOV P1, A ;点亮对应的发光二极管
MOV A, #0xFF ;延时
DJNZ A, $ ;延时
CLR P1.0 ;熄灭当前发光二极管
MOV A, #0xFF ;延时
DJNZ A, $ ;延时
DJNZ R0, L3 ;循环
JMP SWITCH_ISR ;跳转回中断
;初始化程序
START:
;初始化端口方向(P1为输出,P3的第0位为输入)
MOV P1, #0x00
MOV P3, #0xFF
;初始化定时器0(工作模式1,自动重装,12分频,计数初值为65535-1500=64035)
MOV TMOD, #0x01
MOV TH0, #0xFC
MOV TL0, #0x8B
;初始化中断向量表
MOV IE, #0x82 ;开启定时器0中断和外部中断0
MOV R5, #0 ;初始化显示模式计数器
MOV R7, #0 ;初始化随机数
;进入主程序循环
LOOP:
JMP LOOP
```
在程序中,定时器0中断用于更新随机数,外部中断0用于检测开关的状态并切换不同的显示模式。MODE1和MODE2分别是两种不同的显示模式的代码逻辑。在初始化程序中,需要先设置端口方向和定时器0的计数初值,并且开启定时器0中断和外部中断0。最后,进入主程序循环。
阅读全文