?? mcuwatch.asm
字號(hào):
;使用空間:41H~47H,50H~59H,60H~68H
;影響資源:A、R1~R6、ACC
;堆棧需求:4B
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP INTT0
ORG 0030H
MAIN:
MOV SP,#70H ;指針初始化
MOV 20H,#00H ;清20H(位尋址) 00H 鬧鈴默認(rèn)時(shí)間開(kāi)啟位 02H跑表方式開(kāi)啟位
MOV 40H,#00H ;跑表百分之一秒緩存
MOV 41H,#00H ;....十............
MOV 42H,#0AH ;跑表個(gè)位緩存
MOV 43H,#00H ;跑表十位緩存
MOV 44H,#00H ;
MOV 45H,#0AH
MOV 46H,#00H
MOV 47H,#00H
MOV 50H,#00H ;秒個(gè)位緩存
MOV 51H,#00H ;秒十位緩存
MOV 52H,#0AH ;橫杠
MOV 53H,#00H ;分個(gè)位緩存
MOV 54H,#00H ;分十位緩存
MOV 55H,#0AH ;橫杠
MOV 56H,#00H ;時(shí)個(gè)位緩存
MOV 57H,#00H ;時(shí)十位緩存
MOV 58H,#00H ;時(shí)鐘中斷次數(shù)清零
MOV 59H,#00H ;跑表中斷次數(shù)清零
MOV 60H,#00H ;秒個(gè)位緩存
MOV 61H,#00H ;秒十位緩存
MOV 62H,#0AH ;橫杠
MOV 63H,#00H ;分個(gè)位緩存
MOV 64H,#00H ;分十位緩存
MOV 65H,#0AH ;橫杠
MOV 66H,#00H ;時(shí)個(gè)位緩存
MOV 67H,#00H ;時(shí)十位緩存
MOV 68H,#00H ;鬧鈴初值
MOV TMOD,#01H ;選定時(shí)器1
MOV TCON,#00H
MOV TL0,#00H
MOV TH0,#0DCH ;10MS COUNT
SETB EA
SETB ET0 ;溢出中斷
SETB TR0 ;開(kāi)啟定時(shí)器0
CYCLE: ;主時(shí)鐘循環(huán)
LCALL SHOW1 ;時(shí)鐘顯示函數(shù)
LCALL SCAN ;掃描程序函數(shù)
LCALL JUDGE ;主界面按鍵判斷函數(shù)
AJMP CYCLE
SHOW1:
MOV R1,#50H ;指向顯示數(shù)據(jù)首址 R5 YONG R1 YONG
MOV R5,#01H ;掃描控制字初值
PLAY1: MOV DPTR,#8000H
MOV A,R5
MOVX @DPTR,A
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#9000H
MOVX @DPTR,A
LOOP11: LCALL DL1MS
INC R1
MOV A,R5
JB ACC.7,ENDOUT1 ;到達(dá)最高位
LOOP21: RL A
MOV R5,A
MOV DPTR,#9000H
MOV A,#00H
MOVX @DPTR,A
AJMP PLAY1
ENDOUT1: MOV DPTR,#8000H
MOV A,#00H
MOVX @DPTR,A
MOV DPTR,#9000H
MOV A,#00H
MOVX @DPTR,A
RET
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H
DL1MS: MOV 4CH,#14H ;延時(shí)一毫秒函數(shù)
DL1: MOV 4DH,#32H
DL2: DJNZ 4DH,DL2
DJNZ 4CH,DL1
RET
SCAN:
MOV DPTR,#8000H
MOV A,#01H
MOVX @DPTR,A
MOVX A,@DPTR
ANL A,#0FH
MOV R4,A
JNZ KEYIN
RET
KEYIN:
CLR P1.6 ;開(kāi)蜂鳴器
LCALL DELAY5MS ;延時(shí)五毫秒
REKEYIN:
MOVX A,@DPTR ;再次讀按鍵
ANL A,#0FH
XRL A,R4 ;與前一次按鍵值比較
JZ REKEYIN ;按鍵松開(kāi)了嗎?
SETB P1.6 ;關(guān)蜂鳴器
RET
DELAY5MS:
MOV R2,#90 ;消抖延時(shí)程序 R2 YONG R3 YONG
DL5MS:
MOV R3,#50
DJNZ R3,$
DJNZ R2,DL5MS
RET
JUDGE:
CJNE R4,#01H,JUDGE1 ;R4 YONG
AJMP ALARM ;1鍵到鬧鐘設(shè)置
JUDGE1:
CJNE R4,#02H,JUDGE2 ;2鍵到跑表界面
AJMP STOPWATCH
JUDGE2:
CJNE R4,#04H,JUDGE3
AJMP TIMESETTING ;3鍵到時(shí)間設(shè)置
JUDGE3:
MOV R4,#00H
RET
ALARM: ;鬧鐘程序
LCALL DELAY1S ;延時(shí)一秒
LOOP3: ;鬧鈴循環(huán)
LCALL SCAN
LCALL NEXT ;按鍵判斷
LCALL SHOW2 ;鬧鈴時(shí)間顯示
AJMP LOOP3
NEXT:
CJNE R4,#01H,NEXT1
AJMP ADDH ;按1鍵小時(shí)加1
NEXT1:
CJNE R4,#02H,NEXT2
AJMP ADDMM ;按2鍵分加1
NEXT2:
CJNE R4,#04H,NEXT3
AJMP DECIDE ;鬧鐘確定
NEXT3:
CJNE R4,#08H,NEXT4
MOV 60H,#00H
MOV 61H,#00H
MOV 62H,#0AH
MOV 63H,#00H
MOV 64H,#00H
MOV 65H,#0AH
MOV 66H,#00H
MOV 67H,#00H
LJMP CYCLE ;置零返回
NEXT4:RET
DELAY1S: ;延時(shí)1秒函數(shù)
LCALL DL1S1
LCALL DL1S1
RET
DL1S1:MOV R6,#10H
DL1S2:LCALL SHOW2
DJNZ R6,DL1S2
RET
SHOW2: MOV R1,#60H ;指向顯示數(shù)據(jù)首址 R5 YONG R1 YONG
MOV R5,#01H ;掃描控制字初值
PLAY2: MOV DPTR,#8000H
MOV A,R5
MOVX @DPTR,A
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#9000H
MOVX @DPTR,A
LOOP12: LCALL DL1MS
INC R1
MOV A,R5
JB ACC.7,ENDOUT2
LOOP22: RL A
MOV R5,A
MOV DPTR,#9000H
MOV A,#00H
MOVX @DPTR,A
AJMP PLAY2
ENDOUT2: MOV DPTR,#8000H
MOV A,#00H
MOVX @DPTR,A
MOV DPTR,#9000H
MOV A,#00H
MOVX @DPTR,A
RET
ADDH: ;小時(shí)加1函數(shù)
INC 66H
MOV A,66H
XRL A,#0AH
JNZ RETURN
MOV 66H,#00H
INC 67H
RETURN:MOV A,66H
XRL A,#04H
JNZ ZOUREN
MOV A,67H
XRL A,#02H
JNZ ZOUREN
MOV 66H,#00H
MOV 67H,#00H
ZOUREN:
RET
ADDMM: ;分加1函數(shù)
INC 63H
MOV A,63H
XRL A,#0AH
JNZ RETURN1
INC 64H
MOV A,64H
XRL A,#06H
JNZ CLRM0
MOV 64H,#00H
CLRM0:MOV 63H,#00H
RETURN1:RET
DECIDE:SETB 00H ;開(kāi)啟默認(rèn)鈴聲響時(shí)標(biāo)志位
LJMP CYCLE2
CYCLE2:
LCALL SHOW1
LCALL SCAN
LCALL DISDING ;按鍵判斷
AJMP CYCLE2
DISDING:
CJNE R4,#01H,DISDING1
AJMP ALARMTIME ;1鍵顯示鬧鐘設(shè)置時(shí)間
DISDING1:
CJNE R4,#02H,DISDING2
AJMP NOSOUND ;關(guān)鬧鈴
DISDING2:
CJNE R4,#08H,DISDING3
MOV 60H,#00H
MOV 61H,#00H
MOV 62H,#0AH
MOV 63H,#00H
MOV 64H,#00H
MOV 65H,#0AH
MOV 66H,#00H
MOV 67H,#00H
SETB 00H
LJMP CYCLE
DISDING3:RET
ALARMTIME:LCALL SHOW2
LCALL SCAN
CJNE R4,#01H,BEHAND
AJMP CYCLE2
BEHAND:
CJNE R4,#02H,ALARMTIME
AJMP NOSOUND
NOSOUND:SETB 00H
LJMP CYCLE
STOPWATCH: ;跑表程序
SETB 02H ;開(kāi)啟跑表計(jì)數(shù)方式位
LCALL SHOW2
LCALL SCAN
LCALL LOOKEY ;按鍵判斷
AJMP STOPWATCH
LOOKEY:
CJNE R4,#01H,LOOKEY1
AJMP SUSPEND ;1鍵暫停
LOOKEY1:
CJNE R4,#02H,LOOKEY2
AJMP STOP ;2鍵停止
LOOKEY2:
CJNE R4,#04H,LOOKEY3 ;3鍵取消
CLR 02H
MOV 60H,#00H
MOV 61H,#00H
MOV 62H,#0AH
MOV 63H,#00H
MOV 64H,#00H
MOV 65H,#0AH
MOV 66H,#00H
MOV 67H,#00H
LJMP CYCLE
LOOKEY3: RET
SUSPEND: ;暫停函數(shù)
MOV 47H,67H
MOV 46H,66H
MOV 45H,65H
MOV 44H,64H
MOV 43H,63H
MOV 42H,62H
MOV 41H,61H
MOV 40H,60H ;寄存數(shù)值
SUSPEND1:
LCALL SHOW3
LCALL SCAN
LCALL SUSJUD ;按鍵判斷
AJMP SUSPEND1
SUSJUD:
CJNE R4,#01,SUSJUD1 ;1鍵繼續(xù)
AJMP GOON
SUSJUD1:
CJNE R4,#02H,SUSJUD2 ;2鍵清零
AJMP CLENUM
SUSJUD2:
CJNE R4,#04H,SUSJUD3 ;3鍵返回時(shí)鐘
CLR 02H
MOV 60H,#00H
MOV 61H,#00H
MOV 62H,#0AH
MOV 63H,#00H
MOV 64H,#00H
MOV 65H,#0AH
MOV 66H,#00H
MOV 67H,#00H
LJMP CYCLE
SUSJUD3:RET
GOON:MOV 60H,40H
MOV 61H,41H
MOV 62H,42H
MOV 63H,43H
MOV 64H,44H
MOV 65H,45H
MOV 66H,46H
MOV 67H,47H
AJMP STOPWATCH
CLENUM:MOV 60H,#00H
MOV 61H,#00H
MOV 62H,#0AH
MOV 63H,#00H
MOV 64H,#00H
MOV 65H,#0AH
MOV 66H,#00H
MOV 67H,#00H
AJMP STOPWATCH
STOP: ;停止函數(shù)
MOV 40H,60H
MOV 41H,61H
MOV 42H,62H
MOV 43H,63H
MOV 44H,64H
MOV 45H,65H
MOV 46H,66H
MOV 47H,67H
STOP1:
LCALL SHOW3
LCALL SCAN
LCALL STOPJUD ;按鍵判斷
AJMP STOP1
STOPJUD:
CJNE R4,#01H,STOP2 ;1鍵復(fù)值
AJMP STOP
STOP2:
CJNE R4,#02H,STOP3 ;2鍵恢復(fù)
AJMP STOPWATCH
STOP3:RET
SHOW3: MOV R1,#40H ;指向顯示數(shù)據(jù)首址 R5 YONG R1 YONG
MOV R5,#01H ;掃描控制字初值
PLAY3: MOV DPTR,#8000H
MOV A,R5
MOVX @DPTR,A
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#9000H
MOVX @DPTR,A
LOOP13: LCALL DL1MS
INC R1
MOV A,R5
JB ACC.7,ENDOUT3
LOOP23: RL A
MOV R5,A
MOV DPTR,#9000H
MOV A,#00H
MOVX @DPTR,A
AJMP PLAY3
ENDOUT3: MOV DPTR,#8000H
MOV A,#00H
MOVX @DPTR,A
MOV DPTR,#9000H
MOV A,#00H
MOVX @DPTR,A
RET
TIMESETTING: ; 時(shí)間設(shè)置
CLR ET0 ;關(guān)定時(shí)器
CLR TR0
LCALL DELAY1S
LOOP4:
LCALL SCAN
LCALL UPTO ;按鍵判斷
LCALL SHOW2
AJMP LOOP4
UPTO:
CJNE R4,#01H,UPTO1
AJMP ADDH
UPTO1:
CJNE R4,#02H,UPTO2
AJMP ADDMM
UPTO2:
CJNE R4,#04H,UPTO3
AJMP FIX
UPTO3:
CJNE R4,#08H,UPTO4
SETB TR0 ;開(kāi)啟定時(shí)器
SETB ET0
LJMP CYCLE
UPTO4:RET
FIX:
MOV 50H,60H
MOV 51H,61H
MOV 52H,62H
MOV 53H,63H
MOV 54H,64H
MOV 55H,65H
MOV 56H,66H
MOV 57H,67H
MOV 58H,#00H
SETB TR0 ;開(kāi)啟定時(shí)器
SETB ET0
LJMP CYCLE
INTT0: ;中斷程序
PUSH ACC
PUSH PSW
CLR ET0
CLR TR0
JB 00H,PANDUANSHI
HUIQU:
JB 02H,INCPAO ;判斷跑表計(jì)時(shí)方式位
HUILAI:
INC 58H
MOV A,58H
CJNE A,#100,BENUM ;一秒計(jì)數(shù)
MOV 58H,#00H
LCALL ADD11
BENUM:
MOV TL0,#20H
MOV TH0,#0DCH ;中斷補(bǔ)償
POP PSW
POP ACC
SETB ET0 ;開(kāi)啟計(jì)時(shí)器0
SETB TR0
RETI
PANDUANSHI:
MOV A,53H
XRL A,63H
JNZ BACK
MOV A,54H
XRL A,64H
JNZ BACK
MOV A,56H
XRL A,66H
JNZ BACK
MOV A,57H
XRL A,67H
JNZ BACK
CLR P1.6
AJMP HUIQU
ADD11: ;時(shí)鐘加1程序
INC 50H
MOV A,50H
XRL A,#0AH
JNZ GOBACK1
MOV 50H,#00H
INC 51H
MOV A,51H
XRL A,#06H
JNZ GOBACK1
MOV 51H,#00H
INC 53H
MOV A,53H
XRL A,#0AH
JNZ GOBACK1
MOV 53H,#00H
INC 54H
MOV A,54H
XRL A,#06H
JNZ GOBACK1
MOV 54H,#00H
INC 56H
MOV A,56H
XRL A,#0AH
JNZ GOBACK1
INC 57H
MOV A,57H
XRL A,#02H
JNZ GOBACK
XRL 56H,#04H
JNZ GOBACK
MOV 57H,#00H
GOBACK:MOV 56H,#00H
GOBACK1: RET
INCPAO: INC 59H
MOV A,59H
MOV 59H,#00H
LCALL ADD111
LJMP HUILAI
ADD111: ; 跑表加1程序
INC 60H
MOV A,60H
XRL A,#0AH
JNZ GOBACK11
MOV 60H,#00H
INC 61H
MOV A,61H
XRL A,#0AH
JNZ GOBACK11
MOV 61H,#00H
INC 63H
MOV A,63H
XRL A,#0AH
JNZ GOBACK11
MOV 63H,#00H
INC 64H
MOV A,64H
XRL A,#06H
JNZ GOBACK11
MOV 64H,#00H
INC 66H
MOV A,66H
XRL A,#0AH
JNZ GOBACK11
MOV 66H,#00H
INC 67H
MOV A,67H
XRL A,#06H
JNZ GOBACK11
MOV 67H,#00H
GOBACK11: RET
END
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -