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

📄 计时器.asm

📁 这是一个计数器的源代码
💻 ASM
字号:
;*---------------------------------------------------------*
;*  8255、8259综合应用实验-用彩灯显示计时情况       *
;*  彩灯点亮显示时间程序source file                        *
;*  运行步骤:1. 按下sw3开始计时                           *
;*            2.再次按下SW3,申请1次中断,暂停               *
;*              使LED灯点亮显示当前时间                    *
;*            3.再次按下SW3,继续计时                       *
;*            4.再按下则清0.                               *
;*                               *    
;*---------------------------------------------------------*
    
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,'$'
NUM     db(0) 
;flag    db(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 DX,300H          ;LED灯熄灭
     MOV AL,00H
     OUT DX,AL
     MOV  DX,303H           ;8255命令口

     NOP
     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 DX,302H         ;查PC2是否为0,即是否有键按下
    IN AL,DX
    AND AL,04H
    JNZ L1
lp1:      
         in al,dx
         test al,04h
         jz lp1                                ;循环检测直至放开
L2: 
    add num,01h
    mov al,num                 ;开始计时
    mov dx,300h
    out dx,al
    call delay  

L3: MOV DX,302H         ;查PC2是否为0,即是否有键按下
    IN AL,DX
    AND AL,04H
    JZ L5
lp2:      in al,dx
         test al,04h
         jz lp2                                ;循环检测直至放开
L4: add num,01h
    mov al,num
    mov dx,300h
    out dx,al
    call delay    
   jmp L3

L5:       in al,dx
         test al,04h
         jz L5                                ;循环检测直至放开
    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

L6: MOV DX,302H         ;查PC2是否为0,即是否有键按下
    IN AL,DX
    AND AL,04H
    JnZ L6
lp3:      in al,dx
         test al,04h
         jz lp3                                ;循环检测直至放开

L9: add num,01h
    mov al,num
    mov dx,300h
    out dx,al
    call delay    
    MOV DX,302H         ;查PC2是否为0,即是否有键按下
    IN AL,DX
    AND AL,04H
   
lp4:      in al,dx
         test al,04h
         jz lp4                                ;循环检测直至放开
    mov num,00h
    mov al,num
    mov dx,300h
    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 al,num                  ;暂停
    mov dx,300h
    out dx,al
here:
    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

DELAY PROC 
          PUSH CX
          PUSH BX
       MOV CX,0FFFH
DL2:   MOV BX,0FFFFH
DL1:   DEC BX
       JNZ DL1
       DEC CX 
       JNZ DL2
         POP BX
         POP CX
         RET
DELAY ENDP

CODE ENDS
     END START

⌨️ 快捷键说明

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