?? 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 + -