?? 定時器.asm
字號:
MOV L0, R4 ;移入工作方式選擇數
INC L0
;
WAITMK: ACALL DISPLY ;等待M鍵釋放
INC R2 ;R2自增一
CLR C
CJNE R2, #0C8H, JGQUIC ;若R2大于等于200則調用快進子程序
JGQUIC: JC WATMK1
ACALL QUICK
WATMK1: JNB MKEY, WAITMK ; R2小于200則等待M鍵釋放
;
JGFKEY: JB FKEY, MENU1 ;功能(F)鍵掃描
ACALL KEYDLY ;延時消抖動
JB FKEY, MENU1 ;鍵未按下則轉修改(M)鍵掃描
INC R6 ;F鍵按鍵次數加1
MOV A, R6 ;移入按鍵次數
RL A ;指針放大
MOV DPTR, #FUNTAB
JMP @A+DPTR ;根據按鍵次數跳轉到相應的程序段
FUNTAB: AJMP WAITFK
AJMP SETLOW
AJMP SETHI
AJMP ENDMEN
NOP
NOP
AJMP ENDMEN
;STWKMD: ;工作模式設定,不需另外改變菜單
;
SETLOW: MOV MAX, #60H ;設置低位(秒位或分位)
MOV A, R4 ;移入工作模式選擇數
RL A ;指針放大
MOV DPTR, #FTAB1
JMP @A+DPTR ;根據工作模式選擇數跳轉到相應的程序段
FTAB1: AJMP SETSS
AJMP SETM60
AJMP SETSS
AJMP SETM60
NOP
NOP
AJMP WAITFK
SETSS: MOV DSPLYP, #SL ;設定顯示區域為MM:SS
MOV ADDRES, #SH
AJMP WAITFK
SETM60: MOV DSPLYP, #ML ; 設定顯示區域為HH:MM
MOV ADDRES, #MH
AJMP WAITFK
;
SETHI: CLR LPLMOD ;設置高位(分位或時位)
SETB HPLMOD ;高兩位數碼管閃爍
MOV MAX, #31H ;最大數為30
MOV A, R4 ;移入工作模式選擇數
RL A ;指針放大
MOV DPTR, #FTAB2 ;移入表首地址
JMP @A+DPTR ;根據工作模式選擇數跳轉到相應的程序段
FTAB2: AJMP SETM30
AJMP SETHH
AJMP SETM30
AJMP SETHH
NOP
NOP
AJMP WAITFK ;返回等待鍵釋放
SETM30: MOV ADDRES, #MH ;移入分位的地址
AJMP WAITFK ;轉向等待鍵釋放
SETHH: MOV ADDRES, #HH ;移入時位的地址
AJMP WAITFK ;轉向等待鍵釋放
;
ENDMEN: CLR HPLMOD ;恢復不閃爍顯示方式
RET
NOP
NOP
LJMP ERR ;軟件陷阱
;
;****************
; 到點工作程序 ;
;****************
ACTION: MOV L0, R4 ;移入工作模式選擇數
INC L0 ;送顯示數"F-0X"
MOV L1, #00H
MOV L2, #0BH
MOV L3, #00H
SETB LED4
MOV DSPLYP, #L0 ;指針指向顯存
SETB LPLMOD ;設定顯示方式不閃爍
SETB HPLMOD
MOV A, R4 ;移入工作模式選擇數
RL A ;
MOV DPTR, #A_TAB
JMP @A+DPTR ;根據工作模式選擇數跳轉
A_TAB: AJMP ACTF1 ;工作模式一
AJMP ACTF1 ;工作模式二
AJMP ACTF3 ;工作模式三
AJMP ACTF3 ;工作模式四
NOP
NOP
LJMP ERR ;軟件陷阱
ACTF1: SETB SWITCH ;工作模式一(或二): 關繼電器
MOV R_MOD, #82H ;響鈴模式參數#82H
MOV R2, #96H ;響鈴次數參數#96H
ACTF11: ACALL RING ;調用響鈴子程序
JNB MKEY, ENDACT ;等待鍵按下
JNB FKEY, ENDACT ; 有鍵按下則結束響鈴
DJNZ R2, ACTF11 ;次數未滿繼續響鈴
MOV R_MOD, #0FFH ;參數#0FF使響鈴無效
AJMP ACTF11 ;無鍵按下返回
NOP
NOP
LJMP ERR ;軟件陷阱
ACTF3: CLR SWITCH ;工作模式三(或四): 開繼電器
CLR BELL ;蜂鳴器短鳴一聲
ACALL DL1S
SETB BELL
MOV R_MOD, #0FFH ;響鈴模式參數#0FFH
MOV R2, #96H ;響鈴時間參數#96H
ACTF31: ACALL RING ;調用響鈴子程序
JNB MKEY, ENDACT ;等待鍵按下
JNB FKEY, ENDACT ; 有鍵按下則結束
DJNZ R2, ACTF31 ;次數未滿繼續
MOV R2, #96H ;重新賦值
CLR BELL ;短鳴一聲(說明: 響鈴模式參數#0FFH使
ACALL DL100 ; 響鈴程序無效,僅起延時作用,
SETB BELL ; 每延時一段時間短鳴一聲,以
AJMP ACTF31 ; 提醒使用者繼電器仍在工作)
NOP
NOP
LJMP ERR ;軟件陷阱
ENDACT: SETB SWITCH ;關繼電器
AWAITF: ACALL DISPLY ;調用顯示
JNB FKEY, AWAITF ;等待鍵釋放
AWAITM: ACALL DISPLY ;調用顯示
JNB MKEY, AWAITM ;等待鍵釋放
RET
NOP
NOP
LJMP ERR ;軟件陷阱
;
;**************
; 響鈴程序 ;
;**************
RING: MOV R5, #18H ;R5為循環控制變量
RING1: JNB MKEY , R_EXIT ;鍵掃描
JNB FKEY , R_EXIT ;有鍵按下則退出
MOV A, R_MOD ;移入響鈴模式參數
MOV C, ACC.7 ;根據響鈴模式參數改變響鈴
MOV BELL, C
RL A
MOV R_MOD, A
ACALL DL100 ;延時
DJNZ R5, RING1 ;循環次數控制
R_EXIT: SETB BELL ;關閉響鈴
RET
NOP
NOP
LJMP ERR ;軟件陷阱
;
;**************
; 顯示程序 ;
;**************
DISPLY: PUSH ACC ;數據壓棧保護
PUSH PSW
MOV PSW, #10H ;選用寄存器組2
MOV R0, DSPLYP ;移入顯示指針
MOV R2, #0FDH ;R2寄存的是數碼管選通數
MOV A, PLYTS ;移入顯示循環控制量
JNZ PLAY ;不為0則轉PLAY
MOV PLYTS, #64H ;否則從新賦值
CPL BRIGHT ;亮滅指示位取反
PLAY: DEC PLYTS ;顯示循環控制量減1
JNB LPLMOD, PLAYL ;低兩位數碼管不閃則"PLAYL"
JB BRIGHT, PLAYL ;亮滅指示為1也"PLAYL"
ACALL NOPLAY ;否則滅燈延時
AJMP PLAY1 ;轉顯示高位數碼管
NOP
NOP
LJMP ERR ;軟件陷阱
;用來顯示低位
PLAYL: ORL P1, #7FH ;清原顯示數據
ORL P3, #3CH ;清原選通數據
MOV A, R2 ;移入數碼管位選數
RL A ;換一位
ANL P3, A ;選通低位的個位數碼管
MOV R2, A ;暫存位選數
MOV A, @R0 ;移入顯示數值
MOV DPTR, #TABLE1 ;移入表首地址
MOVC A, @A+DPTR ;查表
ANL P1, A ;送顯示數據
ACALL DL1MS ;延時
INC R0 ;指向低位的十位數
JB P3.3, PLAYL ;顯示低位的十位數
;
PLAY1: JNB HPLMOD, PLAYH ;高兩位數碼管不閃則"PLAYH"
JB BRIGHT, PLAYH ;亮滅指示為1也"PLAYH"
ACALL NOPLAY ; 否則滅燈延時
AJMP OUTPLY ;轉結束
NOP
NOP
LJMP ERR ;軟件陷阱
;
;用來顯示高位
PLAYH: ORL P1, #7FH ;清原顯示數據
ORL P3, #3CH ;清原選通數據
ANL P3, #0EFH ;選通高位的個位數數碼管
MOV A, @R0 ;移入顯示數值
MOV DPTR, #TABLE1 ;移入表首地址
MOVC A, @A+DPTR ;查表
ANL P1, A ;送顯示數據
ACALL DL1MS ;延時
INC R0 ;指向高位的十位數
; ;顯示高位的十位數
ORL P1, #7FH ;清原顯示數據
ORL P3, #3CH ;清原選通數據
ANL P3, #0DFH ;選通高位的十位數
MOV A, @R0 ;移入顯示數值
MOV C, LED4 ;指針放大+小燈狀態
RLC A ;
MOV DPTR, #TABLE2 ;移入表首地址
MOVC A, @A+DPTR ;查表
ANL P1, A ;送顯示數據
ACALL DL1MS ;延時
;
OUTPLY: POP PSW ;恢復數據
POP ACC
RET
NOP
NOP
LJMP ERR ;軟件陷阱
;
TABLE1: DB 0C0H,0F9H,0A4H,0B0H, 99H, 92H, 82H,0F8H, 80H, 90H,0BFH, 8EH,0FFH
; "0", "1", ... ... "9", "-", "F", " "
;
TABLE2: DB 0FFH, 0DFH, 0F9H, 0D9H, 0A4H, 84H, 0B0H, 90H, 0BFH, 09FH
; " ", " :", "1 ", "1:", "2 ", "2:", "3 ", "3:", "- ", "-:"
;
;
;
;**********************
; 無顯示(滅燈)程序 ;
;**********************
NOPLAY: ORL P1, #7FH ;清顯示數據
ORL P3, #3CH ;清選通數據
INC R0 ;指針自增2
INC R0
ACALL DL1MS ;延時
RET
NOP
NOP
LJMP ERR ;軟件陷阱
;
;******************
; 延時程序 ;
;******************
DL1MS: MOV R3, #0F9H ;延時 1250US 只為DISPLY所調用
DL1MS1: NOP
NOP
NOP
DJNZ R3, DL1MS1
RET
NOP
NOP
LJMP ERR ;軟件陷阱
;
KEYDLY: CLR BELL ; 按鍵消抖動專用延時程序,
ACALL DISPLY ; 在消除抖動的同時發出按鍵提示音
SETB BELL
RET
NOP
NOP
LJMP ERR ;軟件陷阱
;
DL50MS: MOV R7, #0AH ;50毫秒延時程序
DL50M1: ACALL DISPLY ; 每調用一次顯示程序5MS
DJNZ R7, DL50M1 ; 調用10次
RET
NOP
NOP
LJMP ERR ;軟件陷阱
;
DL100: ACALL DL50MS ;延時100毫秒
ACALL DL50MS
RET
NOP
NOP
LJMP ERR ;軟件陷阱
;
DL05S: ACALL DL100 ; 延時0.5秒
ACALL DL100
ACALL DL100
ACALL DL100
ACALL DL100
RET
NOP
NOP
LJMP ERR ;軟件陷阱
;
DL1S: ACALL DL05S ;延時1秒
ACALL DL05S
RET
NOP
NOP
LJMP ERR ;軟件陷阱
;
;****************************
; ERR(出錯處理) 程序 ;
;****************************
ERR: CLR EA ;關中斷
MOV DPTR, #ERR1 ; 準備返回地址
PUSH DPL ; 壓棧
PUSH DPH ;
RETI ;中斷返回
ERR1: MOV 56H, #0AAH ;建立上電標志(出錯標志)
MOV 57H, #55H
MOV A, #00H ; 準備返回地址
; PUSH A ; 壓棧
; PUSH A
RETI ; 中斷返回
NOP
NOP
LJMP ERR ;軟件陷阱
;
ORG 07FAH
NOP
NOP
NOP
LJMP ERR ;軟件陷阱
;
END ;程序結束
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -