?? pcclkled.asm
字號:
;FILENAME: PCCLKLED.ASM
;內(nèi)容: LED時間顯示
INTA00 EQU 20H
INTA01 EQU 21H
PORTSEG EQU 211H
PORTBIT EQU 210H
TIMER0 EQU 200H
TIMER1 EQU 201H
TIMECT EQU 203H
MOD03 EQU 37H
MOD13 EQU 77H
STACK SEGMENT STACK 'STACK'
DW 50 DUP(?)
STACK ENDS
DATA SEGMENT
MIN1 DB 0
MIN2 DB 0
GAP1 DB 10
GAP2 DB 10
SEC1 DB 0
SEC2 DB 0
INTMASK DB ?
CSREG DW ?
IPREG DW ?
COUNT DB 0
LED DB 3FH,06,5BH,4FH, 66H, 6DH,7DH,07,7FH, 6FH,40H
MES DB 'DISPLAY THE LEDS,PRESS ANY KEY TO DOS!'
DB 0AH, 0DH,' $'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS: DATA, SS:STACK
START: MOV AX,DATA
MOV DS, AX
CLI
MOV AL,MOD03 ;8253初始化
MOV DX, TIMECT
OUT DX, AL ;TIMER0, MODE 3, BCD
MOV AL ,MOD13
OUT DX, AL ;TIMER1, MODE 3, BCD
MOV AL,00H ;初值均為400
MOV DX,TIMER0
OUT DX, AL
INC DX
OUT DX, AL
MOV AL, 04H
OUT DX, AL
DEC DX
OUT DX, AL
MOV AX,350AH ;讀取0AH中斷矢量送ES:BX
INT 21H
MOV AX, ES
MOV CSREG, AX ;保存
MOV IPREG, BX
PUSH BX
PUSH DS
MOV AX, CS
MOV DS, AX
MOV DX,OFFSET INT_PROC
MOV AX, 250AH ;寫0AH新的中斷矢量
INT 21H
POP DS
MOV DX ,INTA01
IN AL , DX ;讀IMR
MOV INTMASK, AL ;保存IMR
AND AL, 0FBH ;開放IRQ2
OUT DX ,AL
LEA DX, MES
MOV AH, 09
INT 21H
AGAIN:MOV DX,INTA01
IN AL, DX
OR AL, 04H
OUT DX,AL ;屏蔽IRQ2
STI
PUSH DX
MOV DL, 0FFH
MOV AH, 06
INT 21H ;讀鍵盤緩沖區(qū),判斷有無鍵按下
POP DX
PUSHF ;保護ZF
IN AL ,DX
AND AL,0FBH ;開放IRQ2
OUT DX, AL
POPF ;恢復ZF
JZ AGAIN ;ZF = 1 (無鍵按下)轉AGAIN,等待中斷
CLI ;有鍵按下,準備返回
POP BX
MOV DX ,INTA01
MOV AL ,INTMASK
OUT DX,AL ;恢復IMR
MOV DX, IPREG
MOV AX, CSREG
MOV DS, AX
MOV AX, 250AH
INT 21H ;恢復原中斷矢量
STI ;開中斷
MOV AX, 4C00H ;返回DOS
INT 21H
INT_PROC:
PUSH AX ;中斷服務程序
PUSH CX
PUSH DX
PUSH DI
MOV AL,00 ;LED全滅
MOV DX ,PORTBIT
OUT DX, AL
MOV DI,OFFSET MIN1 ;DI指向顯示緩沖區(qū)_
MOV CL,01 ;CL位碼,指向第一位
DIS1: MOV AL, [DI]
MOV BX,OFFSET LED ;BX指向七段碼表
XLAT ;AL得七段碼
MOV DX, PORTSEG
OUT DX,AL ;送段碼
MOV AL,CL
MOV DX, PORTBIT ;送位碼
OUT DX, AL
PUSH CX
MOV CX, 0B00H
DELAY: LOOP DELAY ;延時
CMP CL,20H ;是第六位嗎?
JZ CHG ;是轉CHG
INC DI ;不是,DI指向下一位
SHL CL, 1
JMP DIS1
CHG: INC COUNT
CMP COUNT,50 ;到1秒?
JL QUIT ;沒到,退出
MOV COUNT,0 ;到,COUNT置0
INC SEC2 ;秒個位加1
CMP SEC2,10
JL QUIT ;秒個位<10轉QUIT
MOV SEC2,0
INC SEC1
CMP SEC1,6 ;60秒?
JL QUIT
MOV SEC1,0 ;是,秒清0
INC MIN2 ;分加l
CMP MIN2,10
JL QUIT
MOV MIN2,0
INC MIN1
CMP MIN1 ,6 ;60分?
JL QUIT
MOV MIN1 ,0 ;是,分清0
QUIT: MOV DX,PORTBIT ;LED全滅
MOV AL, 00
OUT DX, AL
MOV DX,INTA00 ;發(fā)EOI命令
MOV AL, 20H
OUT DX, AL
POP DI ;恢復寄存器
POP DX
POP CX
POP AX
IRET ;返回
CODE ENDS
END START
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -