📄 lanqiu.asm
字号:
;***************************************************************
;*------------------ 球赛计时计分器程序------------------------*
;*-------------------------------------------------------------*
;*---------------------MCS-51汇编语言-------------------------*
;*-------------------------------------------------------------*
;*-----------------------CPU: AT89C51--------------------------*
;*-------------------------------------------------------------*
;*---------------------程序名:qsjsjf.asm-----------------------*
;*-------------------------------------------------------------*
;*-------------------设计人: 雷道仲 罗政球--------------------*
;***************************************************************
ORG 0000H
AJMP LK1 ;主程序地址
ORG 000BH ;定时中断入口地址
AJMP CTCO
ORG 0013H ;外部中断入口地址
AJMP CXT
LK1: MOV 33H,#00H ;甲队记分清0
MOV 34H,#00H
MOV 35H,#00H
MOV 36H,#00H ;乙队记分清0
MOV 37H,#00H
MOV 38H,#00H
MOV 40H,#00H ;记时分钟清0
MOV 41H,#00H
CLR P0.0
Mp: CLR P2.0 ;计时牌子清零
CLR P2.1 ;分分秒秒清0
CLR P2.2
CLR P2.3
MOV P1,#00H
NOP
NOP
SETB P2.0
SETB P2.1
SETB P2.2
SETB P2.3
MOV 42H,#05H ;送秒钟初值59秒
MOV 43H,#09H
MOV SCON,#00H ;计分牌子清零程序
CLR P3.7
MOV R1,#33H
MOV R2,#06H
LP: MOV A,@R1
MOV DPTR,#TAB ;取显示数
MOVC A,@A+DPTR
MOV SBUF,A ;通过串行口发显示数据
JNB TI,$ ;是否发送完毕
CLR TI ;清除标志位
INC R1
DJNZ R2,LP ;6次是否 发送完毕
SETB P3.7 ;显示数据
LK3: JB P2.4,LK6
ACALL D10MS
JB P2.4,LK3
ACALL D2S
LK4: JB P2.4,LK3 ;调整分钟(十位)
CLR P2.0 ;显示分钟十位数据
MOV P1,40H
SETB P2.0
ACALL D2S ;调用延时程序
INC 40H ;将十位加1
MOV A,40H
CJNE A,#0AH,LK4 ;十到了没有
MOV 40H,#00H
AJMP LK4
LK6: JB P2.5,LK5
ACALL D10MS
JB P2.5,LK6
ACALL D2S
LK7: JB P2.5,LK6 ; 调分钟(个位)
CLR P2.1 ;显示分钟个位数据
MOV P1,41H
SETB P2.1
ACALL D2S ;调用延时程序
INC 41H ;将个位加1
MOV A,41H
CJNE A,#0AH,LK7 ;十到了没有
MOV 41H,# 00H
AJMP LK7
LK5: JB P2.6,LK3 ;等待启动计时
ACALL D10MS
JB P2.6,LK5
CLR P2.2 ;显示秒钟十位
MOV P1,42H
NOP
NOP
SETB P2.2
CLR P2.3 ;显示秒钟个位
MOV P1,43H
NOP
NOP
SETB P2.3
SETB P0.0 ;点亮计时指示灯
MOV TMOD,#01H ;定时中断初始化
MOV TL0,#0B0H ;送定时初值
MOV TH0,#3CH
SETB ET0 ;开放定时中断
SETB EX1 ;开放外部中断
CLR IT0 ;外部中断低电平有效
SETB TR0 ;启动定时
MOV R0,#14H
SJMP $
CTCO: JNB P2.6,LK8 ;定时中断程序
DJNZ R0,NEXT ;一秒钟到了吗?
MOV R0,#14H
DEC 43H
CLR P2.3 ;显示时间
MOV P1,43H ;显示秒钟个位
NOP
NOP
SETB P2.3
CLR P2.2 ;显示秒钟十位
MOV P1,42H
NOP
NOP
SETB P2.2
CLR P2.1 ;显示分钟个位
MOV P1,41H
NOP
NOP
SETB P2.1
CLR P2.0 ;显示分钟十位
MOV P1,40H
NOP
NOP
SETB P2.0
MOV A,43H
CJNE A,#00H,NEXT ;秒钟个位回到0没有
MOV 43H,#0AH ;秒钟个位送初值10
MOV A,42H
CJNE A,00H,LP3 ;秒钟十位回到0没有
MOV 42H,#05H ;秒钟十位送初值5
MOV A,41H
CJNE A,#00H,LP2 ;分种个位回到0没有
MOV 41H,#09H ;分钟个位送初值9
MOV A,40H
CJNE A,#00H,LP1 ;分钟十位回到0没有
CLR P0.0
CLR P3.6 ;时间到发出警备10S
ACALL D10S
SETB P3.6
KP11: JB P2.6,KP11 ;等待交换
AJMP KP12 ;去两队分数交换程序
LK8: ACALL D10MS
JB P2.6,CTCO ;计时暂停处理
CLR P0.0
LK9: JNB P2.6,LK9 ;等待键按下
KL10: JB P2.6,LK10 ;等待键放开
SETB P0.0 ;继续计时
AJMP CTCO
P3: DEC 42H ;将秒钟十位减1
AJMP NEXT
LP1: DEC 40H ;将分钟十位减1
AJMP NEXT
LP2: DEC 41H ;将分钟个位减1
NEXT: MOV TL0,#0B0H ;定时中断送初值返回
MOV TH0,#3CH
RETI
KP12: MOV A,33H ;甲乙两队交换分数
XCH A,36H
MOV 33H,A
MOV A,34H
XCH A,37H
MOV 34H,A
MOV A,35H
XCH A,38H
MOV 35H,A
AJMP mp ;返回显示交换后的分数
CXT: JNB P3.5,KP1 ;甲队+1
JNB P3.4,KP2 ;甲队-1
JNB P0.2,KP3 ;乙队+1
JNB P0.1,KP4 ;乙队-1
AJMP KP
KP1: JNC 36H ;甲队+1程序
MOV A,36H
CJNE A,#0AH,KP5
MOV 36H,#00H
INC 37H
MOV A,37H
CJNE A,#0AH,KP5
MOV 37H,#00H
INC 38H
AJMP KP5
KP2: MOV A,36H ;甲队-1程序
CJNE A,#00H,AP1
MOV 36H,#09H
DEC 37H
AJMP KP5
AP1: DEC 36H
AJMP KP5
KP3: INC 33H ;乙队+1程序
MOV A,33H
CJNE A,#0AH,KP5
MOV 33H,#00H
INC 34H
MOV A,34H
CJNE A,#0AH,KP5
MOV A,34H
CJNE A,# 0AH,KP5
MOV 34H,#00H
INC 35H
AJMP KP5
KP4: MOV A,33H ;乙队-1程序
CJNE A,#00H,AP2
MOV 34H,#09H
DEC 35H
AJMP KP5
AP2: DEC 34H
KP5: CLR P3.7 ;显示分数
MOV R1,#33H
MOV R2,#06H
LP6: MOV A,@R1
MOV DPTR,#TAB ;查找显示数据
MOVC A,@A+DPTR
MOV SBUF,A ;通过串行口发送显示
JNB TI,$ ;串行口是否发送完毕
CLR TI ;串行口标志清0
INC R1
DJNZ R2,L ;6次是否发送完毕
SETB P3.7
KP6: JNB P3.3,KP6
KP: RETI
TAB: DB 3FH, 06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H ;显示字
D10S: MOV 50H,#05H ;延时程序10S
D2S: MOV R3,#0AH ;延时程序2S
D200MS: MOV R7,#14H
D10MS: MOV R6,#05H
LOOP3: MOV R5,#0F9H
NOP
NOP
LOOP2: DJNZ R5,LOOP2
DJNZ R6,LOOP3
DJNZ R7,D10MS
DJNZ R3,D200MS
DJNZ 50H,D2S
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -