📄 lamp04.txt
字号:
Z8279 EQU 0FF82H ;8279状态/命令口地址
D8279 EQU 0FF80H ;8279数据口地址
LEDMOD EQU 00H ;左边输入八位字符显示
;外部译码键扫描方式,双键互锁
LEDFEQ EQU 2FH ;扫描速率
LEDCLS EQU 0C1H ;清除显示RAM
LEDWR0 EQU 80H ;设定的将要写入的显示RAM地址
READKB EQU 40H ;读FIFO RAM地址0的命令字
ORG 0000H
MOV DPTR,#8406H ;8255控制口地址
MOV A, #80H ;命令字传入控制口
MOVX @DPTR,A
LJMP START ;开始程序
ORG 0040H
START: MOV 16H,#35 ;设定显示秒数
MOV SP,#30H
LCALL STATUS0 ;调用初始状态全红灯
CIRCLE: LCALL STATUS1 ;南北绿灯东西红灯
LCALL STATUS2 ;南北绿灯闪转黄灯东西红灯
LCALL STATUS3 ;南北红灯东西绿灯
LCALL STATUS4 ;南北红灯东西绿灯闪转黄灯
LJMP CIRCLE
STATUS0:
MOV DPTR , #8400H
MOV A,#0FH
MOVX @DPTR, A
MOV R2,#10 ;延时一秒
LCALL DELAY
RET
STATUS1: ;南北绿灯东西红灯
MOV DPTR , #8400H
MOV A,#96H
MOVX @DPTR, A
MOV 11H,16H
LCALL INIT8279 ;初始化清屏
STA1: LCALL LC ;处理并调用显示的数据
MOV 15H,#07H ;设定显示位数
MOV 14H,#06H
MOV R5,12H
LCALL DISPLAY ;调用显示
MOV R5, 13H
MOV R2,#10
LCALL DELAY ;延时
LCALL FUWU ;调用键盘服务程序
DJNZ 11H,STA1
RET
STATUS2: ;南北绿灯闪转黄灯东西红灯
MOV DPTR , #8400H
MOV R3,#03H ;闪烁三次
FLASH:
MOV A,#9FH
MOVX @DPTR,A
MOV R2,#03H
LCALL DELAY
MOV A,#96H
MOVX @DPTR,A
MOV R2,#03H
LCALL DELAY
DJNZ R3,FLASH
MOV A,#06H
MOVX @DPTR,A
LCALL INIT8279
MOV 11H,#5 ;弯道时间
STA2: LCALL LC
MOV 14H,#4
LCALL DISPLAY
DJNZ 11H,STA2
RET
STATUS3: ;南北红灯东西绿灯
MOV DPTR , #8400H
MOV A,#69H
MOVX @DPTR, A
MOV 11H,#25 ;设定支道时间
LCALL INIT8279
STA3: LCALL LC
MOV 15H,#03H
MOV 14H, #02H
LCALL DISPLAY
DJNZ 11H,STA3
RET
STATUS4: ;南北红灯东西绿灯闪转黄灯
MOV DPTR , #8400H
MOV R3,#03H
FLASH1:
MOV A,#6FH
MOVX @DPTR,A
MOV R2,#03H
LCALL DELAY
MOV A,#69H
MOVX @DPTR,A
MOV R2,#03H
LCALL DELAY
DJNZ R3,FLASH1
MOV A,#09H
MOVX @DPTR,A
MOV 11H,#05H
LCALL INIT8279
STA4: LCALL LC
MOV 14H,#00H ;让该位显示0
LCALL DISPLAY
DJNZ 11H,STA4
RET
INIT8279: ;初始化
MOV DPTR,#Z8279
MOV A,#LEDMOD
MOVX @DPTR,A
MOV A,#LEDFEQ
MOVX @DPTR,A
MOV A,#LEDCLS
MOVX @DPTR,A
LCALL DELAY
RET
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 ;延时100ms
PUSH 1
PUSH 2
DELAY1: MOV 1,#0H
DELAY2:MOV 0,#0B2H
DJNZ 0,$
DJNZ 1,DELAY2
DJNZ 2,DELAY1
POP 2
POP 1
POP 0
RET
DISPLAY: ;显示字符程序
MOV R5,12H ;存高位
MOV R4,15H ;显高位
LCALL DISLED
MOV R5,13H
MOV R4,14H
LCALL DISLED
; MOV R2,#10
; LCALL DELAY
;MOV R5,#00H
;MOV R4,14H
;LCALL DISLED
RET
LC: MOV A, 11H ;处理将要显示的数据
MOV B,#0AH
DIV AB
MOV 12H,A
MOV 13H,B
RET
ERROR: LCALL STATUS0 ;显示急停子程序
MOV R5,#10H
MOV R4,#05H
LCALL DISLED
MOV R5,#11H
MOV R4,#04H
LCALL DISLED
MOV R5,#12H
MOV R4,#03H
LCALL DISLED
MOV R5,#13H
MOV R4,#02H
LCALL DISLED
RET
FUWU: ;键盘程序
WAIT: LCALL GETKEY ;得到键值
CJNE A,#0FFH,RET0 ;是否有键按下
MOV A,B
CJNE A,#0AH, BB ;判断键值
LCALL KEYA
;SJMP RET0
BB: MOV A,B
CJNE A,#0BH,CC
LCALL KEYB
;SJMP RET0
CC: MOV A,B
CJNE A,#0CH,DD
LCALL KEYC
;SJMP RET0
DD: MOV A,B
CJNE A,#0DH ,WAIT
LCALL KEYD
RET0: RET
GETKEY: PUSH DPH ;读取键盘子程序,
PUSH DPL 保护现场
PUSH PSW
MOV DPTR,#Z8279 ;读8279状态
MOVX A,@DPTR
ANL A,#07H
JNZ GETVAL ;判断是否有键输入
MOV A,#00H ;置标志(无键输入)
SJMP NKBHIT ;
GETVAL: ;读FIFO RAM命令
MOV A,#READKB ;读键值
MOVX @DPTR,A
MOV DPTR,#D8279
MOVX A,@DPTR
ANL A,#3FH ;屏蔽SHIF、CTRL
MOV B ,A ;置返回键值
MOV A,#0FFH ;置标志(有键输入)
NKBHIT: POP PSW ;恢复现场
POP DPL
POP DPH
RET
KEYA: LCALL INIT8279 ;A键(开始)
MOV R5,B
MOV R4,#06H
LCALL DISLED
AJMP START
RET
KEYB: MOV R5,#0BH ;B键急停
MOV R4,#06H
;LCALL DISLED
LCALL ERROR
RET
KEYC: LCALL INIT8279 ;C键改数
MOV R5,#0CH
MOV R4,#06H
LCALL DISLED
WAIT1: LCALL GETKEY
CJNE A,#0FFH,WAIT1
MOV R5,B
MOV 21H,B
MOV R4,#01H
LCALL DISLED
WAIT2: LCALL GETKEY
CJNE A,#0FFH,WAIT2
MOV R5,B
MOV 20H,B
MOV R4,#0
LCALL DISLED
CLR A
;MOV A,81H
;MOV B,#10
;MUL AB
;MOV B,80H
;ADD A,B
;MOV 16H,A
RET
KEYD: MOV A,21H ;D键确认
MOV B,#10
MUL AB
MOV B,20H
ADD A,B
MOV 16H,A
MOV 11H,16H
;LCALL CIRCLE
AJMP CIRCLE
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,'
DB 73H,40H,40H,73H;'P,-,-,P,'
END
0000
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -