⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cj.asm

📁 基于单片机的汇编语言
💻 ASM
📖 第 1 页 / 共 2 页
字号:
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 + -