
KAI BIT P3.7 开始
------------------------------------------
ORG 0000H
JMP START
START:
----------------------下面是清零(复位)
MOV P0, #0C0H显示0
MOV P2, #255 熄灯
MOV R4, #0
----------------------下面等待按下"开始"键
KAISHI:
JBKAI, KAISHI 没有按"开始",就循环
CALL DELAY延时
JBKAI, KAISHI 消抖
JNB KAI, $ 等待释放
----------------------
MOV P0, #0CH 显示P
WAIT: 等待抢答
MOV A, P1
CPL A
JZWAIT 继续等待
----------------------
XS:查找选手按键的位置
CPL A
MOV P2, A
JNB ACC.0, J0
JNB ACC.1, J1
JNB ACC.2, J2
JNB ACC.3, J3
JNB ACC.4, J4
JNB ACC.5, J5
JNB ACC.6, J6
JMP J7
J7: INC R4
J6: INC R4
J5: INC R4
J4: INC R4
J3: INC R4
J2: INC R4
J1: INC R4
J0: INC R4
MOV A, R4
MOV DPTR, #D_TAB
MOVC A, @A + DPTR
MOV P0, A
----------------------下面等待按下复位键
W_FW:
JBKAI, W_FW没有按,则转
CALL DELAY延时
JBKAI, W_FW消抖
JNB KAI, $ 等待释放
JMP START
------------------------
D_TAB:
DB 0C0H,0F9H,0A4H,0B0H, 99H 共阳极0-9
DB92H, 82H,0F8H, 80H, 90H,0BFH -
------------------------------------------
DELAY: 延时约10ms
MOV R6, #20
DJNZ R7, $
DJNZ R6, $ - 2
RET
==========================================
END
以上程序已经调好。
先来个汇编的程序,P1接一个共阳极数码管,P0低4位接4个抢答按键,主持人复位采用单片机复位按钮实现。ORG 0000H
START: MOV A,P0
ORL A,#0F0H
CJNE A,#0FFH,PL0
SJMP START
PL0: LCALL DELAY
MOV A,P0
ORL A,#0F0H
CJNE A,#0FFH,PL1
SJMP START
PL1:JNB ACC.0,K1
JNB ACC.1,K2
JNB ACC.2,K3
JNB ACC.3,K4
LJMP START
K1:MOV P1,#0F9H
SJMP $
K2:MOV P1,#0A4H
SJMP $
K3:MOV P1,#0B0H
SJMP $
K4:MOV P1,#99H
SJMP $
DELAY:MOV R6,#15
DEL2: MOV R7,#200
DJNZ R7,$
DJNZ R6,DEL2
RET
END
data segmentCountDown = 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
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)