📄 sz617.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 ;显示标识
KEY1FLAG BIT P3.2
KEY2FLAG BIT P3.3
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;初始时显示"时,分"
MOV KEY1FLAG,#01H
MOV KEY2FLAG,#02H
CLR LS164_AB
CLR LS164_CLK
MOV TMOD,#01H ; 方式1
MOV TH0,#0H ;初值
MOV TL0,#0H
MOV MSCNT,#15
SETB EA
SETB ET0
SETB TR0
MOV MINUTEBUF1,#1
LOOP:
LCALL DISP
AJMP LOOP
TIMER0:
PUSH PSW
PUSH ACC
SETB PSW.3 ; 去掉后闪烁明显 ?
MOV TH0,#0H
MOV TL0,#0H
MOV A,MSCNT
DEC A
MOV MSCNT,A
JNZ RET1
; 微调
CLR EA
MOV TH0,#0H
MOV TL0,#0H
SETB EA
MOV MSCNT,#14
; 秒走
MOV A, SECONDBUF
CJNE A, #59,SADD1
MOV SECONDBUF, #0
; 分走
MOV A, MINUTEBUF
CJNE A, #59,MADD1
MOV MINUTEBUF, #0
; 小时走
MOV A, HOURBUF
CJNE A, #23,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 A,HOURBUF
XRL A,HOURBUF1
JNZ RET2
MOV A,MINUTEBUF
XRL A,MINUTEBUF1
JNZ RET2
CLR BEEP
RET2:
POP ACC
RET3:
POP ACC
POP PSW
RETI
; **********************************************************************
; 键盘扫描子程序
; KEY1FLAG -- KEY1 按下标识
; KEY2FLAG -- KEY2 按下标识
; K1 -- KEY1 相关子程序
; K2 -- KEY2 相关子程序
; **********************************************************************
KEYINPUT:
JB KEY1FLAG,IFKEY1UP
JB KEY2FLAG,JMPIFKEY2UP
K1: JB KEY1,K2
LCALL DELAY10US
JB KEY1,K2
LCALL DELAY10US
; 蜂鸣器停止
JB BEEP,K1S
SETB BEEP
JMP KRET1
K1S:
MOV A,DISPFLAG
CJNE A,#1,CLRSECONDBUF
AJMP KEYRET
CLRSECONDBUF:
CJNE A,#2,DISPFLAGADD
MOV SECONDBUF,#0
AJMP KRET1
DISPFLAGADD:
ADD A,#3
MOV DISPFLAG,A
SETB KEY1FLAG
CJNE A,#15H,KRET1
MOV DISPFLAG,#0
AJMP KRET1
IFKEY1UP: ; KEY1 是否松开
JNB KEY1,KRET1
LCALL DELAY10US
JNB KEY1,KRET1
LCALL DELAY10US
CLR KEY1FLAG
K2:
JB KEY2,KRET1
LCALL DELAY10US
JB KEY2,KRET1
LCALL DELAY10US
MOV A,DISPFLAG
AJMP K2S
KRET1:
LJMP KEYRET
JMPIFKEY2UP:
LJMP IFKEY2UP
K2S: CJNE A,#0,DISP1
ADD A,#1
MOV DISPFLAG,A
SETB KEY2FLAG
AJMP KEYRET
;显示日期
DISP1: CJNE A,#1,DISP2
ADD A,#1
MOV DISPFLAG,A
SETB KEY2FLAG
AJMP KEYRET
;显示秒
DISP2: CJNE A,#2,MONADD1
MOV A,#0
MOV DISPFLAG,A
SETB KEY2FLAG
AJMP 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
AJMP KEYRET
IFKEY2UP: ; KEY2 是否松开
JNB KEY2,KEYRET
LCALL DELAY10US
JNB KEY2,KEYRET
LCALL DELAY10US
CLR KEY2FLAG
KEYRET:
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
; **********************************************************************
; 显示缓冲更新子程序
; **********************************************************************
UPDATEDISPBUF:
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:;选通数码管2
CLR LED2
SETB LED1
SETB LED3
SETB LED4
RET
SELECT_LED3:;选通数码管3
CLR LED3
SETB LED1
SETB LED2
SETB LED4
RET
SELECT_LED4:;选通数码管4
CLR LED4
SETB LED1
SETB LED2
SETB LED3
RET
GET_LED234: ;查表数码管234
MOV DPTR,#SAG_LED234
MOV A,@R0
MOVC A,@A+DPTR
RET
GET_LED1: ;查表数码管1
MOV DPTR,#SAG_LED1
MOV A,@R0
MOVC A,@A+DPTR
RET
; **********************************************************************
; 四位数码管显示子程序
; DISPFLAG -- 显示选择标识
; **********************************************************************
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
DELAY10MS: ;延时10毫秒
MOV R7,#10
D53: MOV R6,#200
D54:
NOP
NOP
NOP
NOP
NOP
DJNZ R6,D54
DJNZ R7,D53
RET
DELAY10US: ;延时10纳秒
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 + -