发布网友 发布时间:2022-04-20 06:53
共1个回答
热心网友 时间:2023-09-07 18:52
data segment
CountDown = 5;倒计时的秒数,也是抢答时间上限,不要超过9秒
msgCD db 'CountDown','$'
msgU db 'User '
Uid db ?
db ': '
Time db ?,'.',?,?,' Seconds.$'
UKey db 'qzpm';按键ASCII码
UCount = ($-UKey);抢答人数
msg db 'Press Any key to Exit!$'
msg1 db 'No one Press!$'
StartTC dw ?,? ;抢答开始时钟计数
EndTC dw ?,? ;抢答结束时钟计数
data ends
PRTSTR MACRO X;输出字符串
LEA DX,X
MOV AH,09H
INT 21H
ENDM
SETXY MACRO X,Y;设置光标位置,X=行,Y=列
XOR BH,BH
MOV AH,02H
MOV DH,X
MOV DL,Y
INT 10H
ENDM
code segment
assume cs:code,ds:data
DELAY PROC far;延时一秒
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,02H
INT 1AH
MOV BL,DH
D_P:MOV AH,02H
INT 1AH
CMP BL,DH
JZ D_P
POP DX
POP CX
POP BX
POP AX
RET
DELAY ENDP
start:
mov ax,data
mov ds,ax
;设置80×25黑白字符显示模式
MOV AH,00H
MOV AL,02H
INT 10H
SETXY 12,35
PRTSTR msgCD;屏幕中间显示CountDown
;倒计时开始
xor cx,cx
mov cl,CountDown
@@:
SETXY 13,40
mov dl,cl
add dl,30h
mov ah,02h
int 21h;显示倒计时秒数
call DELAY;延时一秒
loop @B
SETXY 13,40
mov dl,cl
add dl,30h
mov ah,02h
int 21h
;抢答计时开始
mov ah,0
int 1ah ;cx:dx=获得自午夜以来的时钟计数,每秒18.2次.
mov StartTC,dx
mov StartTC+2,cx;保存抢答开始时钟计数
mov bx,CountDown*91/5;CountDown秒所经过的时钟数
add dx,bx
adc cx,0
mov EndTC,dx
mov EndTC+2,cx ;计算并保存抢答结束计数
L_again:
mov ah,06h
mov dl,0ffh
int 21h
or al,al
jz L_test;没按键则直接检测是否已到抢答时间上限
xor si,si
@@:
cmp UKey[si],al
je L_Press
inc si
cmp si,UCount
jb @B
L_test:
mov ah,0
int 1ah
mov bx,EndTC
mov ax,EndTC+2
sub bx,dx
sbb ax,cx
jae L_again
SETXY 14,33
PRTSTR msg1
jmp @F
L_Press:
mov ah,0
int 1ah;获得按键时刻的时钟数
inc si
mov ax,si
add al,30h
mov Uid,al;存贮按键用户编号
mov bx,StartTC
mov ax,StartTC+2
sub dx,bx
sbb cx,ax;计算从计时开始到按键经过的时钟数,最后存在dx中
mov ax,1000
mul dx
mov bx,182
div bx;将时钟数换算成百分秒数,存放在ax中
mov bl,100
div bl;计算整秒数,结果在al中
add al,30h
mov Time,al
mov al,ah
xor ah,ah
mov bl,10
div bl;计算十分秒数,结果在al中
add al,30h
mov Time+2,al
add ah,30h
mov Time+3,ah;百分秒
SETXY 14,34
PRTSTR msgU
@@:
SETXY 15,29
PRTSTR msg
@@:
mov ah,06h
mov dl,0ffh
int 21h;等待用户按键退出
cmp al,0
je @B
mov ax,4c00h
int 21h
code ends
end start