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

📄 qiangdaqi.asm

📁 此用汇编写的抢答器的源代码
💻 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 + -