?? 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 ? ;搶答用時小數(shù)
SMGHH DB 5BH ;數(shù)碼管高位 2
SMGLL DB 0BFH ;數(shù)碼管低位 0.
SMGDD DB 3FH ;數(shù)碼管小數(shù) 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 ;顯示小數(shù)點
INT 21H
MOV DL,TIMED
INT 21H
LEA DX,MESTIME
MOV AH,09H
INT 21H
POP DX
RET
SHOWTIMEATCRT ENDP
INTPROC PROC NEAR ;中斷程序,實現(xiàn)SI+=1
PUSH DS
NOP
ADD SI,1
NOP
MOV AL,20H
OUT 20H,AL
POP DS
IRET
INTPROC ENDP
SOUND PROC NEAR ;發(fā)聲程序
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段數(shù)碼管顯示記時
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小數(shù)
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小數(shù)
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 + -