📄 交通灯(正驱动继电器).asm
字号:
RED_SN BIT P1.0
YELLOW_SN BIT P1.1
GREEN_SN BIT P1.2
RED_EW BIT P1.3
YELLOW_EW BIT P1.4
GREEN_EW BIT P1.5
LATCH BIT P1.6
SET_KEY BIT P3.2
ADD_KEY BIT P3.3
SUBB_KEY BIT P3.4
DIRECTION_F BIT 20H;当它为一时,表示东西方向红灯亮
LEAST_F BIT 21H;最小值
MOST_F BIT 22H;能显示的最大值
SHOW_F BIT 23H;显示需要重新载入数据的标志
FLICKER BIT 24H;绿灯闪烁标志
F_YELLOWY BIT 25H;黄灯亮的标志
SHOW EQU 30H;显示缓冲区
DATA_EW EQU 31H;东西方向红灯显示的数据(最大)
DATA_SN EQU 32H;南北方向红灯显示的数据(最大)
SECOND_TIME EQU 33H;显示延时参数
SECOND_FLICKER EQU 34H;闪烁延时参数
STATUS EQU 35H;设置状态寄存器
ORG 0
JMP MAIN
ORG 0BH
JMP INT_T0 ;计数
ORG 1BH
JMP INT_T1 ;闪烁定时
MAIN:
MOV SCON,#0
MOV TMOD,#11H
MOV TH0,#3CH
MOV TL0,#0B0H
MOV TH1,#3CH
MOV TL1,#0B0H
SETB EA
SETB ET0
SETB ET1
SETB TR0
MOV DPTR,#TAB
MOV SECOND_TIME,#20
MOV SECOND_FLICKER,#10
MOV DATA_EW,#25H;
MOV DATA_SN,#25H
SETB DIRECTION_F
CLR FLICKER
MOV STATUS,#0
CLR SHOW_F
SETB RED_SN ;让灯都灭
SETB YELLOW_SN
SETB GREEN_SN
SETB RED_EW
SETB YELLOW_EW
SETB GREEN_EW
SCAN:
JB SET_KEY,NO_CHANGE ;判断设置键是否按下:没有则跳转
CALL DELAY
JB SET_KEY,SCAN
INC STATUS
MOV A,STATUS
CJNE A,#3,EXIT_CHANGE_STATUS
MOV STATUS,#0
MOV SHOW,DATA_EW
SETB DIRECTION_F ;TEXT
SETB TR0
EXIT_CHANGE_STATUS:
JNB SET_KEY,$
CALL DELAY
JMP SCAN
NO_CHANGE:
MOV A,STATUS
JNZ SET_PROGRAMME ;判断是否处在设置状态
JNB DIRECTION_F,SHOW_SN;在正常显示下,判断应该显示的方向
JB SHOW_F,CHOOSE_STEP ;判断是否应该更新显示内容,当SHOW_F置位时,不更新
MOV SHOW,DATA_EW
SETB SHOW_F
CHOOSE_STEP:
SETB RED_SN
CLR RED_EW
JNB FLICKER,GO_ON_NEXT ;判断南北绿灯是否该闪烁
SETB TR1 ;南北绿灯闪烁
JMP SCAN
GO_ON_NEXT:
CLR TR1
JNB F_YELLOWY,SN_GREEN_NATURE;判断南北黄灯是否该亮
SETB GREEN_SN
CLR YELLOW_SN
JMP SCAN
SN_GREEN_NATURE: ;南北绿灯亮
CLR GREEN_SN
SETB GREEN_EW
SETB YELLOW_EW
JMP SCAN
SHOW_SN:
JB SHOW_F,STEP_CHOOSE
MOV SHOW,DATA_SN
SETB SHOW_F
STEP_CHOOSE:
SETB RED_EW
CLR RED_SN
JNB FLICKER,GO_TO_NEXT
SETB TR1
JMP SCAN
GO_TO_NEXT:
CLR TR1
JNB F_YELLOWY,EW_GREEN_NATURE
SETB GREEN_EW
CLR YELLOW_EW
JMP SCAN
EW_GREEN_NATURE:
CLR GREEN_EW
SETB GREEN_SN
SETB YELLOW_SN
JMP SCAN
SET_PROGRAMME:
CLR TR0
CLR FLICKER
CLR SHOW_F
SETB DIRECTION_F
CJNE A,#1,SET_SN;;在设置状态下,判断哪个方向上地设置
MOV P1,#0F7H
MOV SHOW,DATA_EW
CALL TRAFFIC
;在设置东西方向时,冉灯都亮来说明确实在设置状态昧
JNB ADD_KEY,ADD_EW_DATA
JB SUBB_KEY,EXIT_EW_SET
CALL DELAY
JB SUBB_KEY,EXIT_EW_SET
MOV A,DATA_EW
CJNE A,#5,EW_SUBB_FUNDUS
JMP WAIT_EW_SUBB_UNPRESSED
EW_SUBB_FUNDUS:
ADD A,#99H
DA A
MOV DATA_EW,A
MOV SHOW,DATA_EW
CALL TRAFFIC
WAIT_EW_SUBB_UNPRESSED:
JNB SUBB_KEY,$
CALL DELAY
EXIT_EW_SET:
JMP SCAN
ADD_EW_DATA:
CALL DELAY
JB ADD_KEY,EXIT_EW_SET
MOV A,DATA_EW
CJNE A,#99H,EW_ADD_FUNDUS
JMP WAIT_EW_ADD_UNPRESSED
EW_ADD_FUNDUS:
ADD A,#1
DA A
MOV DATA_EW,A
MOV SHOW,DATA_EW
CALL TRAFFIC
WAIT_EW_ADD_UNPRESSED:
JNB ADD_KEY,$
JMP SCAN
SET_SN:
MOV P1,#0FEH
MOV SHOW,DATA_SN
CALL TRAFFIC
JNB ADD_KEY,ADD_SN_DATA
JB SUBB_KEY,EXIT_SN_SET
CALL DELAY
JB SUBB_KEY,EXIT_SN_SET
MOV A,DATA_SN
CJNE A,#5,SN_SUBB_FUNDUS
JMP WAIT_SN_SUBB_UNPRESSED
SN_SUBB_FUNDUS:
ADD A,#99H
DA A
SETB LEAST_F
MOV DATA_SN,A
MOV SHOW,DATA_SN
CALL TRAFFIC
WAIT_SN_SUBB_UNPRESSED:
JNB SUBB_KEY,$
CALL DELAY
EXIT_SN_SET:
JMP SCAN
ADD_SN_DATA:
CALL DELAY
JB ADD_KEY,EXIT_SN_SET
MOV A,DATA_SN
CJNE A,#99H,SN_ADD_FUNDUS
JMP WAIT_SN_ADD_UNPRESSED
SN_ADD_FUNDUS:
ADD A,#1
DA A
MOV DATA_SN,A
MOV SHOW,DATA_SN
CALL TRAFFIC
WAIT_SN_ADD_UNPRESSED:
JNB ADD_KEY,$
JMP SCAN
DELAY:
MOV R1,#40
LOOP:
MOV R2,#0
DJNZ R2,$
DJNZ R1,LOOP
RET
INT_T0:
MOV TH0,#3CH
MOV TL0,#0B0H
PUSH ACC
PUSH PSW
DJNZ SECOND_TIME,EXIT_INT
MOV SECOND_TIME,#20
MOV A,SHOW
ADD A,#99H
DA A
MOV SHOW,A
CJNE A,#4,GO_ON_GO
SETB FLICKER
GO_ON_GO:
CJNE A,#2,BEARING_CPL
CLR FLICKER
SETB F_YELLOWY
BEARING_CPL:
CJNE A,#0,EXIT_INT_SECOND
CLR F_YELLOWY
CPL DIRECTION_F
CLR SHOW_F
EXIT_INT_SECOND:
CALL TRAFFIC
EXIT_INT:
POP PSW
POP ACC
RETI
INT_T1:
PUSH PSW
MOV TH0,#3CH
MOV TL0,#0B0H
DJNZ SECOND_FLICKER,END_T1
MOV SECOND_FLICKER,#10
JNB DIRECTION_F,NEXT
CPL GREEN_SN
JMP END_T1
NEXT:
CPL GREEN_EW
END_T1:
POP PSW
RETI
TRAFFIC:
MOV A,SHOW
ANL A,#0FH
MOVC A,@A+DPTR
; CPL A
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,SHOW
ANL A,#0F0H
SWAP A
MOVC A,@A+DPTR
; CPL A
MOV SBUF,A
JNB TI,$
CLR TI
CLR LATCH
SETB LATCH
RET
TAB:
DB 0fch, 60h,0dah,0f2h, 66h,0b6h,0beh,0e0h,0feh,0f6h
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -