swatch.asm

来自「十五个关于AT89S51的源代码」· 汇编 代码 · 共 67 行

ASM
67
字号
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;实例六:秒表  stopwatch  (《51单片机应用从零开始》 4.3小节实例)
;
;现象:当按下按钮S7时,秒表开始从00计时,最大计时为99秒
;
;作者:杨欣,刘长焕,张延强  电路飞翔网    eedesign@163.com
;
;				http://www.circuitfly.com
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


		ORG		00H
START:				;这是系统启动时,显示00和等待按钮按下的程序
		MOV		P2,#0F0H		; 两位七段数码管显示"00"
		MOV		P0,#03H			; 选通低两位七段数码管D1和D2
		JB		P2.4,$			; 没有键按下则重复执行本行,一旦按下,执行下一行
		CALL		FILTER			; 调延时子程序,消除开关的抖动
		JNB		P2.4,$			; 如果没有放开按钮,则等待,放开后执行下一行
		MOV		R0,#00H			; 设置计时指针初始值
		MOV		R3,#00H			; 

PRESS_1:			;这是秒表计时显示和1秒延时的程序
		MOV		A,R0			; 将计时指针载入累加器ACC中
		
		MOV		R5,#10			; 为延时1秒设定的寄存器初始值
ADD_1:			
		MOV		R6,#200			; 为延时设定寄存器
		CALL		DELAY			; 调延时子程序,其中DELAY中判断按钮是否第二次被按下
		DJNZ		R5,ADD_1		; 寄存器R5完成1秒延时
		MOV		A,R0			; 指针传递到ACC中
		ADD		A,#01H			; 计时值加1
		DA		A			; 十进制调整
		MOV		R0,A			; 把更新的计时值返回计时指针
		JMP		PRESS_1			; 跳回PRESS_1,继续计时动作

DELAY:		 		
 		MOV		R7,#248			; 设置延时使用的寄存器R7,本段延时0.5ms
		CJNE		R3, #1, DIS1		; 如果R3不等于1,就跳到DIS1执行
		MOV		A, R0			; ACC=R0
		MOV		P0, #01H		; 选通七段数码管D1
		ANL		A, #0FH			; ACC的高位去掉
		MOV		P2, A			; 从P2口输出低位数据
		MOV		R3, #0			; R3=0
		JMP		NEXT			; 跳到NEXT
DIS1:
		MOV		A, R0			; ACC=R0
		MOV		P0, #02H		; 选通七段数码管D2
		SWAP		A			; ACC的高、低位交换
		ANL		A, #0FH			; 去掉高位
		MOV		P2, A			; 从P2口输出
		MOV		R3, #1			; R3=1
NEXT:
		DJNZ		R7,$
		DJNZ		R6,DELAY
		RET					; 延时子程序返回主程序

FILTER:				;消除抖动,30ms延时子程序
		MOV		R6,#60
D1:
		MOV		R7,#248
		DJNZ		R7,$
		DJNZ		R6,D1
		RET					; 过滤子程序返回主程序
		END					; 程序结束点

⌨️ 快捷键说明

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