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

📄 exp2.asm

📁 能显示时间
💻 ASM
字号:
ORG 0000H
AJMP MAIN
ORG 001BH
AJMP TIME
ORG 000BH
LJMP TIMER2
ORG 0030H
MAIN:	MOV SP,#6AH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	MOV R0,#40H	;建立译码器对应查找表
	MOV @R0,#3FH	;0
	INC R0
	MOV @R0,#06H	;1
	INC R0
	MOV @R0,#5BH	;2
	INC R0
	MOV @R0,#4FH	;3
	INC R0
	MOV @R0,#66H	;4
	INC R0
	MOV @R0,#6DH	;5
	INC R0
	MOV @R0,#7DH	;6
	INC R0
	MOV @R0,#07H	;7
	INC R0
	MOV @R0,#7FH	;8
	INC R0
	MOV @R0,#6FH	;9
	INC R0
	MOV @R0,#00H	;无
	INC R0
	MOV @R0,#40H	;-
	INC R0
	MOV @R0,#08H	;_
;
	CLR A
	;变量初始化:
	MOV 20H,#28H	;时钟频率
	MOV 21H,#1DH	;日期错位次数
	MOV 30H,#15H	;分别存放:时,分,秒
	MOV 31H,#29H
	MOV 32H,#00H
	MOV 36H,#14H	;分别存放:年,月,日
	MOV 35H,#02H
	MOV 34H,#08H
	MOV 33H,#20H
	MOV 38H,#01H	;分别存放显示内容,在38位显示39的内容
	MOV 39H,#4AH
	MOV 3AH,#00H	;记录按键号码
	MOV 3BH,#00H	;记录时间是否到达5分钟
	MOV 3CH,#00H	;记录时间是否到达250毫秒
;
	ACALL DATPUT

	;开启计时器:
	MOV TMOD,#11H
	SETB ET1
	SETB EA
	MOV IP,#08H	;中断优先级控制,计时器1为高优先级
	MOV TH1,#0A6H
	MOV TL1,#00H
	SETB TR1
	SETB ET0
	MOV TH0,#0F4H
	MOV TL0,#00H
	SETB TR0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	SJMP $
JMAIN:	
	MOV R2,#0FFH	;延时
WTEMP:	MOV R1,#0FFH
TEMP:	DJNZ R1,TEMP
	DJNZ R2,WTEMP

	;是否为5分钟
	MOV A,3BH	;检查是否到达5分钟整
	JZ NFIVMN
	AJMP FIVMN
NFIVMN:	ACALL KEY	;调用按键检测程序
	ACALL KPRO	;调用按键处理程序
	AJMP ENDJM
FIVMN:	ACALL XCHDAT	;调用日期交换显示程序
ENDJM:	AJMP JMAIN

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;计时器1中断服务程序,提供基准时间
TIME:	PUSH PSW	
	PUSH ACC
	MOV TH1,#0A6H
	MOV TL1,#00H
	MOV A,20H
	SUBB A,#14H
	JZ FOMINI
TMAIN:	DJNZ 20H,RETUNT
	MOV 20H,#28H
	MOV A,#01H
	ADD A,32H
	DA A
	MOV 32H,A
	CJNE A,#60H,RETUNT
	MOV 32H,#00H
	MOV A,#01H
	ADD A,31H
	DA A
	MOV 31H,A
	ACALL FIV	;分改变时,检查一次是否到了整5分钟
	CJNE A,#60H,RETUNT
	MOV 31H,#00H
	MOV A,#01H
	ADD A,30H
	DA A
	MOV 30H,A
	CJNE A,#24H,RETUNT
	MOV 30H,#00H
RETUNT:	POP ACC
	POP PSW
	RETI
FOMINI:	MOV A,#01H
	MOV 3CH,A
	AJMP TMAIN


;计时器2,扫描显示控制
TIMER2:	PUSH PSW
	PUSH ACC
	MOV TH0,#0F4H	
	MOV TL0,#00H
	MOV A,3BH
	JNZ DSP
	ACALL TDSP
	AJMP T2RE
