📄 aexp8-1.asm
字号:
;*********************************************************************
; Aexp8-1.asm 声-光报警程序 *
; 运行步骤:1.按下一次开关SW3,开始声-光报警,再按下一次则停止;重复上述操作*
; 2.按下"q"或者"Q",退出 *
;*********************************************************************
sseg segment para stack 'stack'
dw 200 dup (?)
db 256 dup(0)
sseg ends
dseg segment para public 'data'
message db 'press SW3 to start and then press SW3 to stop,and so on!',0ah,0dh ;系统提示信息
db 'if you want to quit,please hit ''q'' or ''Q''!',0ah,0dh,'$'
flag db 0 ;初始化状态标志变量为0
t dw 0
;初始化延时变量为0
dseg ends
data segment
count db 0
tenm db '0'
minute db '0'
db':
tens db '0'
second db '0','$'
data ends
cseg segment para public 'code'
assume ss:sseg,cs:cseg,ds:dseg
m proc far
start:
mov ax,ds
push ax
mov ax,00h
push ax ;保留程序数据段地址
mov ah,09h ;显示系统提示信息
mov dx,seg message
mov ds,dx
mov dx,offset message
int 21h
;初始化8255
mov dx,303h ;取8255的控制端口的地址
mov al,83h ;初始化8255的A口和C口高四位为输出模式
out dx,al ;B口和C口低四位为输入模式
;初始化灯LED全灭
mov dx,300h ;取8255的端口A的地址
mov al,00h ;使8255的PA0-PA7全为0
out dx,al ;使所有的灯LED全灭
cli
mov ax,351ch
int 21h
push bx
push es
sti
wait1: ;检测"q"或者"Q"键
mov ah,0bh
int 21h ;调用DOS 21H 功能0BH 进行键盘判断
inc al
jnz readpc ;检测是否有键按下
mov ah,08h
int 21h ;调用DOS 21H 功能08H 进行键盘输入判断
cmp al,'q'
jz quit ;检测到"q",退出
cmp al,'Q'
jz quit ;检测到"Q",退出
readpc: ;判断开关SW3的状态
mov dx,302h ;读端口C的值
in al,dx ;当按下开关SW3时,PC2口为低电
test al,04h ;检测PC2口状态
jnz case
lp: in al,dx
test al,04h
jz lp ;循环检测直至放开
xor flag,01h ;将状态值取反
case: cmp flag,01h ;进行状态值比较
jne stop
begin: ;灯LED全亮
mov dx,300h ;取8255的端口A的地址
mov al,0ffh ;使8255的PA0-PA7全为1
out dx,al ;使所有的灯LED全亮
mov bx,800
mov t,800
d1: call outport ;喇叭发出高频的声音
dec bx
jnz d1 ;所有的灯LED全亮的时间
;灯LED全灭
mov dx,300h ;取8255的端口A的地址
mov al,00h ;使8255的PA0-PA7全为0
out dx,al ;使所有的灯LED全灭
mov bx,200
mov t,4000
d2: call outport ;喇叭发出低频的声音
dec bx
jnz d2 ;所有的灯LED全灭的时间
call delay2
jmp wait1
;灯LED全灭
mov ah,0h
int 16h
cli
mov dx,seg timer
mov ds,dx
mov dx,offset timer
mov ax,251ch
int 21h
sti
stop: mov dx,300h ;取8255的端口A的地址
mov al,00h ;使8255的PA0-PA7全为0
out dx,al ;使所有的灯LED全灭
jmp wait1
quit: ;灯LED全灭
mov dx,300h ;取8255的端口A的地址
mov al,00h ;使8255的PA0-PA7全为0
out dx,al ;使所有的灯LED全灭
;返回DOS
mov ah,4ch ;DOS功能调用
int 21h ;返回DOS
m endp
delay1 proc
push bx
mov bx,t
dl1: dec bx
jnz dl1
pop bx
ret
delay1 endp
delay2 proc
push cx
push bx
mov cx,1ffh
dl3: mov bx,0ffffh
dl4: dec bx
jnz dl4
dec cx
jnz dl3
pop bx
pop cx
ret
delay2 endp
;喇叭发出声音
outport proc
mov dx,303h ;取8255的控制端口的地址
mov al,0dh
out dx,al ;置PC6=1
call delay1
mov dx,303h ;取8255的控制端口的地址
mov al,0ch
out dx,al ;置PC6=0
call delay1
ret
outport endp
timer proc far
push ax
mov ds,ax
assume ds:data
inc count
cmp count,18
jl exit
mov count,0
inc second
cmp second,'9'
inc tens
cmp tens,'6'
jl exit
mov tens,'0'
inc minute
cmp minute,'9'
jle exit
mov minute,'0'
inc tenm
cmp tenm,'6'
jl exit
mov tenm,'0'
exit: pop ax
iret
timer endp
cseg ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -