📄 jdd5.asm
字号:
OUTT00: POP PSW ;恢复状态字(出栈)
POP ACC ;恢复累加器
SETB ET0 ;开放T0中断
RETI ;中断返回
;
INT22: DEC TIME
MOV A,TIME
CJNE A,TIMED1,LOOP111 ; 判断是否小于110秒
LOOP111: JC LOOP221 ; 120-110
MOV EW,#66H ; I
MOV SN,#55H ; I
LJMP OUTT01 ; 120-110
LOOP221: MOV A,TIME
CJNE A,TIMED2,LOOP331 ; 判断是否小于70秒
LOOP331: JC LOOP441 ; 110-70
MOV EW,#6AH ; I
MOV SN,#59H ; I
LJMP OUTT01 ; 110-70
LOOP441: MOV A,TIME
CJNE A,TIMED3,LOOP551 ; 判断是否小于60秒
LOOP551: JC LOOP661 ; 70-60
MOV 20H,EW ;
CPL 04H ;
CPL 00H
MOV EW,20H ; I
MOV SN,#59H ; I
LJMP OUTT01 ; 70-60
LOOP661: MOV A,TIME
CJNE A,TIMED4,LOOP771 ; 判断是否小于10秒
LOOP771: JC LOOP881 ; 60-10
MOV EW,#99H ; I
MOV SN,#59H ; I
LJMP OUTT01 ; 60-10
LOOP881: MOV A,TIME
JZ OUT881
MOV 20H,EW ;
CPL 06H ;
CPL 02H
MOV EW,20H ;
MOV 20H,SN
CPL 02H
MOV SN,20H ; I
LJMP OUTT01 ; 70-60
OUT881: MOV TIME,TIMED0 ;120秒初值
CPL SNEWFLAG
OUTT01: LCALL TUNBCD ;
POP PSW ;恢复状态字(出栈)
POP ACC ;恢复累加器
SETB ET0 ;开放T0中断
RETI ;中断返回
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 显示程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 显示数据在70H-75H单元内,用六位LED共阳数码管显示,P0口输出段码数据,P2口作
; 扫描控制,每个LED数码管亮1MS时间再逐位循环。
DISPLAY: MOV R1,#70H ;指向显示数据首址
MOV R5,#0FEH ;扫描控制字初值
PLAY: MOV A,R5 ;扫描字放入A
MOV SCAN,A ;从P2口输出
MOV A,@R1 ;取显示数据到A
MOV DPTR,#TAB ;取段码表地址
MOVC A,@A+DPTR ;查显示数据对应段码
MOV LEDOUT,A ;段码放入P0口
LOOP6: LCALL DL1MS ;显示1MS
INC R1 ;指向下一地址
MOV A,R5 ;扫描控制字放入A
JNB ACC.2,ENDOUT ;ACC.5=0时一次显示结束
RL A ;A中数据循环左移
MOV R5,A ;放回R5内
MOV LEDOUT,#0FFH
AJMP PLAY ;跳回PLAY循环
ENDOUT: MOV LEDOUT,#0FFH ;一次显示结束,P2口复位
MOV SCAN,#0FFH ;P0口复位
RET ;子程序返回
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH
;共阳段码表 "0""1""2" "3""4""5""6""7" "8""9""不亮"“A”“-”
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 延时程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;1MS延时程序,LED显示程序用
DL1MS: MOV R6,#14H
DL1: MOV R7,#19H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
;
;
TUNBCD: PUSH ACC
PUSH PSW
PUSH B
MOV A,TIME ;
MOV B,#100 ;
DIV AB ;
MOV 72H,A
JNZ JJ0
MOV 72H,#0AH ;最高位为零,不点亮
JJ0: MOV A, B
MOV B,#10 ;
DIV AB
MOV 71H,A
JNZ JJ1
MOV A,72H ;次高位为0,先看最高位是否为不亮
SUBB A,#0AH
JNZ JJ1
MOV 71H,#0AH ;最高位不亮,次高位也不亮
JJ1: MOV 70H,B
POP B
POP PSW
POP ACC
RET
;119L车中断程序;
INT11: PUSH ACC
PUSH PSW
CLR EX1
CLR ET0
CLR TR0
MOV SN,#055H ; 全红灯
MOV EW,#055H ;
MOV TIMESFR,TIME ;保存道口数据
MOV TIME,#0FH
MOV CONR5,#20
LCALL TUNBCD
SETB ET1
SETB TR1
; SETB EX1
POP PSW
POP ACC
RETI
;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 15秒计时程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T1中断服务程序
INTT1: PUSH ACC ;累加器入栈保护
PUSH PSW ;状态字入栈保护
CLR ET1 ;关T0中断允许
CLR TR1 ;关闭定时器T0
MOV A,#0B7H ;中断响应时间同步修正
ADD A,TL1 ;低8位初值修正
MOV TL1,A ;重装初值(低8位修正值)
MOV A,#3CH ;高8位初值修正
ADDC A,TH1 ;
MOV TH1,A ;重装初值(高8位修正值)
SETB TR1 ;开启定时器T0
DJNZ CONR5, OUTT333 ;20次中断未到中断退出
MOV CONR5,#14H ;20次中断到(1秒)重赋初值
DEC TIME
LCALL TUNBCD
MOV A,TIME
JZ OUT444
OUTT333: SETB ET1
POP PSW
POP ACC
RETI
OUT444:CLR TR1
CLR ET1
MOV TIME,TIMESFR
LCALL TUNBCD
SETB ET0
SETB TR0
SETB EX1
POP PSW
POP ACC
RETI
END ;程序结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -