⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aexp8-1.asm

📁 微机接口技术的入门必备试验代码 试验平台msdi
💻 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 + -