?? 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 + -