📄 qiangdaqi.asm
字号:
; 实验四:抢答器
; 08001214 钱程
; 08001214.ASM
; CS1 CS2 CS4 IRQ2 CLK0 CLK1 GATE0 GATE1
; CS1 CS2 CS-53 OUT1 Q0 OUT0 VCC VCC
; CS0 PA0 PA1 PB0 PB1 PB2
; CS_55 L4(R) L8(G) PO0 PO1 PLUS1
DATA SEGMENT
MESTAR DB ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~',0DH,0AH
DB ' USE 8253 8255 ',0DH,0AH
DB ' 08001214 钱程 ',0DH,0AH
DB ' 1--R红 2--G绿 ',0DH,0AH,0DH,0AH
DB ' CS1 CS2 CS4 IRQ2 CLK0 CLK1 GATE0 GATE1',0DH,0AH
DB ' CS1 CS2 CS-53 OUT1 Q0 OUT0 VCC VCC ',0DH,0AH,0DH,0AH
DB ' CS0 PA0 PA1 PB0 PB1 PB2 ',0DH,0AH
DB ' CS_55 L4(R) L8(G) PO0 PO1 PLUS1 ',0DH,0AH
DB ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~',0DH,0AH,'$'
MESSNO DB 'No one can answer this question!',0DH,0AH,'$'
MESTIME DB ' Seconds!',0DH,0AH,'$'
MESSQ DB 'Press Q to quit!',0DH,0AH,'$'
MESQNU DB '抢答无效!',0dh,0ah,'$'
WATPL DB 'Begin...',0DH,0AH,'$'
LIGDD DB 20 DUP (6FH,7FH,07H,7DH,6DH,66H,4FH,5BH,06H,3FH) ;9,8...1,0,9,8
LIGLL DB 2 DUP ( 10 DUP(0EFH),10 DUP(0FFH),10 DUP(87H),10 DUP(0FDH),10 DUP(0EDH),10 DUP(0E6H),10 DUP(0CFH),10 DUP(0DBH),10 DUP(86H),10 DUP(0BFH) )
LIGHH DB 100 DUP (06H)
DB 100 DUP (3FH)
MEPL1 DB 'Player1(R) press the button first! Used ','$'
MEPL2 DB 'Player2(G) press the button first! Used ','$'
CSREG DW ? ;原中断段基址
IPREG DW ? ;原中断偏移量
INTIMR DB 0
TIMEH DB ? ;抢答用时高位
TIMEL DB ? ;抢答用时低位
TIMED DB ? ;抢答用时小数
SMGHH DB 5BH ;数码管高位 2
SMGLL DB 0BFH ;数码管低位 0.
SMGDD DB 3FH ;数码管小数 0
DATA ENDS
STACK SEGMENT STACK'STACK'
DB 100 DUP(?)
STACK ENDS
code segment
assume cs:code,ss:stack,ds:data,es:data
START:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
LEA DX,MESTAR
MOV AH,09H
INT 21H
MOV AX,3508H
INT 21H
MOV AX,ES
MOV CSREG,AX
MOV IPREG,BX
CLI
push ds
MOV AX,CS
MOV DS,AX
mov dx,offset INTPROC
MOV AX,250AH
INT 21H
pop ds
IN AL,21H
MOV INTIMR,AL
AND AL,0FBH
OUT 21H,AL
;8255
MOV DX,283H
MOV AL,0C6H
OUT DX,AL
MOV DX,280H
MOV AL,0FFH
OUT DX,AL
STI
;ready to start?
LOP1: ;显示20.0!!!!!!!!!!!!!!!!!!!!!!
CALL DISLE
MOV DX,281H
IN AL,DX
CMP AL,07H
JZ REAGO
CMP AL,01H
JZ QDA
CMP AL,02H
JZ QDA
JNZ LOP1
QDA:
CALL DELAY
MOV AH,09H ;有人提前抢答
LEA DX,MESQNU
INT 21H
JMP LOP1
QUITO: MOV AH,09H
LEA DX,MESSNO
INT 21H
JMP QUIT
REAGO: ;8253初始化 通道0: 0AA0H,通道1: 0500H,1秒
MOV DX,293H
MOV AL,00110110B
OUT DX,AL
MOV DX,290H
MOV AL,0A0H
OUT DX,AL
MOV AL,0AH
OUT DX,AL
MOV DX,293H
MOV AL,01110110B
OUT DX,AL
MOV DX,291H
MOV AL,80H
OUT DX,AL
MOV AL,00H
OUT DX,AL
LEA DX,WATPL
MOV AH,09H
INT 21H
MOV SI,0
SHOWC: CALL DISP ;扫描是否有枪答
MOV DX,281H
IN AL,DX
CMP AL,02H
JZ PLAYER1
CMP AL,01H
JZ PLAYER2
CMP SI,200D
JNZ SHOWC
JZ QUITO
PLAYER1: ;1号抢答
CLI
MOV AL,LIGLL[SI]
MOV SMGLL,AL
MOV AL,LIGHH[SI]
MOV SMGHH,AL
MOV AL,LIGDD[SI]
MOV SMGDD,AL
CALL SOND
CALL GETTIM
MOV DX,280H
MOV AL,0FEH
OUT DX,AL
MOV AH,09H
LEA DX,MEPL1
INT 21H
CALL SHOWTIMEATCRT
JMP QUITFF
PLAYER2:
CLI
MOV AL,LIGLL[SI]
MOV SMGLL,AL
MOV AL,LIGHH[SI]
MOV SMGHH,AL
MOV AL,LIGDD[SI]
MOV SMGDD,AL
;2号抢答
CALL SOND
CALL GETTIM
MOV DX,280H
MOV AL,0FDH
OUT DX,AL
MOV AH,09H
LEA DX,MEPL2
INT 21H
CALL SHOWTIMEATCRT
QUITFF: STI
CALL DISLE
MOV DX,281H
IN AL,DX
CMP AL,07H
JZ QUIT
CMP AL,01H
JZ QNU
CMP AL,02H
JZ QNU
JNZ QUITFF
QNU: CALL DELAY
LEA DX,MESQNU
MOV AH,09H
INT 21H
JMP QUITFF
QUIT: CLI
MOV AL,INTIMR
OUT 21H,AL
MOV DX,IPREG
MOV AX,CSREG
MOV DS,AX
MOV AX,250AH
INT 21H
STI
MOV DX,284H
MOV AL,0FFH
OUT DX,AL
MOV DX,288H
OUT DX,AL
MOV DX,280H
MOV AL,0FFH
OUT DX,AL
MOV AX,4C00H
INT 21H
GETTIM PROC NEAR ;将SI换算成用时
PUSH BX
MOV BX,10D
CMP SI,99D
JG TWO
MOV AX,SI
DIV BL
ADD AL,30H
ADD AH,31H
MOV TIMED,AH
MOV TIMEL,AL
MOV TIMEH,30H
POP BX
RET
TWO: MOV AX,SI
DIV BL
ADD AL,26H
ADD AH,31H
MOV TIMED,AH
MOV TIMEL,AL
MOV TIMEH,31H
POP BX
RET
GETTIM ENDP
SHOWTIMEATCRT PROC ;显示用时
PUSH DX
MOV AH,06H
MOV DL,TIMEH
INT 21H
MOV DL,TIMEL
INT 21H
MOV DL,2EH ;显示小数点
INT 21H
MOV DL,TIMED
INT 21H
LEA DX,MESTIME
MOV AH,09H
INT 21H
POP DX
RET
SHOWTIMEATCRT ENDP
INTPROC PROC NEAR ;中断程序,实现SI+=1
PUSH DS
NOP
ADD SI,1
NOP
MOV AL,20H
OUT 20H,AL
POP DS
IRET
INTPROC ENDP
SOUND PROC NEAR ;发声程序
PUSH AX
PUSH DX
PUSH CX
MOV AL,0FFH
OUT 61H,AL
MOV CX,0090H
LPL: CALL DISLE
LOOP LPL
MOV AL,00H
OUT 61H,AL
POP CX
POP DX
POP AX
RET
SOUND ENDP
DELAY PROC NEAR ;延时
PUSH CX
MOV CX,0400H
MMX: CALL DELAY1
LOOP MMX
POP CX
RET
DELAY ENDP
SOND PROC NEAR
PUSH CX
MOV CX,3
GGF: CALL SOUND
CALL DELAY
LOOP GGF
POP CX
RET
SOND ENDP
DISP PROC NEAR ;8段数码管显示记时
PUSH DS
PUSH CX
PUSH AX
;DISPL低
MOV DX,288H
MOV AL,02H
OUT DX,AL
MOV DX,284H
MOV AL,LIGLL[SI]
OUT DX,AL
CALL DELAY1
MOV AL,00H
OUT DX,AL
;DISPH高
MOV DX,288H
MOV AL,01H
OUT DX,AL
MOV DX,284H
MOV AL,LIGHH[SI]
OUT DX,AL
CALL DELAY1
MOV AL,00H
OUT DX,AL
;DISPD小数
MOV DX,288H
MOV AL,04H ;
OUT DX,AL
MOV DX,284H
MOV AL,LIGDD[SI]
OUT DX,AL
CALL DELAY1
MOV AL,00H
OUT DX,AL
POP AX
POP CX
POP DS
RET
DISP ENDP
DISLE PROC NEAR
;DISPL低
MOV DX,288H
MOV AL,02H
OUT DX,AL
MOV DX,284H
MOV AL,SMGLL
OUT DX,AL
CALL DELAY1
MOV AL,00H
OUT DX,AL
;DISPH高
MOV DX,288H
MOV AL,01H
OUT DX,AL
MOV DX,284H
MOV AL,SMGHH
OUT DX,AL
CALL DELAY1
MOV AL,00H
OUT DX,AL
;DISPD小数
MOV DX,288H
MOV AL,04H ;
OUT DX,AL
MOV DX,284H
MOV AL,SMGDD
OUT DX,AL
CALL DELAY1
MOV AL,00H
OUT DX,AL
DISLE ENDP
DELAY1 PROC NEAR ;延时
PUSH CX
MOV CX,0F00H
LOOP $
POP CX
RET
DELAY1 ENDP
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -