?? sz612.asm
字號(hào):
LED1 BIT p1.3 ;4位數(shù)碼管選通引腳
LED2 BIT p1.4
LED3 BIT p1.6
LED4 BIT p1.7
LED2DZ BIT P1.5 ;小數(shù)點(diǎn)
LS164_AB BIT p3.0 ;74LS164數(shù)據(jù)線
LS164_CLK BIT p3.1 ;74LS164時(shí)鐘線
KEY1 BIT p3.5 ;按鍵1
KEY2 BIT p3.7 ;按鍵2
DISPFLAG EQU 40H ;顯示標(biāo)識(shí)
DISPBUF EQU 20H
BEEP BIT p1.0
MSCNT EQU 30H ;中斷次數(shù)
SECONDBUF EQU 31H
MINUTEBUF EQU 32H
HOURBUF EQU 33H
MONTHBUF EQU 34H
;DAYDUB EQU 35H
ORG 0000h
JMP START
ORG 000Bh
JMP TIMER0
ORG 0100H
START:
MOV SP,#50H
CLR LED2DZ
CLRDISPBUF: ; 清顯示緩沖區(qū)
MOV R2,#0FH
MOV R0,#DISPBUF+1
CLRDISPBUFLOOP:
MOV @R0,#0H
INC R0
DJNZ R2,CLRDISPBUFLOOP
MOV DISPFLAG,#0 ;初始時(shí)顯示"時(shí),分"
CLR LS164_AB
CLR LS164_CLK
MOV TMOD,#01H ; 方式1
MOV TH0,#0BH ;初值
MOV TL0,#0DCH
MOV MSCNT,#16H
SETB EA
SETB ET0
SETB TR0
LOOP:
LCALL DISP
AJMP LOOP
TIMER0:
PUSH PSW
PUSH ACC
SETB PSW.3
MOV TH0,#0BH
MOV TL0,#0DCH
MOV A,MSCNT
DEC A
MOV MSCNT,A
JNZ RET1
; 微調(diào)
CLR EA
MOV TH0,#0BH
MOV TL0,#0DCH
SETB EA
MOV MSCNT,#16
; 秒走
MOV A, SECONDBUF
CJNE A, #59,SADD1
MOV SECONDBUF, #0
; 分走
MOV A, MINUTEBUF
CJNE A, #59,MADD1
MOV MINUTEBUF, #0
; 小時(shí)走
MOV A, HOURBUF
CJNE A, #23,HADD1
MOV HOURBUF, #0
; MOV A, DAYBUF
; CJNE A, #31,HADD1
; MOV DAYBUF, #0
AJMP RET1
SADD1: ; 秒加1
INC SECONDBUF
AJMP RET1
MADD1: ; 分加1
INC MINUTEBUF
AJMP RET1
HADD1: ; 小時(shí)加1
INC HOURBUF
RET1:
LCALL KEYINPUT
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,KEYRET
K1: JB KEY1,K2
LCALL DELAY10MS
JB KEY1,K2
LCALL DELAY10MS
MOV A,DISPFLAG
ADD A,#3
MOV DISPFLAG,A
SETB F0
WAIT:
JNB KEY1,WAIT
CLR F0
CJNE A,#0FH,KEYRET
MOV DISPFLAG,#0
JMP KEYRET
; CJNE A,#0,IF12
;ADDFLAG: ; DISPFLAG 加
; CJNE A,#0FH,KEYRET
; MOV DISPFLAG,#0
;IF12: ;判斷 DISPFLAG 是否= 1,2
; MOV R4,A
; ANL A,#0FEH ; 1
; JZ KEYRET
; MOV A,R4
; ANL A,#0FDH ; 2
; JZ KEYRET
; MOV A,R4
; JMP ADDFLAG
K2: JB KEY2,KEYRET
LCALL DELAY10MS
JB KEY2,KEYRET
LCALL DELAY10MS
MOV A,DISPFLAG
MONADD1: ; 月加1
CJNE A,#3,DAYADD1
MOV R6, MONTHBUF
CJNE R6,#12,MONADD
MOV MONTHBUF,#0
AJMP KEYRET
MONADD:
INC MONTHBUF
AJMP KEYRET
; INC MONTHBUF
; AJMP KEYRET
; 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
DAYADD1: ; 日加1
; CJNE A,#6,HOURADD1
;
; JMP KEYRET
;HOURADD1: ; 小時(shí)加1
; CJNE A,#9,MINADD1
; JMP KEYRET
;MINADD1: ; 分鐘加1
; CJNE A,#0CH,K2X
; JMP KEYRET
;K2X: ; 顯示日期和秒
; ADD A,#1
; MOV DISPFLAG,A
; CJNE A,#3,KEYRET
; MOV DISPFLAG,#0
KEYRET:
RET
;顯示程序
DISP:
MOV R1,#DISPFLAG
LCALL UPDATEDISPBUF
;初始顯示 "時(shí)間"
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
;顯示 "小時(shí)"
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
UPDATEDISPBUF: ;1秒鐘重新為 "秒,分,小時(shí)" 重新填顯示緩沖
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
RET
SELECT_LED1:;選通數(shù)碼管1
CLR LED1
SETB LED2
SETB LED3
SETB LED4
RET
SELECT_LED2:;選通數(shù)碼管1
CLR LED2
SETB LED1
SETB LED3
SETB LED4
RET
SELECT_LED3:;選通數(shù)碼管1
CLR LED3
SETB LED1
SETB LED2
SETB LED4
RET
SELECT_LED4:;選通數(shù)碼管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: ;延時(shí)20毫秒
MOV R7,#7
D51: MOV R6,#200
D52:
NOP
NOP
NOP
NOP
NOP
DJNZ R6,D52
DJNZ R7,D51
RET
DELAY10MS: ;延時(shí)10毫秒
MOV R7,#80
D53: MOV R6,#200
D54:
NOP
NOP
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
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -