📄 xc.asm
字号:
BUSCZG DATA 22H ;倒计时初值个位寄存器
BUSCZS DATA 23H ;倒计时初值十位寄存器
BUSG DATA 20H ;LED显示个位缓冲器
BUSS DATA 21H ;LED显示十位缓冲器
JCW DATA 25H ;定义标志寄存器
JCW1 BIT JCW.0 ;判断修改后的初值是否小于20S自检标志位,小于则赋20S给缓冲器
ADDH EQU 00H ;将修改后倒计初值送显示缓冲器程序高八位地址
ADDL EQU 80H ;将修改后倒计初值送显示缓冲器程序低八位地址
STAT1 EQU 0F3H ;状态1红绿灯值
STAT2 EQU 0F5H ;状态2红绿灯值
STAT3 EQU 0EDH ;状态3红绿灯值
STAT4 EQU 0DEH ;状态4红绿灯值
STAT5 EQU 0EEH ;状态5红绿灯值
STAT6 EQU 0EDH ;状态6红绿灯值
GWWX EQU 0F5H ;个位位选
SWWX EQU 0FAH ;十位位选
BDDH EQU 00H ;当修改后的初值少于20S,将修改后倒计初值送显示缓冲器程序高八位地址
BDDL EQU 92H ;当修改后的初值少于20S,将修改后倒计初值送显示缓冲器程序低八位地址
ORG 000H
JMP START
ORG 03H
JMP JPZDCX
ORG 0BH
JMP TIM0
ORG 0012H
START: MOV TMOD,#01H
MOV TH0,#0BDH
MOV TL0,#0C0H
MOV IE,#82H
MOV SP,#60H
MOV R0,#0
MOV R1,#0FFH
MOV R2,#255
MOV R3,#0FFH
MOV R4,#90H
MOV R5,#3
CLR JCW1
CLR F0
LCALL ZJ
;检查红灯倒记时处值是否被修改,否则赋初值为60s
SETB EX0
START1: JB JCW1,GO0
JB F0,GO1
MOV BUSG,#06
MOV BUSS,#04
JMP GO2
ORG 0080H
GO1: CLR A
MOV A,BUSCZG
MOV BUSG,A
MOV A,BUSCZS
MOV BUSS,A
JMP GO2
ORG 0092H
GO0: MOV BUSCZG,#01
MOV BUSG,BUSCZG
MOV BUSCZS,#03
MOV BUSS,BUSCZS
GO2: MOV R7,#16
CLR TR0
LCALL A1 ;程序一开始显示倒数初值
SETB TR0
LCALL A0 ;首先为南北通(A)为绿灯,东西(B)止为红灯
LCALL A3 ;A绿灯闪烁3S ,B为红灯
LCALL A4 ;亮A黄灯3S,B仍为红灯
LCALL A5 ;B通绿灯,A止红灯
LCALL A6 ;B绿灯闪烁3S ,A仍为红灯
LCALL A7 ;B亮黄灯3S ,A仍为红灯
LCALL JPZDCX
JMP START1
;硬件自检程序过程子程序
ZJ: MOV BUSG,R0
MOV BUSS,R0
MOV P0,#00H
LCALL A1
DJNZ R3,ZJ
MOV R3,#0FFH
INC R0
MOV A,R0
CJNE A,#11 ,ZJ
MOV R0,#00H
CLR A
NOP
NOP
RET
;状态1
;首先为南北通(A)为绿灯
;东西(B)止为红灯
A0: MOV P0,#STAT1
LCALL A1
MOV A,#07
CJNE A,BUSG,A0
MOV A,#01
CJNE A,BUSS,A0
NOP
NOP
RET
;状态2
;A绿灯闪烁3S ,B仍为红灯
A3: MOV P0,#STAT2
LCALL A1
DJNZ R1,A3
MOV R1,#0FFH
A31: MOV P0,#STAT1
LCALL A1
DJNZ R1,A31
MOV R1,#0FFH
MOV A,#04
CJNE A,BUSG,A3
NOP
NOP
RET
;状态3
;亮A黄灯3S,B仍为红灯
A4: MOV P0,#STAT3
LCALL A1
MOV A,#01
CJNE A,BUSG,A4
NOP
NOP
RET
;状态4
;B通绿灯,A止红灯
A5: MOV P0,#STAT4
LCALL A1
MOV A,#07
CJNE A,BUSG,A5
MOV A,#01
CJNE A,BUSS,A5
NOP
NOP
RET
;状态5
;B绿灯闪烁3S ,A仍为红灯
A6: MOV P0,#STAT5
LCALL A1
DJNZ R1,A6
MOV R1,#0FFH
A61: MOV P0,#STAT4
LCALL A1
DJNZ R1,A61
MOV R1,#0FFH
MOV A,#04
CJNE A,BUSG,A6
NOP
NOP
RET
;状态6
;B亮黄灯3S ,A仍为红灯
A7: MOV P0,#STAT6
LCALL A1
MOV A,#01
CJNE A,BUSG,A7
NOP
NOP
RET
;显示子程序
;其中A1为供主循环程序显示用
A1: MOV A,BUSG
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV DPTR,#DM
MOVC A,@A+DPTR
MOV P3,#GWWX
MOV P1,A
LCALL DELAY
ORL P3,#0FFH
MOV A,BUSS
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV DPTR,#DM
MOVC A,@A+DPTR
MOV P3,#SWWX
MOV P1,A
LCALL DELAY
MOV P3,#0FFH
NOP
NOP
RET
;以下的A10和A11供初值修改显示用
A10: ORL P3,#0FFH
MOV A,BUSG
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV DPTR,#DM
MOVC A,@A+DPTR
MOV P3,#GWWX
MOV P1,A
LCALL DELAY
ORL P3,#0FFH
NOP
NOP
RET
A11: ORL P3,#0FFH
MOV A,BUSS
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV DPTR,#DM
MOVC A,@A+DPTR
MOV P3,#SWWX
MOV P1,A
LCALL DELAY
ORL P3,#0FFH
NOP
NOP
RET
;定时中断0子程序
;此程序段完成倒计减一
TIM0: DJNZ R7,A2
MOV TH0,#0BDH
MOV TL0,#0C0H
MOV R7,#16
DJNZ BUSG,A2
MOV BUSG,#10
DJNZ BUSS,A2
JNB F0 ,BGCZ
MOV A,BUSCZG
MOV BUSG,A
MOV A,BUSCZS
MOV BUSS,A
JMP A2
BGCZ: MOV BUSG,#06
MOV BUSS,#04
NOP
NOP
A2: RETI
;外部中断0,键盘程序段
;其用于修改倒计时的初值
JPZDCX: CLR EX0
SETB F0
SETB F0
MOV P3,#0FFH
MOV P0,#0FFH
MOV BUSG,#01
MOV BUSS,#01
KEY1: JB P2.0,KEY2
MOV P0,#0F6H
K1: LCALL DELAY
LCALL A10
DJNZ R2,K1
MOV R2,#255
INC 20H
MOV A,BUSG
MOV BUSCZG,A
MOV A,BUSG
CJNE A,#11,KEY10
MOV BUSG,#01
KEY10: LCALL A10
LCALL DELAY
DJNZ R2,KEY10
MOV R2,#255
JB P2.0,KEY2
INC 20H
MOV A,BUSG
MOV BUSCZG,A
MOV A,BUSG
CJNE A,#11,K10
MOV BUSG,#01
K10: LCALL A10
JMP KEY10
KEY2: JB P2.1,KEY3
MOV P0,#0FFH
MOV P0,#0DBH
K2: LCALL DELAY
LCALL A11
DJNZ R2,K2
MOV R2,#255
INC 21H
MOV A,BUSS
MOV BUSCZS,A
MOV A,BUSS
CJNE A,#11,KEY20
MOV BUSS,#01
KEY20: LCALL A11
LCALL DELAY
DJNZ R2,KEY20
MOV R2,#255
JB P2.1,KEY3
INC 21H
MOV A,BUSS
MOV BUSCZS,A
MOV A,BUSS
CJNE A,#11,K20
MOV BUSS,#01
K20: LCALL A11
JMP KEY20
KEY3: JNB P2.2,K3
MOV P0,#0FFH
MOV P0,#00H
JMP KEY1 ;RETI
K3: LCALL A1
DJNZ R2,K3
MOV R2,#255
MOV A,BUSG
MOV BUSCZG,A
MOV BUSCZG,A
MOV A,BUSS
MOV BUSCZS,A
MOV BUSCZS,A
SETB EX0
SETB F0
SETB F0
CLR C
ANL A,#0FH
SUBB A,#03H
JB CY,TD
NOP
NOP
PUSH ADDL
PUSH ADDH
RETI
TD: SETB JCW1
NOP
NOP
PUSH BDDL
PUSH BDDH
RETI
;延时0.5ms子程序
DELAY: MOV R6,#248
DJNZ R6,$
NOP
NOP
RET
;减一数码查询表
TABLE: DB 00H,00H,01H,02H,03H,04H
DB 05H,06H,07H,08H,09H
;显示段码查询表
DM: DB 03FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,67H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -