📄 sz606.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
KEYFLAG EQU 40H ;按键标识
DISPBUF EQU 20H
BEEP BIT p1.0
MSCNT EQU 30H
ORG 0000h
JMP START
ORG 000Bh
JMP TIMER0
ORG 0100H
START:
CLRDISPBUF: ; 清显示缓冲区
MOV R2,#0FH
MOV R0,#DISPBUF+1
CLRDISPBUFLOOP:
MOV @R0,#0H
INC R0
DJNZ R2,CLRDISPBUFLOOP
MOV KEYFLAG,#2
MOV SP,#50H
MOV DISPBUF+1,#0
MOV DISPBUF+2,#0
MOV DISPBUF+3,#2
MOV DISPBUF+4,#1
MOV DISPBUF+5,#1
MOV DISPBUF+6,#0
MOV DISPBUF+7,#3
MOV DISPBUF+8,#0
MOV DISPBUF+9,#2
MOV DISPBUF+0AH,#0
CLR LS164_AB
CLR LS164_CLK
MOV TMOD,#01H ; 方式1
MOV TH0,#9EH ;初值
MOV TL0,#58H
MOV MSCNT,#20H
SETB EA
SETB ET0
SETB TR0
LOOP:
LCALL KEYINPUT
LCALL DISP
JMP LOOP
TIMER0:
PUSH PSW
PUSH ACC
SETB PSW.3
MOV TH0,#9EH
MOV TL0,#58H
MOV a,MSCNT
DEC a
MOV MSCNT,a
JNZ RET1
MOV MSCNT,#20
MOV R0,#DISPBUF+0AH
LCALL DAAD
; MOV A,R2
;XRL A,#60H
;JNZ RET0
;ACALL CLR0
; MOV R0,#DISPBUF+2
; LCALL DAAD
; MOV A,R2
; XRL A,#60H
; JNZ RET0
; ACALL CLR0
;; MOV R0,#DISPBUF+4
; LCALL DAAD
; MOV A,R2
; ; XRL A,#24H
; JNZ RET0
; ACALL CLR0
;RET0:
;LCALL DISP
RET1: POP ACC
POP PSW
RETI
DAAD: ;+1 十进制调整
MOV A,@R0
SWAP A
DEC R0
ORL A,@R0
INC A
DA A
MOV R2,A
ANL A,#0Fh
MOV @R0,A
MOV A,R2
ANL A,#0F0h
SWAP A
INC R0
MOV @R0,A
RET
CLR0:
CLR A
MOV @R0,A
DEC R0
MOV @R0,A
RET
; 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:
K1: JB KEY1,K2
LCALL DELAY10MS
JB KEY1,K2
LCALL DELAY10MS
KEY1DOWNLOOP:
JNB KEY1,KEY1DOWNLOOP
LCALL DELAY10MS
JNB KEY1,KEY1DOWNLOOP
LCALL DELAY10MS
MOV A,KEYFLAG
CJNE A,#0,IF12
ADDFLAG: ;keyflag 加
ADD A,#3
MOV KEYFLAG,A
CJNE A,#0FH,KEYRET
MOV KEYFLAG,#0
JMP KEYRET
IF12: ;判断keyflag 是否= 1,2
MOV R4,A
ANL A,#0FEH
JZ KEYRET
MOV A,R4
ANL A,#0FDH
JZ KEYRET
MOV A,R4
JMP ADDFLAG
K2: JB KEY2,KEYRET
LCALL DELAY10MS
JB KEY2,KEYRET
LCALL DELAY10MS
KEY2DOWNLOOP:
JNB KEY2,KEY2DOWNLOOP
LCALL DELAY10MS
JNB KEY2,KEY2DOWNLOOP
LCALL DELAY10MS
MOV A,KEYFLAG
MONADD1: ; 月加1
CJNE A,#3,DAYADD1
MOV R5,DISPBUF+7
INC R5
MOV DISPBUF+7,R5
CJNE R5,#9,KEYRET
MOV R5,#0
MOV DISPBUF+7,R5
MOV R6,DISPBUF+8
INC R6
MOV DISPBUF+8,R6
CJNE R6,#3,KEYRET
MOV R6,#0
MOV DISPBUF+8,R6
JMP KEYRET
DAYADD1: ; 日加1
CJNE A,#6,HOURADD1
JMP KEYRET
HOURADD1: ; 小时加1
CJNE A,#9,MINADD1
JMP KEYRET
MINADD1: ; 分钟加1
CJNE A,#0CH,K2X
JMP KEYRET
K2X: ; 显示日期和秒
ADD A,#1
MOV KEYFLAG,A
CJNE A,#3,KEYRET
MOV KEYFLAG,#0
KEYRET:
RET
;显示程序
DISP:
MOV R1,#KEYFLAG
;初始显示 "时间"
KF0: CJNE @R1,#0,KF1
MOV R0,#DISPBUF+1
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED4
LCALL DELAY20MS
MOV R0,#DISPBUF+2
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED3
LCALL DELAY20MS
MOV R0,#DISPBUF+3
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED2
LCALL DELAY20MS
MOV R0,#DISPBUF+4
LCALL GET_LED1
LCALL Send74LS164
LCALL SELECT_LED1
LCALL DELAY20MS
AJMP KFRET
;显示 "日期"
KF1: CJNE @R1,#1,KF2
MOV R0,#DISPBUF+5
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED4
LCALL DELAY20MS
MOV R0,#DISPBUF+6
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED3
LCALL DELAY20MS
MOV R0,#DISPBUF+7
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED2
LCALL DELAY20MS
MOV R0,#DISPBUF+8
LCALL GET_LED1
LCALL Send74LS164
LCALL SELECT_LED1
LCALL DELAY20MS
AJMP KFRET
;显示 "秒"
KF2: CJNE @R1,#2,KF3
MOV R0,#DISPBUF+9
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED4
LCALL DELAY20MS
MOV R0,#DISPBUF+0AH
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED3
LCALL DELAY20MS
AJMP KFRET
;显示 "月"
KF3: CJNE @R1,#3,KF6
MOV R0,#DISPBUF+7
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED2
LCALL DELAY20MS
MOV R0,#DISPBUF+8
LCALL GET_LED1
LCALL Send74LS164
LCALL SELECT_LED1
LCALL DELAY20MS
AJMP KFRET
;显示 "日"
KF6: CJNE @R1,#6,KF9
MOV R0,#DISPBUF+5
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED4
LCALL DELAY20MS
MOV R0,#DISPBUF+6
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED3
LCALL DELAY20MS
AJMP KFRET
;显示 "小时"
KF9: CJNE @R1,#9,KFC
MOV R0,#DISPBUF+3
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED2
LCALL DELAY20MS
MOV R0,#DISPBUF+4
LCALL GET_LED1
LCALL Send74LS164
LCALL SELECT_LED1
LCALL DELAY20MS
AJMP KFRET
;显示 "分"
KFC: CJNE @R1,#0CH,KFRET
MOV R0,#DISPBUF+1
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED4
LCALL DELAY20MS
MOV R0,#DISPBUF+2
LCALL GET_LED234
LCALL Send74LS164
LCALL SELECT_LED3
LCALL DELAY20MS
KFRET:
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
DELAY20MS: ;延时20毫秒
MOV R7,#7
D51: MOV R6,#200
D52:
NOP
NOP
NOP
NOP
NOP
DJNZ R6,D52
DJNZ R7,D51
RET
DELAY10MS: ;延时10毫秒
MOV R7,#7
D53: MOV R6,#200
D54:
NOP
NOP
NOP
DJNZ R6,D54
DJNZ R7,D53
RET
DELAY500US:
MOV R6,#250
DJNZ R6,$
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 + -