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 + -
显示快捷键?