1、倒计时交通灯
源程序:
CMD_8279 EQU 0BF01
DA TA_8279 EQU 0BF00
ORG OOOOH
LJMP MAIN
ORG 000BH
LJMP INT_T0
ORG 0040H
MAIN: MOV SP,#50H
LCALL INIT8279
MOV 30H,#16
MOV 31H,#16
MOV 20H,#0
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
MOV IE,#82H
CLR TR0
MOV 40H,#00H
;主循环用于检测有没有键按下,并取键值
STAR: LCALL DISPLAY
STAR0: LCALL SCAN_KEY
JNC STAR0
STAR1: LCALL KEY_NUM
CJNE A,#0AH,NEQ
MOV A,30H
SW AP A
ADD A,31H
MOV 50H,A
LCALL JIAOTONG
NEQ: JNC KEY_B
SJMP DA TAKEY
KEY_B: CJNE A,#0BH,STAR0
SETB 20H.1
LJMP STAR
DA TAKEY:
MOV 30H,31H
MOV 31H,A
LJMP STAR
;交通灯控制程序
JIAOTONG:MOV P1,#7EH
LCALL DISPLAY30S
JB 20H.1,MAIN
MOV P1,#0BDH
LCALL DISPLAY2S
JB 20H.1,MAIN
MOV P1,#0DBH
LCALL DISPLAY30S
JB 20H.1,MAIN
MOV P1,#0BDH
LCALL DISPLAY2S
JB 20H.1,MAIN
SJMP JIAOTONG
;8279初始化程序
INIT8279:MOV DPTR,#CMD_8279 MOV A,#34H
MOVX @DPTR,A
MOV A,#90H
MOVX @DPTR,A
INIT8279_1:LCALL CLEAR
MOV A,#90H
MOVX @DPTR,A
RET
CLEAR: MOV A,#0DEH
MOV DPTR,#CMD_8279
MOVX @DPTR,A
WAIT1: MOVX A,@DPTR
JB ACC.7,W AIT1
RET
;扫描键盘并取键值子程序
;键值存放在A中
SCAN_KEY:MOV DPTR,#CMD_8279
MOVX A,@DPTR
READ_FIFO:ANL A,#7
JZ NO_KEY
READ: MOV A,#40H
MOVX @DPTR,A
MOV DPTR,#DA TA_8279
MOVX A,@DPTR
SETB C
SCAN_KEY1:RET
NO_KEY: CLR C
SJMP SCAN_KEY1
KEY_NUM:ANL A,#3FH
RET
;显示子程序
DISPLAY:PUSH 07H
MOV R0,#30H
MOV DPTR,#LED_TAB
MOV P2,#0BFH
MOV R1,#01H
MOV A,#90H
MOVX @R1,A
MOV R1,#00H
MOV R7,#2
DISPLAY1:MOV A,@R0
MOVC A,@A+DPTR
MOVX @R1,A
INC R0
DJNZ R7,DISPLA Y1
POP 07H
RET
;共阳极LED字形码表
LED_TAB: DB 0C0H,0F9H,0A4H,0b0h,99h,92h,82h,0f8h;
DB 080H,90H,88H,83H,0C6H,0A1H,86H,8EH;
DB 0FFH;
;中断服务子程序
INT_T0: PUSH ACC
MOV TH0,#3CH
MOV TL0,#0B0H
INC 40H
MOV A,40H
CJNE A,#20,INT_T01 MOV 40H,#00H
CLR C
CLR A
MOV A,#9AH
SUBB A,#01H
ADD A,60H
DA A
MOV 60H,A
INT_T01: POP ACC
RETI
;延时30S并显示子程序
DISPLAY30S:MOV 60H,50H LCALL DECSEC
RET
;延时2S并显示子程序
DISPLAY2S:MOV 60H,#02H LCALL DECSEC
RET
;自减1子程序
DECSEC: SETB TR0 MOV A,60H
MOV R0,#31H
LCALL P_BCD LCALL DISPLAY LCALL SCAN_KEY JC XIUGAI
CONTINUE:MOV A,60H CJNE A,#00H,DECSEC MOV R0,#31H
LCALL P_BCD LCALL DISPLAY SJMP OUT
OUT: RET
;拆字子程序
P-BCD: MOV @R0,A ANL A,#0FH
XCH A,@R0
DEC R0
SW AP A
ANL A,#0FH
MOV @R0,A
DEC R0
RET
END
Z8279 EQU 0FF82H ;8279 状态/命令口地址
D8279 EQU 0FF80H ;8279 数据口地址
LEDMOD EQU 00H ;左边输入八位字符显示
;外部译码键扫描方式,双键互锁
LEDFEQ EQU 33H ;扫描速率
LEDCLS EQU 0C1H ;清除显示RAM
LEDWR0 EQU 80H ;设定的将要写入的显示RAM地址
ORG 0000H
LJMP START
ORG 0003H ;INT 0 中断入口地址
LJMP INT_0
ORG 001BH ;T1中断入口地址
LJMP INT_T1
ORG 0040H
START:
MOV SP,#60H
MOV TMOD,#10H ;置T1为方式1
SETB EX0 ;INT 0 中断有效
SETB IT0
SETB EA
MOV TL1,#00H ;延时50mS 常数
MOV TH1,#4cH
MOV R0,#2 ;延时100mS 常数
SETB TR1 ;启动T1
SETB ET1
setb pt1 ;必须设置定时器1的中断优先级高于外部中断0
LCALL INIT8279 ;初始化8279
LCALL STA TUS0 ;初始状态(都是红灯)
CIRCLE:
LCALL STA TUS1 ;南北绿灯,东西红灯
LCALL STA TUS2 ;南北绿灯闪转黄灯,东西红灯
LCALL STA TUS3 ;南北红灯,东西绿灯
LCALL STA TUS4 ;南北红灯,东西绿灯闪转黄灯
LJMP CIRCLE
INT_0:
PUSH PSW ;保护现场
PUSH 2
PUSH 90H
clr ex0
MOV P1,#0FH ;南北,东西都亮红灯
MOV R2,#100 ;延时10秒
LCALL DELAY_DISPLAY
setb ex0
POP 90H ;恢复现场
POP 2
POP PSW
RETI
INT_T1:
PUSH ACC
PUSH PSW
CLR TR1
MOV TL1,#00H ;延时50mS 常数
MOV TH1,#4CH
SETB TR1
DJNZ R0,EXIT
MOV R0,#2 ;延时100ms 常数
DEC R2
EXIT:
POP PSW
POP ACC
RETI
STA TUS0: ;南北红灯,东西红灯
MOV P1,#0FH
MOV R2,#10 ;延时1秒
LCALL DELAY_DISPLAY
RET
STA TUS1: ;南北绿灯,东西红灯
MOV P1,#96H ;南北绿灯,东西红灯
MOV R2,#200 ;延时20秒
LCALL DELAY_DISPLAY
RET
STA TUS2: ;南北绿灯闪转黄灯,东西红灯
MOV R3,#03H ;绿灯闪3次
FLASH:
MOV P1,#9FH
MOV R2,#03H
LCALL DELAY_DISPLAY
MOV P1,#96H
MOV R2,#03H
LCALL DELAY_DISPLAY
DJNZ R3,FLASH
MOV P1,#06H ;南北黄灯,东西红灯
MOV R2,#10 ;延时1秒
LCALL DELAY_DISPLAY
RET
STA TUS3: ;南北红灯,东西绿灯
MOV P1,#69H
MOV R2,#200 ;延时20秒
LCALL DELAY_DISPLAY
RET
STA TUS4: ;南北红灯,东西绿灯闪转黄灯
MOV R3,#03H ;绿灯闪3次
FLASH1:
MOV P1,#6FH
MOV R2,#03H
LCALL DELAY_DISPLAY
MOV P1,#69H
MOV R2,#03H
LCALL DELAY_DISPLAY
DJNZ R3,FLASH1
MOV P1,#09H ;南北红灯,东西黄灯
MOV R2,#10 ;延时1秒
LCALL DELAY_DISPLAY
NOP
RET
INIT8279: ;8279初始化子程序
PUSH DPH ;保存现场
PUSH DPL
PUSH ACC
LCALL DELAY;延时
MOV DPTR ,#Z8279
MOV A,#LEDMOD ;置8279工作方式
MOVX @DPTR,A
MOV A,#LEDFEQ ;置键盘扫描速率
MOVX @DPTR,A
MOV A,#LEDCLS ;清除LED 显示
MOVX @DPTR,A
LCALL DELAY;延时
POP ACC ;恢复现场
POP DPL
POP DPH
RET
;显示字符子程序
;输入: R4,位置R5,值
DISLED:
PUSH DPH ;保存现场
PUSH DPL
PUSH ACC
MOV A,#LEDWR0 ;置显示起始地址
ADD A,R4 ;加位置偏移量
MOV DPTR,#Z8279
MOVX @DPTR,A;设定显示位置
MOV DPTR,#LEDSEG ;置显示常数表起始位置
MOV A,R5
MOVC A,@A+DPTR ;查表
MOV DPTR,#D8279
MOVX @DPTR,A;显示数据
POP ACC ;恢复现场
POP DPL
POP DPH
RET
DELAY: ;延时子程序
PUSH 0 ;保存现场
PUSH 1
MOV 0,#0H
DELAY1:
MOV 1,#0H
DJNZ 1,$
DJNZ 0,DELAY1
POP 1 ;恢复现场
POP0
RET
DELAY_DISPLAY: ;延时和显示时间子程序
PUSH 1
PUSH 0
push acc
loopwait: MOV b,#10
MOV a,2
div ab
MOV b,#10
div ab
MOV r4,#1
MOV r5,a
LCALL DISLED ;显示秒高位
MOV r4,#0
MOV r5,b
LCALL DISLED ;显示秒低位
MOV a,2
jnz loopwait ;延时等待
pop acc
POP 0
POP 1
RET
LEDSEG: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;'0,1,2,3,4,5,6,7'
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;'8,9,A,B,C,D,E,F'
END
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- kqyc.cn 版权所有 赣ICP备2024042808号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务