DSP:	MOV A,21H
	JNZ DSPOK
	AJMP T2RE
DSPOK:	ACALL DDSP
T2RE:	POP ACC
	POP PSW
	RETI


;显示时间函数,在计时器0中调用
TDSP:	PUSH ACC
	MOV A,38H	
	INC A
	CJNE A,#09H,TREL
	MOV A,#01H
TREL:	MOV 38H,A
	DEC A
	JZ T01
	DEC A
	JZ T02
	DEC A
	JZ T03
	DEC A
	JZ T04
	DEC A
	JZ T05
	DEC A
	JZ T06
	DEC A
	JZ T07
	DEC A
	JZ T08
T01:	MOV A,#0FH
	ANL A,32H
	AJMP RTT2
T02:	MOV A,#0F0H
	ANL A,32H
	SWAP A
	AJMP RTT2
T03:	MOV A,#0BH
	AJMP RTT2
T04:	MOV A,#0FH
	ANL A,31H
	AJMP RTT2
T05:	MOV A,#0F0H
	ANL A,31H
	SWAP A
	AJMP RTT2
T06:	MOV A,#0BH
	AJMP RTT2
T07:	MOV A,#0FH
	ANL A,30H
	AJMP RTT2
T08:	MOV A,#0F0H
	ANL A,30H
	SWAP A
	AJMP RTT2
RTT2:	MOV 39H,A
	ACALL DPLAY
	POP ACC
	RET


;显示日期函数,在计时器0中调用
DDSP:	PUSH ACC
	MOV A,38H	
	INC A
	CJNE A,#09H,DREL
	MOV A,#01H
DREL:	MOV 38H,A
	DEC A
	JZ D01
	DEC A
	JZ D02
	DEC A
	JZ D03
	DEC A
	JZ D04
	DEC A
	JZ D05
	DEC A
	JZ D06
	DEC A
	JZ D07
	DEC A
	JZ D08
D01:	MOV A,#0FH
	ANL A,53H
	AJMP RTT2
D02:	MOV A,#0F0H
	ANL A,53H
	SWAP A
	AJMP RTT2
D03:	MOV A,#0FH
	ANL A,52H
	AJMP RTT2
D04:	MOV A,#0F0H
	ANL A,52H
	SWAP A
	AJMP RTT2
D05:	MOV A,#0FH
	ANL A,51H
	AJMP RTT2
D06:	MOV A,#0F0H
	ANL A,51H
	SWAP A
	AJMP RTT2
D07:	MOV A,#0FH
	ANL A,50H
	AJMP RTT2
D08:	MOV A,#0F0H
	ANL A,50H
	SWAP A
	AJMP RDD2
RDD2:	MOV 39H,A
	ACALL DPLAY
	POP ACC
	RET



;显示函数,将39里的内容显示到数码管第38位
DPLAY:	MOV R0,38H
	CLR A
	SETB CY
LOOPC:	RLC A
	DJNZ R0,LOOPC
	MOV DPTR,#8000H
	MOVX @DPTR,A
	MOV A,39H
	ADD A,#40H
	MOV R0,A
	MOV A,@R0
	MOV DPTR,#9000H
	MOVX @DPTR,A
	CLR CY
	RET

;检查是否为5分钟:
FIV:	PUSH ACC
	MOV A,31H
	ANL A,#0FH
	JNZ NZERO
	AJMP FIVM
NZERO:	CJNE A,#05H,NFIVM
FIVM:	MOV A,#01H
	MOV 3BH,A
	ACALL DATPUT	;每五分钟重新装载日期一次
	MOV A,#1DH
	MOV 21H,A
	AJMP ENDFIV
NFIVM:	MOV A,#00H
	MOV 3BH,#00H
ENDFIV:	POP ACC
	RET



KEY:	ACALL KEYCH	;调用查键子程序
	JNZ DSHAKE
	AJMP KEND
DSHAKE:	ACALL DELAY	;消抖子程序调用延时子程序	
	ACALL KEYCH
	JNZ SCAN
	AJMP KEND
;扫描查键
SCAN:	MOV R6,#01H	;将第0行置一
	MOV R7,#00H	;从第0号开始检查
SCAN1:	MOV DPTR,#8000H
	MOV A,R6
	MOVX @DPTR,A
	MOVX A,@DPTR
	JNB ACC.0,LONE
	MOV A,#00H
	AJMP LKP
LONE:	JNB ACC.1,LTWO
	MOV A,#01H
	AJMP LKP
LTWO:	JNB ACC.2,LTHR
	MOV A,#02H
	AJMP LKP
LTHR:	JNB ACC.3,NEXT
	MOV A,#03H
LKP:	ADD A,R7
	PUSH ACC
SCAN2:	ACALL KEYCH
	JNZ SCAN2
	POP ACC
	AJMP SCANED
NEXT:	INC R7
	INC R7
	INC R7
	INC R7
	MOV A,R6
	JB ACC.3,KEND
	RL A
	MOV R6,A
	AJMP SCAN1
SCANED:	INC A
	MOV 3AH,A
	RET
KEND:	MOV 3AH,#0H
	RET

KEYCH:	MOV DPTR,#8000H	;查询按键是否改变子程序,将改变的列置1
	MOV A,#0FH
	MOVX @DPTR,A
	MOVX A,@DPTR
	ANL A,#0FH
	RET

DELAY:	MOV R2,#20H	;延时程序,按键消抖用
DELAY2:	MOV R1,#0FFH
DELAY3:	DJNZ R1,DELAY3
	DJNZ R2,DELAY2
	RET


;按键处理程序
KPRO:	MOV A,3AH
	JZ KPEND
	DEC A
	JZ K1
	DEC A
	JZ K2
KPEND:	RET
K1:	MOV A,30H	;时增1
	INC A
	DA A
	MOV 30H,A
	SUBB A,#24H
	JNZ HOK
	MOV A,#00H
	MOV 30H,A
HOK:	AJMP KPEND
	
K2:	MOV A,31H	;分增1
	INC A
	DA A
	MOV 31H,A
	SUBB A,#60H
	JNZ MOK
	MOV A,#00H
	MOV 31H,A
MOK:	AJMP KPEND


;装载日期函数,每五分钟重新装载一次
DATPUT:	MOV 50H,#0AAH
	MOV A,33H
	MOV 51H,A
	MOV A,34H
	MOV 52H,A
	MOV A,35H
	ANL A,#0F0H
	ORL A,#00CH
	SWAP A
	MOV 53H,A
	MOV A,35H
	ANL A,#0FH
	ORL A,#0C0H
	SWAP A
	MOV 54H,A
	MOV A,36H
	MOV 55H,A
	RET


;日期交换显示函数:
XCHDAT:	MOV A,3CH
	JZ ENDXD	;每3CH错位一次
	MOV A,50H
	SWAP A
	MOV 50H,A
	MOV A,51H
	SWAP A
	MOV 51H,A
	MOV A,52H
	SWAP A
	MOV 52H,A
	MOV A,53H
	SWAP A
	MOV 53H,A
	MOV A,54H
	SWAP A
	MOV 54H,A
	MOV A,55H
	SWAP A
	MOV 55H,A

	MOV A,50H
	MOV R1,#51H
	XCHD A,@R1
	MOV 50H,A

	MOV A,51H
	MOV R1,#52H
	XCHD A,@R1
	MOV 51H,A

	MOV A,52H
	MOV R1,#53H
	XCHD A,@R1
	MOV 52H,A

	MOV A,53H
	MOV R1,#54H
	XCHD A,@R1
	MOV 53H,A

	MOV A,54H
	MOV R1,#55H
	XCHD A,@R1
	MOV 54H,A

	MOV A,21H
	DEC A
	MOV 21H,A
	JNZ ENDXD
	MOV A,#00H
	MOV 3BH,A
ENDXD:	CLR A
	MOV 3CH,A
	RET




END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -