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/5CountDown秒所经过的时钟数
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
以下是一个八路抢答器的程序,你可以参考一下。ORG 0000H
JMP BEGIN
ORG 0030H
TABLE: 共阴极数码管显示代码表
DB3FH,06H,5BH,4FH,66H 12345
DB6DH,7DH,07H,7FH 6789
DELAY: MOV R5,#20
LOOP4: MOV R6,#50H延时20X20ms
LOOP5: MOV R7,#100
DJNZ R7,$
DJNZ R6,LOOP5
DJNZ R5,LOOP4
RET
---------------------------------------
BEGIN: MOV P2,#0FFH P2口置高电平,准备接收信号
MOV R4,#0
MOV A,R4 R4位标志值送A寄存器
AGAIN: MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P1,A
LOOP1: MOV A,P3 接收p3口的抢答信号
CPL A
JZLOOP1
LOOP2: RRC A有人抢答信号则逐次移动判断哪一位抢答
INC R4
JNC LOOP2
********************
MOV A,R4
MOVC A,@A+DPTR 找到相应位显示代码
MOV P1,A
LEDDIS:
MOV A,#0FFH
CLR C
LEDDIS1:
RLC A
DJNZ R4,LEDDIS1
MOV P0,A
LOOP3: JNB P2.2,BEGIN 若主持人按下复位信号键,则转向主程序
CPL P2.0 若没按复位信号键,则通过p2.2口给出高低信号驱动蜂鸣器
LCALL DELAY 调用延时子程序
SJMP LOOP3 p2.2口反复间隔0.4s变化,驱动蜂鸣器
END
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)