📄 sz616a.asm
字号:
LED1 BIT p1.3 ;4位数码管选通引脚
LED2 BIT p1.4
LED3 BIT p1.6
LED4 BIT p1.7
LED2DZ BIT P1.5 ;小数点
LS164_AB BIT p3.0 ;74LS164数据线
LS164_CLK BIT p3.1 ;74LS164时钟线
KEY1 BIT p3.5 ;按键1
KEY2 BIT p3.7 ;按键2
DISPFLAG EQU 40H ;显示标识
DISPBUF EQU 20H
DISPBUF1 EQU 50H ;定时缓冲
BEEP BIT p1.0
MSCNT EQU 30H ;中断次数
SECONDBUF EQU 31H
MINUTEBUF EQU 32H
HOURBUF EQU 33H
MONTHBUF EQU 34H
DAYBUF EQU 35H
MINUTEBUF1 EQU 36H
HOURBUF1 EQU 37H
ORG 0000h
JMP START
ORG 000Bh
JMP TIMER0
ORG 0100H
START:
MOV SP,#5FH
CLR LED2DZ
CLRDISPBUF: ; 清显示缓冲区
MOV R2,#0FH
MOV R0,#DISPBUF+1
CLRDISPBUFLOOP:
MOV @R0,#0H
INC R0
DJNZ R2,CLRDISPBUFLOOP
MOV DISPFLAG,#0H;初始时显示"时,分"
CLR LS164_AB
CLR LS164_CLK
MOV TMOD,#01H ; 方式1
MOV TH0,#1FH ;初值
MOV TL0,#00H
MOV MSCNT,#16
SETB EA
SETB ET0
SETB TR0
LOOP: ; LCALL KEYINPUT
LCALL DISP
AJMP LOOP
TIMER0:
PUSH PSW
PUSH ACC
SETB PSW.3 ; 去掉后闪烁明显
MOV TH0,#1FH
MOV TL0,#00H
MOV A,MSCNT
DEC A
MOV MSCNT,A
JNZ RET1
; 微调
CLR EA
MOV TH0,#1FH
MOV TL0,#00H
SETB EA
MOV MSCNT,#15
; 秒走
MOV A, SECONDBUF
CJNE A, #1,SADD1
MOV SECONDBUF, #0
; 分走
MOV A, MINUTEBUF
CJNE A, #1,MADD1
MOV MINUTEBUF, #0
; 小时走
MOV A, HOURBUF
CJNE A, #3,HADD1
MOV HOURBUF, #0
; 定时
AJMP RET1
SADD1: ; 秒加1
INC SECONDBUF
AJMP RET1
MADD1: ; 分加1
INC MINUTEBUF
AJMP RET1
HADD1: ; 小时加1
INC HOURBUF
RET1: LCALL KEYINPUT
; PUSH ACC
MOV 55H,HOURBUF
XRL 55H,#3
MOV R1,55H
CJNE R1,#0,RET2
MOV 56H,MINUTEBUF
XRL 56H,#1
MOV R2,56H
CJNE R2,#0,RET2
; MOV A,HOURBUF
; XRL A,HOURBUF1
; JNZ RET2
; MOV A,MINUTEBUF
; XRL A,MINUTEBUF1
; JNZ RET2
CLR BEEP
RET2:
; POP ACC
POP ACC
POP PSW
RETI
; 74LS164芯片工作原理程序
Send74LS164:
MOV R1,#8
Send2LS164_Loop:
RLC A
MOV LS164_AB,C
SETB LS164_CLK
CLR LS164_CLK
DJNZ r1,Send2LS164_Loop
RET
KEYINPUT:
JB F0,K1RET
K1: JB KEY1,K2
LCALL DELAY10MS
JB KEY1,K2
LCALL DELAY10MS
JB BEEP,K1S
SETB BEEP
JMP K1RET
K1S:
MOV A,DISPFLAG
CJNE A,#1,CLRSECONDBUF
AJMP KEYRET
CJNE A,#2,DISPFLAGADD
CLRSECONDBUF:
MOV SECONDBUF,#0
DISPFLAGADD:
ADD A,#3
MOV DISPFLAG,A
SETB F0
WAIT: JNB KEY1,WAIT
CJNE A,#15H,K1RET
MOV DISPFLAG,#0
CLR F0
K2:
JB KEY2,K1RET
LCALL DELAY10US
JB KEY2,K1RET
LCALL DELAY10US
MOV A,DISPFLAG
AJMP K2X
K1RET:
JMP KEYRET
K2X: CJNE A,#0,DISP1
ADD A,#1
MOV DISPFLAG,A
JMP KEYRET
DISP1: CJNE A,#1,DISP2
ADD A,#1
MOV DISPFLAG,A
JMP KEYRET
DISP2: CJNE A,#2,MONADD1
MOV A,#0
MOV DISPFLAG,A
JMP KEYRET
MONADD1: ; 月加1
CJNE A,#3,DAYADD1
MOV R5, MONTHBUF
CJNE R5,#12,MONADD
MOV MONTHBUF,#1
AJMP KEYRET
MONADD:
INC MONTHBUF
AJMP KEYRET
DAYADD1: ; 日加1
CJNE A,#6,HOURADD1
MOV R5,DAYBUF
CJNE R5,#31,DAYADD
MOV DAYBUF,#1
AJMP KEYRET
DAYADD:
INC DAYBUF
AJMP KEYRET
HOURADD1: ; 小时加1
CJNE A,#9,MINADD1
MOV R5,HOURBUF
CJNE R5,#23,HOURADD
MOV HOURBUF,#0
AJMP KEYRET
HOURADD:
INC HOURBUF
AJMP KEYRET
MINADD1: ; 分钟加1
CJNE A,#0CH,HOUR1ADD1
MOV R5,MINUTEBUF
CJNE R5,#59,MINADD
MOV MINUTEBUF,#0
AJMP KEYRET
MINADD:
INC MINUTEBUF
AJMP KEYRET
HOUR1ADD1: ; 定时小时加1
CJNE A,#0FH,MIN1ADD1
MOV R5,HOURBUF1
CJNE R5,#23,HOUR1ADD
MOV HOURBUF1,#0
AJMP KEYRET
HOUR1ADD:
INC HOURBUF1
LJMP KEYRET
MIN1ADD1: ; 定时分钟加1
CJNE A,#12H,KEYRET
MOV R5,MINUTEBUF1
CJNE R5,#59,MIN1ADD
MOV MINUTEBUF1,#0
AJMP KEYRET
MIN1ADD:
INC MINUTEBUF1
KEYRET:
RET
;显示程序
DISP:
MOV R1,#DISPFLAG
LCALL UPDATEDISPBUF
;初始显示 "时间"
KF0: CJNE @R1,#0,KF1
MOV R0,#DISPBUF+1
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED4
LCALL DELAY10MS
MOV R0,#DISPBUF+2
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED3
LCALL DELAY10MS
MOV R0,#DISPBUF+3
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED2
LCALL DELAY10MS
MOV R0,#DISPBUF+4
LCALL GET_LED1
LCALL Send74LS164
LCALL SELECT_LED1
LCALL DELAY10MS
AJMP KFRET
;显示 "日期"
KF1: CJNE @R1,#1,KF2
MOV R0,#DISPBUF+5
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED4
LCALL DELAY10MS
MOV R0,#DISPBUF+6
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED3
LCALL DELAY10MS
MOV R0,#DISPBUF+7
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED2
LCALL DELAY10MS
MOV R0,#DISPBUF+8
LCALL GET_LED1
LCALL Send74LS164
LCALL SELECT_LED1
LCALL DELAY10MS
AJMP KFRET
;显示 "秒"
KF2: CJNE @R1,#2,KF3
MOV R0,#DISPBUF+9
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED4
LCALL DELAY10MS
MOV R0,#DISPBUF+0AH
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED3
LCALL DELAY10MS
AJMP KFRET
;显示 "月"
KF3: CJNE @R1,#3,KF6
MOV R0,#DISPBUF+7
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED2
LCALL DELAY10MS
MOV R0,#DISPBUF+8
LCALL GET_LED1
LCALL Send74LS164
LCALL SELECT_LED1
LCALL DELAY10MS
AJMP KFRET
;显示 "日"
KF6: CJNE @R1,#6,KF9
MOV R0,#DISPBUF+5
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED4
LCALL DELAY10MS
MOV R0,#DISPBUF+6
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED3
LCALL DELAY10MS
AJMP KFRET
;显示 "小时"
KF9: CJNE @R1,#9,KF0C
MOV R0,#DISPBUF+3
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED2
LCALL DELAY10MS
MOV R0,#DISPBUF+4
LCALL GET_LED1
LCALL Send74LS164
LCALL SELECT_LED1
LCALL DELAY10MS
AJMP KFRET
;显示 "分"
KF0C: CJNE @R1,#0CH,KF0F
MOV R0,#DISPBUF+1
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED4
LCALL DELAY10MS
MOV R0,#DISPBUF+2
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED3
LCALL DELAY10MS
KF0F: CJNE @R1,#0FH,KF12
MOV R0,#DISPBUF1+1
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED2
LCALL DELAY10MS
MOV R0,#DISPBUF1+2
LCALL GET_LED1
LCALL Send74LS164
LCALL SELECT_LED1
LCALL DELAY10MS
KF12: CJNE @R1,#12H,KFRET
MOV R0,#DISPBUF1+3
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED4
LCALL DELAY10MS
MOV R0,#DISPBUF1+4
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED3
LCALL DELAY10MS
KFRET:
RET
UPDATEDISPBUF: ;1秒钟重新为 "秒,分,小时" 重新填显示缓冲
MOV A, SECONDBUF
MOV B, #10
DIV AB
MOV DISPBUF+9, B
MOV DISPBUF+0AH, A
MOV A, MINUTEBUF
MOV B, #10
DIV AB
MOV DISPBUF+1, B
MOV DISPBUF+2, A
MOV A, HOURBUF
MOV B, #10
DIV AB
MOV DISPBUF+3, B
MOV DISPBUF+4, A
MOV A, MONTHBUF
MOV B, #10
DIV AB
MOV DISPBUF+7, B
MOV DISPBUF+8, A
MOV A, DAYBUF
MOV B, #10
DIV AB
MOV DISPBUF+5, B
MOV DISPBUF+6, A
; 更新定时缓冲
MOV A, HOURBUF1
MOV B, #10
DIV AB
MOV DISPBUF1+1, B
MOV DISPBUF1+2, A
MOV A, MINUTEBUF1
MOV B, #10
DIV AB
MOV DISPBUF1+3, B
MOV DISPBUF1+4, A
RET
SELECT_LED1:;选通数码管1
CLR LED1
SETB LED2
SETB LED3
SETB LED4
RET
SELECT_LED2:;选通数码管1
CLR LED2
SETB LED1
SETB LED3
SETB LED4
RET
SELECT_LED3:;选通数码管1
CLR LED3
SETB LED1
SETB LED2
SETB LED4
RET
SELECT_LED4:;选通数码管1
CLR LED4
SETB LED1
SETB LED2
SETB LED3
RET
GET_LED234:
MOV DPTR,#SAG_LED234
MOV A,@R0
MOVC A,@A+DPTR
RET
GET_LED1:
MOV DPTR,#SAG_LED1
MOV A,@R0
MOVC A,@A+DPTR
RET
DELAY10MS: ;延时10毫秒
MOV R7,#10
D53: MOV R6,#200
D54:
NOP
NOP
NOP
NOP
NOP
DJNZ R6,D54
DJNZ R7,D53
RET
DELAY10US:
MOV R7,#5
DJNZ R7,$
RET
SAG_LED1: ;LED1段码
DB 01010000b,11111001b,00110100b,10110000b,10011001b,10010010b,00010010b,11111000b,00010000b,10010000b,0ffh
SAG_LED234: ;LED234段码
DB 11000000b,11111001b,10100100b,10110000b,10011001b,10010010b,10000010b,11111000b,10000000b,10010000b,0ffh
; 0 1 2 3 4 5 6 7 8 9
TABLE_extra:
DB 11111110B,11111101B,11111011B,11110111B,11101111B,11011111B,10111111B,0h,0ffh,0ffh,0ffh
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -