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

📄 aexp8-1.asm

📁 Aexp8-1.asm 声-光报警程序 * 运行步骤:1.按下一次开关SW3,开始声-光报警,再按下一次则停止 重复上述操作* 2.按下"q"或者"Q",退出
💻 ASM
字号:
;*********************************************************************
;  Aexp8-1.asm  声-光报警程序                                        *
;  运行步骤:1.按下一次开关SW3,开始声-光报警,再按下一次则停止;重复上述操作*
;          2.按下"q"或者"Q",退出                                      *
;*********************************************************************
sseg segment para stack 'stack'
     dw 200 dup (?)
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

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全灭
     
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全灭
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

cseg    ends
        end start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -