这是个参考的汇编程序,不会呢,呜呜呜:Sad:
FMQ EQU P1.0 ;蜂鸣器
QR EQU P1.3 ;前红灯
QY EQU P1.1 ;前黄灯
QG EQU P1.2 ;前绿灯
HR EQU P2.2 ;后红灯
HY EQU P2.0 ;后黄灯
HG EQU P2.1 ;后绿灯
ZR EQU P1.4 ;左红灯
ZY EQU P1.5 ;左黄灯
ZG EQU P1.6 ;左绿灯
YR EQU P2.5 ;右红灯
YY EQU P2.4 ;右黄灯
YG EQU P2.3 ;右绿灯
SWITCH1 EQU P2.6 ;
SWITCH2 EQU P2.7 ;
DAT EQU 60H ;显存
ORG 0000H
LJMP START
ORG 0003H
LJMP D_X ;外部中断0,东西向紧急按键
ORG 000BH
RETI ;
ORG 0013H
LJMP N_B ;外部中断1,南北向紧急按键
ORG 001BH
RETI
ORG 0023H
RETI
ORG 0040H ;定位
START:
MOV TCON, #5H ;外部中断为下降沿触发
SETB EX0 ;
SETB EX1 ;开外部中断
SETB EA ;开总中断
;IO口初始化
MOV P0,#0FFH
MOV P1,#0FFH ;
MOV P2,#0FFH ;
MOV P3,#0FFH ;
MOV DAT, #25H ;
AUTCLK:
MOV P1, #0FFH ;
MOV P2, #0FFH ;
MOV DAT, #30H ;写入每一通路的通行时间
CLR QG ;南北向绿灯亮
CLR HG ;
CLR ZR ;东西向红灯亮
CLR YR ;
MOV A, DAT ;
MOV R2, #25 ;写入时间值
A1:
MOV R1, #220 ;
A2:
ACALL BCD ;BCD调整
ACALL DISPCLK ;显示
ACALL DEL1MS ;延时
ACALL DEL1MS ;
ACALL DEL1MS ;
DJNZ R1, A2 ;
SETB FMQ ;
MOV A, DAT ;完成数字的减1操作
ADD A, #99H ;
DA A ;
MOV DAT, A ;调整好的数字送显存
DJNZ R2, A1 ;
;最后5秒黄灯闪
MOV P1, #0FFH ;
MOV P2, #0FFH ;关所有灯
CLR ZY ;黄灯亮
CLR YY ;
CLR QY ;
CLR HY ;
MOV R2, #5 ;
A3:
MOV R1, #220 ;
A4:
ACALL BCD ;
ACALL DISPCLK ;
ACALL DEL1MS ;
ACALL DEL1MS ;
ACALL DEL1MS ;
DJNZ R1, A4 ;
CPL QY ;南北向绿灯亮
CPL HY ;
CPL ZY ;东西向红灯亮
CPL YY ;
CPL FMQ ;黄灯时蜂鸣器叫一声
MOV A, DAT ;
ADD A, #99H ;
DA A ;
MOV DAT, A ;
DJNZ R2, A3 ;
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
MOV P1, #0FFH ;
MOV P2, #0FFH ;
MOV DAT, #20H ;
CLR ZG ;东西向绿灯亮
CLR YG ;
CLR QR ;南北向红灯亮
CLR HR ;
MOV A, DAT ;
MOV R2, #15 ;执行15秒
A5:
MOV R1, #220 ;
A6:
ACALL BCD ;BCD调整
ACALL DISPCLK ;显示
ACALL DEL1MS ;
ACALL DEL1MS ;
ACALL DEL1MS ;
DJNZ R1, A6 ;
SETB FMQ ;
MOV A, DAT ;
ADD A, #99H ;减1操作
DA A ;
MOV DAT, A ;
DJNZ R2, A5 ;
;最后5秒黄灯闪
MOV P1, #0FFH ;
MOV P2, #0FFH ;关所有灯
CLR ZY ;黄灯亮
CLR YY ;
CLR QY ;
CLR HY ;
MOV R2, #5 ;
A7:
MOV R1, #220 ;
A8:
ACALL BCD ;
ACALL DISPCLK ;
ACALL DEL1MS ;
ACALL DEL1MS ;
ACALL DEL1MS ;
DJNZ R1, A8 ;
CPL QY ;南北向绿灯亮
CPL HY ;
CPL ZY ;东西向红灯亮
CPL YY ;
CPL FMQ ;黄灯时蜂鸣器叫一声
MOV A, DAT ;
ADD A, #99H ;
DA A ;
MOV DAT, A ;
DJNZ R2, A7 ;
AJMP AUTCLK ;
NOP ;
NOP ;
NOP ;
LJMP START
;;*********************************
;;显示子程序
;;**********************************
DISPCLK:
MOV DPTR, #TAB ;定入表头
;显示个位
MOV A, 50H ;
MOVC A, @A+DPTR ;
MOV P0, A ;
CLR SWITCH2 ;
LCALL DEL1MS ;
SETB SWITCH2 ;
;显示十位
MOV A, 51H ;
MOVC A, @A+DPTR ;
MOV P0, A ;
CLR SWITCH1 ;
LCALL DEL1MS ;
SETB SWITCH1 ;
RET ;
NOP ;
NOP ;
NOP ;
LJMP START
;************************************************************
;横向道路紧急中断程序
;************************************************************
D_X:
CLR EA ;关总中断
JNB P3.2, $ ;
MOV A, DAT ;保存显示数据
MOV 20H, A ;
MOV DAT, #50H ;
MOV 21H, P1 ;
MOV 22H, P2 ;
MOV P1, #0FFH ;
MOV P2, #0FFH ;
CLR ZG ;东西向绿灯亮
CLR YG ;
CLR QR ;南北向红灯亮
CLR HR ;
MOV R4, #50 ;
D1:
MOV R3, #220 ;
D2:
ACALL BCD ;
ACALL DISPCLK ;
ACALL DEL1MS ;
ACALL DEL1MS ;
ACALL DEL1MS ;
DJNZ R3, D2 ;
MOV A, DAT ;
ADD A, #99H ;
DA A ;
MOV DAT, A ;
DJNZ R4, D1 ;
MOV A, 20H ;恢复显示数据
MOV DAT, A ;
MOV P2, 22H ;
MOV P1, 21H ;
CLR IE0 ;
CLR IE1 ;
SETB EA ;开总中断
RETI ;中断返回
;************************************************************
;纵向道路紧急中断程序
;************************************************************
N_B:
CLR EA ;关总中断
JNB P3.3, $ ;
MOV A, DAT ;保存显示数据
MOV 20H, A ;
MOV DAT, #50H ;
MOV 21H, P1 ;
MOV 22H, P2 ;
MOV P1, #0FFH ;
MOV P2, #0FFH ;
CLR QG ;南北向绿灯亮
CLR HG ;
CLR ZR ;东西向红灯亮
CLR YR ;
MOV R4, #50 ;
N1:
MOV R3, #220 ;
N2:
ACALL BCD ;
ACALL DISPCLK ;
ACALL DEL1MS ;
ACALL DEL1MS ;
ACALL DEL1MS ;
DJNZ R3, N2 ;
MOV A, DAT ;
ADD A, #99H ;
DA A ;
MOV DAT, A ;
DJNZ R4, N1 ;
MOV A, 20H ;恢复显示数据
MOV DAT, A ;
MOV P2, 22H ;
MOV P1, 21H ;
CLR IE0 ;
CLR IE1 ;
SETB EA ;开总中断
RETI ;中断返回
;********************************************************
BCD:
;将显存中的数字分分两个BCD码存于50H和51H单元中,用于显示十位和个位
MOV A, DAT ;
MOV B,#10H
DIV AB
MOV 51H,A ;写入分十位
MOV A,B
MOV 50H,A ;写入分个位
RET
NOP
NOP
NOP
LJMP START
;数码表
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
RET
NOP
NOP
NOP
LJMP START
;*****************************
;延时子程序
;12M晶振
;*****************************
DEL1MS: MOV R6,#28
DEL1MS1:MOV R7,#19
DEL1MS2:DJNZ R7,DEL1MS2
DJNZ R6,DEL1MS1
RET
NOP
NOP
NOP
LJMP START
DEL5MS: MOV R7,#90
DEL5MS1:MOV R6,#54
DEL5MS2:
DJNZ R6,DEL5MS2
DJNZ R7,DEL5MS1
RET
NOP
NOP
NOP
LJMP START
DEL250MS: MOV R5,#50
DEL250MS1:LCALL DEL5MS
DJNZ R5,DEL250MS1
RET
NOP
NOP
NOP
LJMP START
DEL500MS: MOV R4,#100
DEL500MS1:LCALL DEL5MS
DJNZ R4,DEL500MS1
RET ;
NOP
NOP
NOP
LJMP START
END