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

📄 aexp14.asm

📁 不用借助其它的东西
💻 ASM
字号:
;*---------------------------------------------------------*
;*   用到头8259、8237、8255 *

;*---------------------------------------------------------*
    
STACK1 SEGMENT STACK
     DW 200 DUP(?)
STACK1 ENDS
DATA SEGMENT
MESG1    DB 'Press SW3 one time to invoke interrupt one time,and to light one of LEDs',0ah,0dh
         DB 'Exit with q/Q',0ah,0dh,'$'
LEDDATA  DB 03H,06H,0CH,18H,30H,60H,0C0H,81H
NUM     DW(0) 
INT0A_OFF DW(?)
INT0A_SEG DW(?)         
DATA ENDS
CODE SEGMENT
     ASSUME CS:CODE,DS:DATA
START:
     MOV AX,DATA
     MOV DS,AX
     
     MOV AH,09H
 	  MOV DX,OFFSET MESG1
	  INT 21h    ;显示提示信息     

     MOV DX,303H         ;初始化8255
     MOV AL,83H
     OUT DX,AL

    MOV AL,10110110B               ;通过8253和8255使扬声器发声
    MOV DX,307H
    OUT DX,AL
    MOV AL,33H                      ;输入计数初值,数字越大发声频率越小
    MOV DX,306H                     
    OUT DX,AL                     
    MOV AL,06H
    OUT DX,AL
    
    MOV DX,301H
    IN AL,DX
    XOR AL,03H
    OUT 61H,AL     

     MOV DX,300H          ;LED灯熄灭
     MOV AL,00H
     OUT DX,AL

     MOV AX,3572H         ;获取原中断向量
     INT 21H
     MOV INT0A_OFF,BX     ;保存原中断向量
     MOV BX,ES
     MOV INT0A_SEG,BX
     CLI                    ;关中断
     MOV AX,2572H
     MOV DX,SEG LEDLIGHT    ;设置新的中断向量
     PUSH DS
     MOV DS,DX
     MOV DX,OFFSET LEDLIGHT
     INT 21H
     POP DS
     STI                       ;开中断
     IN  AL,0A1H              ;打开IRQ10
     AND AL,0FBH
     OUT 0A1H,AL
     IN  AL,21H                ;打开IRQ2
     AND AL,0FBH
     OUT 21H,AL
L1:
     MOV AH,0BH            ;检查是否有’Q’或’q’键按下
     INT 21H
     INC AL
     JNZ NEXT0              ; 若无键按下,则程序往下执行
     
     MOV AH,08H             ;如有’Q’或’q’键按下,则程序退出
     INT 21H
     CMP AL,'q'
     JZ  EXIT
     CMP AL,'Q'
     JZ  EXIT
NEXT0:
    
    MOV DX,302H         ;查PC2是否为0
    IN AL,DX
    AND AL,04H
    JNZ L1
   
    MOV DX,303H          ;按下SW3,则PC4=1申请中断
    MOV AL,09H
    OUT DX,AL
    PUSH CX
    MOV CX,100
WT: LOOP WT 
    POP CX
    MOV DX,303H          ;置PC4=0
    MOV AL,08H
    OUT DX,AL
    JMP L1 
EXIT:
    MOV AX,2572H         ;恢复中断向量
    MOV DX,INT0A_SEG
    PUSH DS
    MOV DS,DX
    MOV DX,INT0A_OFF
    INT 21H
    POP DS
    IN  AL,0A1H         ;屏蔽IRQ10
    OR  AL,04H
    OUT 0A1H,AL
    IN  AL,21H         ;屏蔽IRQ2
    OR  AL,04H
    OUT 21H,AL
    MOV AX,4C00H       ;程序退出
    INT 21H   
LEDLIGHT PROC FAR      ;中断服务程序
    PUSH SI
    PUSH AX
    PUSH DX
    


    

    CLI                 ;关中断
    MOV SI,OFFSET LEDDATA 
    ADD SI,NUM
    MOV AL,[SI]
    MOV DX,300H
    OUT DX,AL            ;点亮LED
    INC NUM
    CMP NUM,08H
    JNE NEXT
    MOV NUM,00H
NEXT :
    MOV AL,62H       ;发中断结束命令
    MOV DX,0A0H
    OUT DX,AL        ;向从片8259发EOI命令
    OUT 020H,AL      ;向主片8259发EOI命令
    STI                ;开中断
    POP DX
    POP AX
    POP SI     
    IRET
LEDLIGHT ENDP
CODE ENDS
     END START

⌨️ 快捷键说明

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