📄 ttn.asm
字号:
;----------------------------------------------------------
;带计时功能秒表
;----------------------------------------------------------
SDATA BIT P1.4 ;定义74LS164串行移位数据端
SCLK BIT P1.5 ;定义74LS164串行移位时钟端
DIS EQU P1
SW1 EQU P3.2 ;INT0口
SW2 EQU P3.3 ;INT1口
SW3 EQU P3.4 ;T0口
SW4 EQU P3.5 ;T1口
FLAG EQU 32H
MU EQU 33H ;控制蜂鸣器发声速度
MS EQU 10H ;定义50ms计数器
Secs EQU 11H ;定义秒计数器
Minute EQU 12H ;定义分钟计数器
Hour EQU 13H ;定义时计数器
;----------------------------------------------------------
ORG 0000H
LJMP Main
ORG 000BH
LJMP INT_T0
;------------------主程序及初始化模块----------------------
Main: MOV SP,#60H ;设置堆栈指针
MOV IE,#10000010B ;允许T0中断
MOV TMOD,#01H ;T0定时方式1
MOV TL0,#0F0H ;T0定时10ms
MOV TH0,#0D8H
CLR TR0
MOV MS,#100 ;100*10ms=1s
MOV Secs,#0
MOV Minute,#0
MOV Hour,#12H
MOV 44H,#10H ;进入计时状态显示----
MOV 45H,#10H
MOV 46H,#10H
MOV 47H,#10H
MOV MU,#5 ;控制蜂鸣器发声速度
MOV FLAG,#0
MOV R5,#12
MOV R1,#34H
LCALL Clear
SETB TR0
LOOP: MOV R1,#Minute
LCALL Split ;调用拆分子程序
MOV B,#14H
LCALL DISP
LCALL Verify ;校对时间
LCALL count
LJMP LOOP
;-------------------清除计时单元模块---------------------------
Clear: PUSH ACC
CLR A ;清除计时单元以及计时结果单元
Clear1:MOV @R1,A
INC R1
DJNZ R5,Clear1
POP ACC
RET
;------------校时校分模块----------------------------------
Verify:JB SW4,VLP3 ;判断是否需要校"分"
CLR TR0
VLP1: MOV A,Minute ;SW4闭合时,对分钟加1
ADD A,#1
DA A
MOV Minute,A
CJNE A,#60H,VLP2
MOV Minute,#0
VLP2: MOV R6,#40
MOV R1,#Minute
LCALL Split
MOV B,#14H
LCALL DISP
DJNZ R6,$-3
JNB SW4,VLP1 ;SW4未释放,继续对分钟加1
MOV Secs,#0 ;校时期间,将秒清零
SETB TR0
RET
;----------------------------------------------------------
VLP3: JB SW3,VExit ;判断是否需要校"时"
CLR TR0
VLP4: MOV A,Hour ;SW3闭合时,对小时加1
ADD A,#1
DA A
MOV Hour,A
CJNE A,#24H,VLP5
MOV Hour,#0
VLP5: MOV R6,#40
MOV R1,#Minute
LCALL Split
MOV B,#14H
LCALL DISP
DJNZ R6,$-3
JNB SW3,VLP4 ;SW3未释放,继续对小时加1
MOV Secs,#0 ;校时期间,将秒清零
SETB TR0
VExit: RET
;------------------split模块------------------------------
Split:MOV R0,#14H ;分个位显示缓冲单元
MOV A,@R1
ANL A,#0FH ;取分个位
MOV @R0,A
INC R0 ;分十位显示缓冲单元
MOV A,@R1
SWAP A
ANL A,#0FH ;取分十位
MOV @R0,A
INC R0 ;时个位显示缓冲单元
INC R1
MOV A,@R1
ANL A,#0FH ;取时个位
MOV @R0,A
INC R0 ;时十位显示缓冲单元
MOV A,@R1
SWAP A
ANL A,#0FH ;取时十位
MOV @R0,A
RET
;-------------------计时器模块------------------------------
count: JNB SW1,CLP0
RET
CLP0: PUSH B ;将B寄存器进栈保护
CLP1: MOV B,#44H ;SW1按下低电位到松开高电位延时处理
LCALL DISP
JB SW1,CLP2
LJMP CLP1
CLP2: MOV B,#44H ;计时主模块
LCALL DISP
LCALL countdisp
LCALL jishi
JNB SW1,CExit
LJMP CLP2
CExit: POP B
CLP3: MOV R1,#Minute ;SW1按下低电位到松开高电位延时处理
LCALL Split
LCALL DISP
JB SW1,RExit
LJMP CLP3
RExit: RET
;-----------------------显示计时结果模块-------------------
countdisp:
JB SW3,LLP1 ;按下SW3显示第一组结果
MOV B,#38H
LCALL DISP
JNB SW3,$-3
RET
LLP1: JB SW4,TTExit ;按下SW4显示第二组结果
MOV B,#3CH
LCALL DISP
JNB SW4,$-3
TTExit: RET
;--------------------计时模块--------------------------
jishi: JNB SW2,Sjishi ;SW1为高电位,直接返回
RET
Sjishi: ;SW1为低电位,开始计时
PUSH PSW
MOV FLAG,#1
CLR PSW.1
CLR PSW.5
LP3: MOV B,#34H ;动态显示计时数据
LCALL DISP
JB PSW.1,LP4
JB SW3,LP4
SETB PSW.1
MOV 38H,34H ;保存第一组计时结果
MOV 39H,35H
MOV 3AH,36H
MOV 3BH,37H
JNB PSW.5,LP4
MOV R5,#4 ;清除计时单元
MOV R1,#34H
LCALL Clear
MOV FLAG,#0 ;*计时结果保存后,将计时标记清除*
SETB P3.7 ;关闭蜂鸣器
SETB SW3
SETB SW4
CLR PSW.1
CLR PSW.5
POP PSW
RET
;----------------------------------------------------------
LP4: JB PSW.5,LP3
JB SW4,LP3
SETB PSW.5
MOV 3CH,34H ;保存第二组计时结果
MOV 3DH,35H
MOV 3EH,36H
MOV 3FH,37H
JNB PSW.1,LP3
MOV R5,#4 ;清除计时单元
MOV R1,#34H
LCALL Clear
MOV FLAG,#0 ;*计时结果保存后,将计时标记清除*
SETB P3.7 ;关闭蜂鸣器
SETB SW3
SETB SW4
CLR PSW.1
CLR PSW.5
POP PSW
RET
;-----------------定时器1中断入口----------------------------
INT_T0: ;定时器中断1,计时加1
PUSH PSW
PUSH ACC
SETB RS0
SETB RS1
MOV TL0,#0F0H
MOV TH0,#0D8H
DJNZ MS,T0_NEXT
MOV MS,#100
MOV A,Secs
INC A
MOV Secs,A
CJNE A,#60,$+3
JC T0_NEXT
MOV Secs,#0
MOV A,Minute
ADD A,#1
DA A
MOV Minute,A
CJNE A,#60H,$+3
JC T0_NEXT
MOV Minute,#0
MOV A,Hour
ADD A,#1
DA A
MOV Hour,A
CJNE A,#24H,$+3
JC T0_NEXT
MOV Hour,#0
T0_NEXT:MOV A,FLAG
CJNE A,#1,$+2
JC T0_EXIT
DJNZ MU,NNEXT
MOV MU,#5
CPL P3.7
NNEXT: MOV R4,#4
MOV R1,#34H
LOOP1: MOV A,@R1
ADD A,#1
DA A
MOV @R1,A
CJNE A,#10H,T0_EXIT
MOV @R1,#0
INC R1
DJNZ R4,LOOP1
T0_EXIT:
POP ACC
POP PSW
RETI
;-----------------显示子程序-------------------------------
DISP: PUSH 00H
MOV R0,B ;显示缓冲区首地址
MOV R2,#11111110B ;对应位的字位码
MOV DPTR,#WordTab ;送字形表首地址
DISP1:ORL DIS,#00001111B
MOV R3,#30
DJNZ R3,$ ;延时40us
MOV A,@R0 ;取待显示数字
MOVC A,@A+DPTR ;查字形
MOV 20H,R2 ;取字位码
JB 02H,WordOut ;判断小数点位
SETB ACC.7
WordOut:MOV R3,#8 ;传送字型码到74LS164
NEXTB: RLC A ;取待发送位
MOV SDATA,C ;送数据到数据口
SETB SCLK ;产生时钟
CLR SCLK
DJNZ R3,NEXTB ;继续送下一位
INC R0
MOV A,R2 ;取字位码
ANL DIS,A
LCALL DELAY
MOV A,R2 ;修改字位码
RL A
MOV R2,A
JB ACC.4,DISP1
POP 00H
DExit: RET
;----------------------------------------------------------
WordTab:DB 3FH,06H,5BH,4FH ;"0","1","2","3"
DB 66H,6DH,7DH,07H ;"4","5","6","7"
DB 7FH,6FH,77H,7CH ;"8","9","A","B"
DB 39H,5EH,79H,71H ;"C","D","E","F"
DB 40H,38H ;"-","L"
;----------------------------------------------------------
DELAY: MOV R3,#5 ;延时1ms
MOV R4,#100
DJNZ R4,$
DJNZ R3,$-4
RET
;----------------------------------------------------------
END
;----------------------------------------------------- ----
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -