📄 cj.asm
字号:
D05: LCALL DELAY
MOV P1,#0FFH ; close all showing
;Display DS2
MOV P0,R5 ; send character to DS2
MOV A,FLASH_FLAG ; get flag of un-flash/flash
CJNE A,#01H,E02 ; "01" is flash on DS1&DS2
SJMP E03
E02: CJNE A,#04H,E06 ; "04" is flash on DS1&DS2
SJMP E03
E06: CJNE A,#07H,E04
E03: MOV A,TICK_CNT ; take times of overflow
RRC A
JNC E05 ; check bit C ( 1 or 0 )
E04: MOV P1,#0EFH ; turn on DS2
E05: LCALL DELAY
MOV P1,#0FFH ; close all showing
MOV P0,R6 ; send character to DS1
MOV A,FLASH_FLAG ; get flag of un-flash/flash
CJNE A,#01H,F02 ; "01" is flash on DS1&DS2
SJMP F03
F02: CJNE A,#04H,F06 ; "04" is flash on DS1&DS2
SJMP F03
F06: CJNE A,#07H,F04
F03: MOV A,TICK_CNT ; take times of overflow
RRC A
JNC F05 ; check bit C ( 1 or 0 )
F04: MOV P1,#0DFH ; turn on DS1
F05: LCALL DELAY
RET
; ------------------------------------------------------------------- (至此)
D_CNT_2 EQU 2EH
D_CNT_1 EQU 2FH
; ----------------------------------------
; sub: delay (1.542ms for 12MHz, 3.084ms for 6MHz)
DELAY: MOV D_CNT_2,#03H
D_LOOP2: MOV D_CNT_1,#0FFH ;[1]
D_LOOP1: DJNZ D_CNT_1,D_LOOP1 ;[2]
DJNZ D_CNT_2,D_LOOP2 ;[2]
RET
; ----------------------------------------
; ---------------------------------------------------------
;外部中断0
; sub: INT0 interrupt
; 处理按键K0,切换时间/日期显示或者调整时间
EX0_INT: NOP ; switch or adjust with date/time
PUSH PSW
LCALL DIS_DELAY ; re-bounce (with LED display)
JNB P3.3,OUT
CLR P2.0
LCALL DELAY
SETB P2.0
;K0按下
NOP ; inhibit INT1 ( use k0)
SETB P0.7
MOV A,FLASH_FLAG ; take flag of un-flash/flash
CJNE A,#00H,JYY ; "00" is in un-flash
;00H:切换显示
MOV A,R7 ; take flag of shift(date/time)
ADD A,#01H ; flag 修改R7 0,1,2
CJNE A,#04H,GO1
MOV A,#00H
GO1: MOV R7,A ; save back flag
LCALL DISPLAY ; LED display
;INT1: no Key Press
OUT: LJMP EX0_RET ; return
;-------------------------------------------------------
JYY: NOP ; "01 to 06" is in flash
CJNE A,#01H,JMM ; "01" for adjusting "year"
;调节年
MOV A,YEAR_BCD ; take BCD of "year"
CJNE A,#99H,YY0 ; is up to 99 year ?
MOV YEAR_BCD,#00H ; keep the first year
LJMP YYF
YY0: ADD A,#01H ; increase "year"
DA A ; adjust BCD
MOV YEAR_BCD,A ; keep "year"
YYF: LJMP EX0_RET
;---------------------------------------
JMM: CJNE A,#02H,JDD ; "02" for adjusting "month"
;调节月
MOV A,MONTH_BCD ; take BCD of "month"
CJNE A,#12H,MM0 ; is December ?
MOV MONTH_BCD,#01H ; keep the first month
LJMP MMF
MM0: ADD A,#01H ; increase "month"
DA A ; adjust BCD
MOV MONTH_BCD,A ; keep "month"
MMF: LJMP EX0_RET
JDD: CJNE A,#03H,AA1 ; "03" for adjusting "day"
LJMP BB1
AA1: LJMP ADH ;
BB1: MOV A,MONTH_BCD ; first, should take "month"
CJNE A,#02H,NFB ; is February ?
IFB: NOP
ACALL BCD_DIV4 ; BCD of "year in YEAR_BCD" divided by 4
MOV A,R3 ; remainder in R3
CJNE A,#00H,ANG ; "00" means leap year
ARN: MOV A,DAY_BCD ; take BCD of "day"
CJNE A,#29H,D0A ; is up to 29 days in Feb.?
LJMP D0B
D0A: LJMP DDA
D0B: LJMP DD1
ANG: MOV A,DAY_BCD ; take BCD of "day"
CJNE A,#28H,D0A ; is up to 28 days in Feb.?
LJMP DD1
NFB: NOP ; check "little/large" month
CJNE A,#04H,Y04 ; is April ?
LJMP AD1
Y04: CJNE A,#06H,Y05 ; is June ?
LJMP AD1
Y05: CJNE A,#09H,Y06 ; is September ?
LJMP AD1
Y06: CJNE A,#11H,Y07 ; is November ?
LJMP AD1
Y07: NOP ; for "large" month
MOV A,DAY_BCD ; take BCD of "day"
CJNE A,#31H,D0A ; is up to 31 days ?
LJMP DD1
AD1: NOP ; for "little" month
MOV A,DAY_BCD ; take BCD of "day"
CJNE A,#30H,D0A ; is up to 30 days ?
DD1: MOV DAY_BCD,#01H ; keep the first day
LJMP DDF
DDA: ADD A,#01H ; increase "day"
DA A ; adjust BCD
MOV DAY_BCD,A ; keep "day"
DDF: LJMP EX0_RET
;---------------------------------------------------
ADH: CJNE A,#04H,ADM ; "04" for adjusting "hour" 调整时间
MOV A,HOUR_BCD ; take BCD of "hour"
CJNE A,#23H,JH0 ; is up to 23 hours ?
MOV HOUR_BCD,#00H ; keep the first hour
LJMP JHF
JH0: ADD A,#01H ; increase "hour"
DA A ; adjust BCD
MOV HOUR_BCD,A ; keep "hour"
JHF: LJMP EX0_RET
;-----------------------------------------
ADM: CJNE A,#05H,ADS ; "05" for adjusting "minute"
MOV A,MINUTE_BCD ; take BCD of "minute"
CJNE A,#59H,JM0 ; is up to 59 minutes ?
MOV MINUTE_BCD,#00H ; keep the first minute
LJMP JMF
JM0: ADD A,#01H ; increase "minute"
DA A ; adjust BCD
MOV MINUTE_BCD,A ; keep "minute"
JMF: LJMP EX0_RET
ADS: CJNE A,#06H,AlARMH
MOV A,SECOND_BCD ; take BCD of "second"
CJNE A,#59H,JS0 ; is up to 59 seconds ?
MOV SECOND_BCD,#00H ; keep the first second
LJMP JSF
JS0: ADD A,#01H ; increase "second"
DA A ; adjust BCD
MOV SECOND_BCD,A ; keep "second"
JSF: LJMP EX0_RET
AlARMH: CJNE A,#07H,AADM ; "07" for adjusting "hour" 调整闹钟时间(修改)
MOV A,AHOUR ; take BCD of "hour"
CJNE A,#23H,AJH0 ; is up to 23 hours ?
MOV AHOUR,#00H ; keep the first hour
LJMP AJHF
AJH0: ADD A,#01H ; increase "hour"
DA A ; adjust BCD
MOV AHOUR,A ; keep "hour"
AJHF: LJMP EX0_RET
;-----------------------------------------
AADM: CJNE A,#08H,AADS ; "05" for adjusting "minute"
MOV A,AMIN ; take BCD of "minute"
CJNE A,#59H,AJM0 ; is up to 59 minutes ?
MOV AMIN,#00H ; keep the first minute
LJMP AJMF
AJM0: ADD A,#01H ; increase "minute"
DA A ; adjust BCD
MOV AMIN,A ; keep "minute"
AJMF: LJMP EX0_RET
AADS:
MOV A,ASCON ; take BCD of "second"
CJNE A,#59H,AJS0 ; is up to 59 seconds ?
MOV ASCON,#00H ; keep the first second
LJMP AJSF
AJS0: ADD A,#01H ; increase "second"
DA A ; adjust BCD
MOV ASCON,A ; keep "second"
AJSF:
NOP
EX0_RET: NOP
POP PSW
RETI
;--------------------------------------------------------- (修改至此)
; ------------------------------------
; sub: INT1 interrupt
; 处理按键K1,设置闪烁
EX1_INT: NOP ; revise flag(00 to 06) in FLASH_FLAG
PUSH PSW
LCALL DIS_DELAY ; re-bounce (with LED display)
JNB P3.2, NOTE2 ; check port INT0
;;K1按键按下
NOP ; inhibit INT0 (use k1)
MOV A,R7 ; take flag of shift
CJNE A,#00H,DIS_DATE ; "R7=00" for showing time
;显示时间
MOV A,FLASH_FLAG ; take flag of un-flash/flash
CJNE A,#00H,ED2 ; "00" is in all un-flash
MOV FLASH_FLAG,#04H ; keep flag of flash on DS1&DS2
SJMP EX1_RET
ED2: CJNE A,#06H,ED1 ; "06" is in flash on DS5&DS6
;reach 06H
MOV FLASH_FLAG,#00H ; Reset flag of all un-flash
SJMP EX1_RET
;显示日期
DIS_DATE: CJNE A,#01H,DIS_ALARM
NOP ; "R7=FF" for showing date
MOV A,FLASH_FLAG ; take flag of un-flash/flash
CJNE A,#03H,ED1 ; "03" is in flash on DS5&DS6
;== 03H
MOV FLASH_FLAG,#00H ; keep flag of all un-flash
NOTE2: SJMP EX1_RET
;显示闹钟
DIS_ALARM: CJNE A,#02H,MCON
MOV A,FLASH_FLAG ; take flag of un-flash/flash
CJNE A,#00H,AED2 ; "00" is in all un-flash
MOV FLASH_FLAG,#07H ; keep flag of flash on DS1&DS2
SJMP EX1_RET
AED2: CJNE A,#09H,ED1 ; "06" is in flash on DS5&DS6
;reach 06H
MOV FLASH_FLAG,#00H ; Reset flag of all un-flash
SJMP EX1_RET
;标志加1,
ED1: ADD A,#01H
DA A ; increase flag of flash
MOV FLASH_FLAG,A ; keep flag of flash
NOP
LJMP EX1_RET
MCON:
CJNE A,#0AH,MCON1
MOV A,#0BH
MOV FLASH_FLAG,A
NOTE1: MOV MMIN,#00H
MOV MSCON,#00H
MOV MSS,#00H
SJMP MCON2
MCON1: MOV FLASH_FLAG,#00H
MOV A,SECOND_BCD
ADD A,MSCON
DA A
MOV SECOND_BCD,A
SUBB A,#60H
JC MCON3
MOV SECOND_BCD,A
MCON3: CPL C
MOV A,MINUTE_BCD
ADDC A,MMIN
DA A
MOV MINUTE_BCD,A
SUBB A,#60H
JC MCON4
MOV MINUTE_BCD,A
MCON4: CPL C
MOV A,HOUR_BCD
ADDC A,#00H
DA A
MOV HOUR_BCD,A
MCON2: MOV A,MFLAG
XRL A,#0FFH
MOV MFLAG,A
EX1_RET: NOP
POP PSW
RETI
;------------------------------------
D_CNT_DIS EQU 30H
; ---------------------------------------------
; sub: de-bounce of key
; 显示延迟
DIS_DELAY: MOV D_CNT_DIS,#09H ; or(#0BH)
DELAY_LOOP: LCALL DISPLAY ; with LED display
DJNZ D_CNT_DIS,DELAY_LOOP
RET
; -----------------------------------------------
; ----------------------------------------------------------
; sub: BCD division
; BCD除法:除4
; 输出:
; R3: 余数
; R2: 商
BCD_DIV4: MOV R0,YEAR_BCD ; dividend in BCD
MOV R1,#04H ; divider in BCD
MOV R2,#00H ; R2:输出商
MOV A,R1
CPL A
ADD A,#9BH
MOV R1,A ; R1:BCD补码
MOV A,R0
ANL A,#0F0H ; BCD高位
SWAP A
LP0: MOV R3,A ; BCD码的余数
ADD A,R1
DA A
JNC LP1
INC R2
SJMP LP0
LP1: MOV A,R3
SWAP A
MOV R3,A
MOV A,R2
SWAP A
MOV R2,A ; 商的高位
MOV A,R0
ANL A,#0FH ; 年BCD的低位
ORL A,R3
LP2: MOV R3,A
ADD A,R1
DA A
JNC LP3
INC R2
SJMP LP2
LP3: NOP ; no rounding
RET
;----------------------------------------------
; ------------------------------------------------------
; code table
TAB: DB 0c0H ; for "0"
DB 0f9H ; for "1"
DB 0a4H ; for "2"
DB 0b0H ; for "3"
DB 99H ; for "4"
DB 92H ; for "5"
DB 82H ; for "6"
DB 0f8H ; for "7"
DB 80H ; for "8"
DB 90H ; for "9"
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -