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

📄 time.asm

📁 在单片机教学实验仪的MCU#3上的8位数码管上显示一个只有分和秒的时钟
💻 ASM
字号:
;****************************************************************
;*程序功能:在单片机教学实验仪的MCU#3上的8位数码管上		*
;*显示一个只有分和秒的时钟,采用中断方式			*
;****************************************************************
	ORG	0000H
	JMP	MAIN
	ORG	000BH		;T0的中断入口地址
	JMP	T0_SER

	DISBUF	EQU	30H	;定义一个8个成员的数组(38H-30H)
	POSIT	EQU	38H	;定义一个变量,用来指示显示时的数码管的位选
	SEC	EQU	39H	;定义一个变量,用来存放时钟的秒变量
	MIN	EQU	3AH	;定义一个变量,用来存放时钟的分变量
	COUNT	EQU	3BH	;定义一个变量,用来对定时时间进行计数
	PROTECT	EQU	3CH	;用于保护中断时,A中的内容

	ORG	0030H
MAIN:
	MOV	SEC,#0		
	MOV	MIN,#0
	MOV	DISBUF,#0	;初始化显示状态
	MOV	DISBUF+1,#0
	MOV	DISBUF+2,#10H	;显示 -
	MOV	DISBUF+3,#0
	MOV	DISBUF+4,#0
	MOV	DISBUF+5,#11H	;消隐
	MOV	DISBUF+6,#11H
	MOV	DISBUF+7,#11H
	MOV	TMOD,#01H	;用T0的方式1
	MOV	TH0,#80H	;赋初值		说明:本程序中的初值不准
	MOV	TL0,#00H
	SETB	ET0		;T0中断允许
	SETB	EA		;开总中断
	SETB	TR0		;启动T0
LOOPM:
	CALL	DIGT_CH		;调用数字拆分程序,将SEC和MIN分成十位和个位,以便于显示
	CALL	DISPLAY		;调用显示程序
	JMP	LOOPM

;==================================
;8路数码管驱动
DISPLAY:
	MOV	POSIT,#01H	;用于指示数码管位选,初始化为第一个数码管亮
	MOV	R1,#08H		;用于指示程序循环,8个数码管每个送一次数后,本子程序结束
	MOV	DPTR,#DISCODE	;指向数码管的码表
	MOV	R0,#DISBUF	;指向显示数组
DISLOOP:			;为方便起见,只将第一个数码管的执行过程讲明,其余依次类推
	MOV	A,@R0		;当R0=#DISBUF时,通过间接寻址将DISBUF中的内容放入A中
	MOVC	A,@A+DPTR	;通过查表,A为地址偏移量,找出A中的数所对应的码值(即段码),还放在A中
	MOV	P0,A		;将A中的数送至P0端口,单此时并未送至数码管
	SETB	P1.3		;使能573锁存器,此时,段码才送至数码管的段选端
	CLR	P1.3		;关闭573锁存器,此时,数据锁存在数码管的段选端
	MOV	P0,POSIT	;送位选至P0,以便指示哪一个数码管亮
	SETB	P1.2		;使能573锁存器,此时,位选信号才送至数码管的位选端,相应的数码管亮
	CLR	P1.2		;关闭573锁存器,此时,数据锁存在数码管的位选端
	CALL	DELAY		;使相应数码管亮一段时间
	MOV	P0,#00H		;送位选为00至P0口,即关闭所有的数码管,一产生消隐作用,避免数码管上产生重影现象
	SETB	P1.2
	CLR	P1.2
	MOV	A,POSIT		;当一个数码管完成显示后,对位选进行移位操作,以便为下一个数码管
	RL	A		;的显示作好准备,此时,位选指向下一个数码管
	MOV	POSIT,A
	INC	R0		;使R0的数自加一,指向下一个要显示的数字,若上一次指向DISBUF,则
	DJNZ	R1,DISLOOP	;本次指向DISBUF+1,并受R1控制,完成8个数在数码管上的显示
	RET			;所以,在使用此显示程序时,只需将欲显示的数字放入对应的DISBUF即可
;================================
DIGT_CH:
	MOV	A,SEC		;将秒拆分成十位和个位
	MOV	B,#10
	DIV	AB
	MOV	DISBUF,B	;送出去显示
	MOV	DISBUF+1,A

	MOV	A,MIN
	MOV	B,#10
	DIV	AB
	MOV	DISBUF+3,B
	MOV	DISBUF+4,A
	RET
;================================
T0_SER:
	MOV	TH0,#80H
	MOV	TL0,#00H
	INC	COUNT
	MOV	PROTECT,A		;对A进行保护
	MOV	A,COUNT
	CJNE	A,#20H,T0_SER_END	;等待一秒时间到
	MOV	COUNT,#0
	
	INC	SEC
	MOV	A,SEC
	CJNE	A,#60,T0_SER_END
	MOV	SEC,#0
	
	INC	MIN
	MOV	A,MIN
	CJNE	A,#60,T0_SER_END
	MOV	MIN,#0
T0_SER_END:
	MOV	PROTECT,A		;恢复现场
	RETI
;================================
DELAY:
	MOV	R3,#0FH
LOOP:	DJNZ	R3,LOOP	
	NOP
	RET
;===================================
;共阳数码管码表
DISCODE:  DB 	0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
	  ;	  0   1     2    3   4   5   6    7   8   9
	  DB	88H,83H,0C6H,0A1H,86H,08EH,0BFH,0FFH,0F7H
          ;	 A   B    C   D    E    F   -         _
	END

⌨️ 快捷键说明

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