;*****************************************************************************
;實現功能:定時功能,參數是0.00s~99H,最多可以同時定時11個數(最先輸入的
;定時應為最大的定時時間)整點報時,鬧鐘,計分器,省電模式,顯示星期
;紅外遙控
;秒表功能:參數是0.00s~24H,最多可以存儲11個瞬間時間。
;顯示當前時間
;鍵盤功能:(平面圖)
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;%% 0 %% 1 %% 2 %% 3 %%
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;%% 4 %% 5 %% 6 %% 7 %%
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;%% 8 %% 9 %% 秒表 %% 定時 %%
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;%% 存儲 %% 查看 %%顯示轉換 %% 清零 %%
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;*****************************************************************************
P_KEY EQU P1 ;宏定義鍵盤的接口是P1
P2_KEY EQU P2 ;宏定義led位選的接口為P1
P0_KEY EQU P0 ;宏定義要顯示的數據的接口為P0
BUZZ EQU P3.0 ;蜂鳴器
NO_OUT EQU 24H ;紅外遙控最終控制號碼存放單元
NUMBER_A DATA 40H ;記錄定時/秒表實際時間
NUMBER_B DATA 41H
NUMBER_C DATA 42H
NUMBER_D DATA 43H
NUMBER_E DATA 44H
NUMBER_F DATA 45H
NUMBER_G DATA 46H
NUMBER_H DATA 47H
NUMBER_A6 DATA 30H ;記錄時鐘當前時間
NUMBER_B6 DATA 31H
NUMBER_C6 DATA 32H
NUMBER_D6 DATA 33H
NUMBER_E6 DATA 34H
NUMBER_F6 DATA 35H
NUMBER_G6 DATA 36H
NUMBER_H6 DATA 37H
NUMBER_A2 DATA 28H ;多個定時比較時間
NUMBER_B2 DATA 29H
NUMBER_C2 DATA 2AH
NUMBER_D2 DATA 2BH
NUMBER_E2 DATA 2CH
NUMBER_F2 DATA 2DH
NUMBER_G2 DATA 2EH
NUMBER_H2 DATA 2FH
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INTOUT0 ;外部中斷0秒表
ORG 000BH
LJMP COUNT0 ;設置計時0中斷入口秒表
ORG 0013H
LJMP INTOUT1
ORG 001BH
LJMP COUNT1
ORG 0030H ;程序存儲從該位開始
;數據初始化
MAIN:
MOV SP, #50H
CLR 20H.0 ;判斷是否可以改變定時的時間,0可以,1不可以
CLR 20H.1 ;啟動鬧鐘標志位0關,1開
CLR 20H.2 ;關鬧鐘鈴聲標志
CLR 20H.3 ;計分器標志位
CLR 20H.4 ;是否有鍵按下標志位
MOV 30H,#0AH ;記錄時鐘實際時間
MOV 31H,#0AH
MOV 32H,#0AH
MOV 33H,#0AH
MOV 34H,#0AH
MOV 35H,#0AH
MOV 36H,#0AH
MOV 37H,#0AH
MOV R0,#0D0H ;存儲秒表瞬間時間的區域,D0~D8是存儲鬧鐘資源
BACK_0: MOV @R0,#0BH ;D0~D8是存儲鬧鐘空間,只能在初始化時清0
INC R0
CJNE R0,#0D8H,BACK_0
MOV R0,#0D8H ;D8H~DFH為計分器的存儲地址,其初始化為; 0 VS 0
MOV @R0,#0DH
MOV R0,#0D9H
MOV @R0,#0DH
MOV R0,#0DAH
MOV @R0,#00H
MOV R0,#0DBH
MOV @R0,#0CH
MOV R0,#0DCH
MOV @R0,#0CH
MOV R0,#0DDH
MOV @R0,#0DH
MOV R0,#0DEH
MOV @R0,#0DH
MOV R0,#0DFH
MOV @R0,#00H
SETB BUZZ ;關閉蜂鳴器
MOV 39H,#5 ;顯示選擇功能,為0時顯示40~47H的內容,為5時顯示30~37的內容
MAIN0: MOV 40H,#00H ;記錄時鐘/秒表時間
MOV 41H,#00H
MOV 42H,#00H
MOV 43H,#00H
MOV 44H,#00H
MOV 45H,#00H
MOV 46H,#00H
MOV 47H,#00H
MOV 28H,#00H ;記錄多個定時時間
MOV 29H,#00H
MOV 2AH,#00H
MOV 2BH,#00H
MOV 2CH,#00H
MOV 2DH,#00H
MOV 2EH,#00H
MOV 2FH,#00H
MOV 48H,#55H ;暫停/繼續功能
MOV 4AH,#55H ;顯示切換功能,顯示當前時間/秒表定時時間
MOV 4BH,#55H ;鬧鐘開關轉換功能
MOV 4CH,#55H ;計分器選擇功能,調整甲乙中一方的分數
MOV 49H,#0 ;計數器中斷選擇功能,為#1時執行秒表程序,#2時執行定時程序
MOV 3AH,#0 ;存儲秒表時間的出入口資源
MOV 3BH,#0 ;同3AH
MOV 3CH,#0 ;存儲定時的出入口資源
MOV 3DH,#0 ;;選擇定時/秒表的出入口資源。為0時可以選其一,為1時不能選擇
MOV 3EH,#0 ;整點報時出入口資源,為1時關閉音樂
MOV NO_OUT,#0H ;紅外遙控最終控制號碼存放單元清0
MOV R0,#80H ;存儲秒表瞬間時間的區域,D0~D8是存儲鬧鐘資源
BACK_1: MOV @R0,#0BH
INC R0
CJNE R0,#0D0H,BACK_1
CLR P3.6 ;秒表狀態
CLR P3.7 ;定時狀態
SETB 20H.4
MOV R2,#9H ;一次最多只能按8次
MOV R1,#30H
MOV R5,#1
MOV R4,#0
MOV TMOD , #99H
MOV TL1 ,#00H
MOV TH1 ,#0DCH
SETB ET1 ;允許定時器1中斷
SETB EX1 ;開外部中斷
SETB IT1 ;選擇邊沿觸發方式
SETB EA
SETB PT0
SETB PT1
SETB PX0
MAIN1:
ACALL KEYBOARD ;掃描鍵盤
ACALL DISPLAY ;顯示程序
ACALL RING ;整點報時
ACALL ALARMCLOCK ;鬧鐘程序
ACALL TELECONTROL ;紅外遙控模塊
MOV A,49H ;只有選擇了定時程序時才掃描Buzzer程序
CJNE A,#02H,MAIN1
ACALL BUZZER ;調用蜂鳴器程序
;MAIN2:
;DJNZ 3DH,MAIN1
;MOV 3DH,#1
;SETB EX1
LJMP MAIN1
;********************
;秒表程序
;********************
TIME: MOV A,3DH
CJNE A,#0,TIMEOVER
MOV R2, #1H ;屏蔽0~9按鍵
MOV 39H,#0
MOV 3DH,#1 ;選擇了秒表之后就不能再選擇定時
SETB P3.6 ;P3.6為秒表的狀態燈
MOV R0,#80H ;存儲秒表瞬間時間的區域全部顯示0
MOV TMOD , #99H
MOV TL0 , #00H
MOV TH0 , #0DCH
SETB EX0 ;開外部中斷
SETB IT0 ;選擇邊沿觸發方式
SETB ET0 ;開計數器中斷
MOV 49H, #1H
SETB EA ;開總中斷
TIMEOVER:
RET
;********************
;定時程序
;********************
STOPWATCH:
MOV A,3DH
CJNE A,#0,STOPOVER
MOV R1,#40H
MOV R2,#9H ;一次最多只能按8次
MOV 39H,#0
MOV 3AH,#10
MOV 3DH,#1 ;選擇了定時之后就不能再選擇秒表
MOV 40H,#0AH ;初始化顯示時間,全部顯示"_"
MOV 41H,#0AH
MOV 42H,#0AH
MOV 43H,#0AH
MOV 44H,#0AH
MOV 45H,#0AH
MOV 46H,#0AH
MOV 47H,#0AH
SETB P3.7 ;P3.7為定時的狀態燈
MOV TMOD , #99H
MOV TL0 ,#00H
MOV TH0 ,#0DCH
SETB EX0 ;開外部中斷
SETB IT0 ;選擇邊沿觸發方式
SETB ET0 ;開外部中斷
MOV 49H, #2H
SETB EA ;開總中斷
STOPOVER:
RET
;**********************
;掃描鍵盤
;**********************
KEYBOARD:CJNE R5,#1,NOKEY
LJMP READ_KEY
NOKEY:
DJNZ R5, KEYOUT
KEYOUT: RET
READ_KEY: ;按鍵掃描函數
MOV P_KEY,#0ffH
MOV P_KEY,#0f0H
MOV A,P_KEY;判斷是否有鍵按下
cjne A,#0f0H,RK1
AJMP NO_KEY
;有按鍵按下,延時去抖
RK1:
CALL delAy_time ;延時5ms 還沒有寫出來
MOV P_KEY,#0f0H
MOV A,P_KEY
;確認是否有鍵按下
CJNE A,#0f0H,RK2
AJMP NO_KEY
;確認是有按鍵按下, 判斷哪行按鍵按下
RK2:
JNB ACC.4,RK4
JNB ACC.5,RK5
JNB ACC.6,RK6
JNB ACC.7,RK7
;沒有檢測到按鍵
AJMP NO_KEY
RK4:
MOV B,#0
MOV P_KEY,#0efH
AJMP RK_NEXT
RK5:
MOV B,#4
MOV P_KEY,#0dfH
AJMP RK_NEXT
RK6:
MOV B,#8
MOV P_KEY,#0BfH
AJMP RK_NEXT0
RK7:
MOV B,#12
MOV P_KEY,#07fH
AJMP RK_NEXT1
RK_next:
MOV A,P_KEY
JNB ACC.0,RK_NEXT_0
JNB ACC.1,RK_NEXT_1
JNB ACC.2,RK_NEXT_2
JNB ACC.3,RK_NEXT_3
;沒有檢測到按鍵
AJMP NO_KEY
LJMP NO_KEY
SAVE_T_S_0:
LJMP SAVE_T_S
DISPLAY_T_S_0:
LJMP DISPLAY_T_S
CHANGE_0:
LJMP CHANGE_DIS
RK_NEXT_0:
MOV A,#0
AJMP GET_KEY
RK_NEXT_1:
MOV A,#1
AJMP GET_KEY
RK_NEXT_2:
MOV A,#2
AJMP GET_KEY
RK_NEXT_3:
MOV A,#3
;返回檢測到的按鍵編號
GET_KEY: CLR 20H.4
ADD A,B
LJMP IFKEY
;沒檢測到按鍵,返回0xff
NO_KEY:
MOV A,#0H
IFKEY: JNB 20H.4,KEY_0 ;如果20H.4為0時證明有鍵按下
LJMP KEY_1 ;否則跳出
KEY_0: DJNZ R2, KEY_2 ; 當R2不為0時,運行8次,直到顯示的8位都給定初值
MOV R2, #1H ;運行8次后TIAO_2后的程序不再運行,內存不再賦值
CLR A
SETB 20H.4
RET
KEY_2: MOV @R1,A
INC R1
MOV R5, #70
KEY_1: CLR A
SETB 20H.4
RET
;//******************時間延遲函數
DELAY_TIME: ;延時10ms
PUSH PSW
PUSH ACC
LOOP: MOV R7,#100
LOOP_1: MOV R6,#50
LOOP_2: DJNZ R6,LOOP_2
DJNZ R7,LOOP_1
POP ACC
POP PSW
RET
;****************************
;顯示所記錄的秒表瞬間/定時的時間
;****************************
DISPLAY_T_S:
MOV R5,#60
MOV A, 49H
JB ACC.0,MIAOBIAO
JB ACC.1,DINGSHI
LJMP DISTIME_0
DINGSHI:
MOV 3AH,3CH
MOV R4,3AH
MOV 39H,#1
DEC R4
MOV 3AH,R4
MOV 3CH,R4
CJNE R4,#0FFH,DISTIME_0
MOV 3CH,3BH
LJMP DISTIME_0
MIAOBIAO:
MOV R4,3AH
MOV 39H,#1
DEC R4
MOV 3AH,R4
CJNE R4,#0FFH,DISTIME_0
MOV 3AH,3BH
DISTIME_0:RET
;***********************
;定時/秒表清零
;*&*********************
CLEAR:
MOV R5,#60
SETB BUZZ
CLR TR0
MOV R1,#40H
MOV R2,#9H ;按鍵后
MOV 3AH,#0
MOV 3BH,#0
MOV 3DH,#0
MOV 39H,#5
MOV 48H,#55H ;暫停/繼續功能
MOV 49H,#0 ;計數器中斷選擇功能,為#1時執行秒表程序,#2時執行定時程序
MOV 40H,#00H ;記錄譯碼后的顯示時間
MOV 41H,#00H
MOV 42H,#00H
MOV 43H,#00H
MOV 44H,#00H
MOV 45H,#00H
MOV 46H,#00H
MOV 47H,#00H
MOV 28H, #00H ;清0
MOV 29H,#00H
MOV 2AH,#00H
MOV 2BH,#00H
MOV 2CH,#00H
MOV 2DH,#00H
MOV 2EH,#00H
MOV 2FH,#00H
MOV R0,#0D8H ;D8H~DFH為計分器的存儲地址,其初始化為; 0 VS 0
MOV @R0,#0DH
MOV R0,#0D9H
MOV @R0,#0DH
MOV R0,#0DAH
MOV @R0,#00H
MOV R0,#0DBH
MOV @R0,#0CH
MOV TMOD , #99H ;t0模式1
MOV TL0 ,#00H
MOV TH0 ,#0DCH
CLR ET0
CLR EX0 ;開外部中斷
CLR P3.1
CLR P3.5
CLR P3.6
CLR P3.7
CLEAR_1: RET
;************************************
;查看當前時間/定時秒表當前時間/關音樂
;************************************
CHANGE_DIS:
MOV R5,#60
SETB ET1
SETB TR1
SETB BUZZ
MOV A,4AH ;
RL A
MOV 4AH,A
JNB ACC.1,CHANGE_1 ;查詢,A最低位為0時暫停計時,為1時繼續計時
MOV 39H,#5
LJMP CHANGE_2
CHANGE_1: MOV 39H,#0
CHANGE_2: RET
;*****************************
;選擇程序:存儲秒表瞬間/多個定時
;*****************************
SAVE_T_S: MOV R5,#60
MOV A,49H
JB ACC.0,SAVETIME
JB ACC.1,SAVESTOP
LJMP STOPOUT
;****************************
;存儲十個定時時間
;****************************
SAVESTOP:
MOV 39H,#1
MOV 3BH,#10
MOV R4,3AH
CJNE R4,#0H,STOP10_0
MOV R2,#1
MOV 39H,#0
LJMP STOPOUT
STOP10_0: MOV R2,#09H
CJNE R4,#01H,STOP1
MOV R1,#80H
LJMP STOP10
STOP1: CJNE R4,#02H,STOP2
MOV R1,#88H
LJMP STOP10
STOP2: CJNE R4,#03H,STOP3
MOV R1,#90H
LJMP STOP10
STOP3: CJNE R4,#04H,STOP4
MOV R1,#98H
LJMP STOP10
STOP4: CJNE R4,#05H,STOP5
MOV R1,#0A0H
LJMP STOP10
STOP5: CJNE R4,#06H,STOP6
MOV R1,#0A8H
LJMP STOP10
STOP6: CJNE R4,#07H,STOP7
MOV R1,#0B0H
LJMP STOP10
STOP7: CJNE R4,#08H,STOP8
MOV R1,#0B8H
LJMP STOP10
STOP8: CJNE R4,#09H,STOP9
MOV R1,#0C0H
LJMP STOP10
STOP9: CJNE R4,#0AH,STOP10
MOV R1,#0C8H
STOP10: MOV 3CH,R4
DEC R4
MOV 3AH,R4
STOPOUT: RET
;************************
;秒表存儲功能
;************************
SAVETIME: MOV R4,3AH
MOV A, 3BH
CJNE A,#0AH,SAVEMID
RET
SAVEMID: INC R4
MOV 3AH,R4
MOV 3BH,R4
CJNE R4,#01H,SAVE1
MOV R0,#80H
LJMP SAVE10
SAVE1: CJNE R4,#02H,SAVE2
MOV R0,#88H
LJMP SAVE10
SAVE2: CJNE R4,#03H,SAVE3
MOV R0,#90H
LJMP SAVE10
SAVE3: CJNE R4,#04H,SAVE4
MOV R0,#98H
LJMP SAVE10
SAVE4: CJNE R4,#05H,SAVE5
MOV R0,#0A0H
LJMP SAVE10
SAVE5: CJNE R4,#06H,SAVE6
MOV R0,#0A8H
LJMP SAVE10
SAVE6: CJNE R4,#07H,SAVE7
MOV R0,#0B0H
LJMP SAVE10
SAVE7: CJNE R4,#08H,SAVE8
MOV R0,#0B8H
LJMP SAVE10
SAVE8: CJNE R4,#09H,SAVE9
MOV R0,#0C0H
LJMP SAVE10
SAVE9: CJNE R4,#0AH,SAVE10
MOV R0,#0C8H
SAVE10: MOV @R0,40H
INC R0
MOV @R0,41H
INC R0
MOV @R0,42H
INC R0
MOV @R0,43H
INC R0
MOV @R0,44H
INC R0
MOV @R0,45H
INC R0
MOV @R0,46H
INC R0
MOV @R0,47H
RET
;****************************
;蜂鳴器程序,查詢是否全部為0
;***************************
BUZZER: PUSH ACC
PUSH B
PUSH PSW
MOV R4,#00H
MOV R6,#7FH
BUZZTURN: MOV A,#8H
ADD A,R6
MOV R0,A
MOV R6,A
MOV A,@R0
CJNE A,NUMBER_H2,BUZZER_1
DEC R0
MOV A,@R0
CJNE A,NUMBER_G2,BUZZER_1
DEC R0
MOV A,@R0
CJNE A,NUMBER_F2,BUZZER_1
DEC R0
MOV A,@R0
CJNE A,NUMBER_E2,BUZZER_1
DEC R0
MOV A,@R0
CJNE A,NUMBER_D2,BUZZER_1
DEC R0
MOV A,@R0
CJNE A,NUMBER_C2,BUZZER_1
DEC R0
MOV A,@R0
CJNE A,NUMBER_B2,BUZZER_1
DEC R0
MOV A,@R0
CJNE A,NUMBER_A2,BUZZER_1
MOV 3AH,R4
CLR BUZZ
MOV 39H,#1
BUZZER_1: INC R4
CJNE R4,#0AH,BUZZTURN
BUZZER_2:
MOV A,NUMBER_A ;時十位
CJNE A,#0H,RETURN3
MOV A,NUMBER_B ;時個位
CJNE A,#0H,RETURN3
MOV A,NUMBER_C ;分十位
CJNE A,#0H,RETURN3
MOV A,NUMBER_D ;分個位
CJNE A,#0H,RETURN3
MOV A,NUMBER_E ;秒十位
CJNE A,#0H,RETURN3
MOV A,NUMBER_F ;秒個位
CJNE A,#0H,RETURN3
MOV A,NUMBER_G ;秒十分位
CJNE A,#0H,RETURN3
MOV A,NUMBER_H ;秒百分位
CJNE A,#0H,RETURN3
CLR BUZZ ;開蜂鳴器
CLR TR0 ;關計數器0
CLR EX0 ;關外部中斷0
MOV 39H,#0
CLR P3.7
POP PSW
POP B
POP ACC
HERE: LJMP MAIN0
RETURN3:
POP PSW
POP B
POP ACC
RET
;**********************************
;整點報時
;**********************************
RING: PUSH ACC
PUSH B
PUSH PSW
MOV A,NUMBER_C6 ;分十位
CJNE A,#0H,RINGOUT
MOV A,NUMBER_D6 ;分個位
CJNE A,#0H,RINGOUT
MOV A,NUMBER_E6 ;秒十位
CJNE A,#0H,RINGOUT
MOV A,NUMBER_F6 ;秒個位
CJNE A,#0H,RINGOUT
MOV A,NUMBER_G6 ;秒十分位
CJNE A,#0H,RINGOUT
MOV A,NUMBER_H6 ;秒百分位
CJNE A,#0H,RINGOUT
CLR BUZZ
MOV 3EH, #1
RINGOUT: MOV A,3EH
CJNE A,#1,RING_OUT
MOV A,NUMBER_E6 ;秒十位
CJNE A,#1H,RING_OUT
SETB BUZZ
MOV 3EH, #0
RING_OUT:POP PSW
POP B
POP ACC
RET
;**********************************
;鬧鐘程序
;**********************************
ALARMCLOCK:
PUSH ACC
PUSH B
PUSH PSW
;SETB 20H.1
JNB 20H.1,ALARM_OUT1 ;啟動鬧鐘標志位0關,1開
MOV R0,#0D0H
MOV A,@R0 ;時十位
CJNE A,NUMBER_A6,ALARM_OUT
MOV R0,#0D1H
MOV A,@R0 ;時個位
CJNE A,NUMBER_B6,ALARM_OUT
MOV R0,#0D2H
MOV A,@R0 ;分十位
CJNE A,NUMBER_C6,ALARM_OUT
MOV R0,#0D3H
MOV A,@R0 ;分個位
CJNE A,NUMBER_D6,ALARM_OUT
MOV R0,#0D4H
MOV A,@R0 ;秒十位
CJNE A,NUMBER_E6,ALARM_OUT
MOV R0,#0D5H
MOV A,@R0 ;秒個位
CJNE A,NUMBER_F6,ALARM_OUT
MOV R0,#0D6H
MOV A,@R0 ;秒十分位
CJNE A,NUMBER_G6,ALARM_OUT
MOV R0,#0D7H
MOV A,@R0 ;秒百分位
CJNE A,NUMBER_H6,ALARM_OUT
CLR BUZZ
SETB 20H.2
ALARM_OUT:
JNB 20H.2,ALARM_OUT1 ;關鬧鐘鈴聲標志
MOV R0,#0D3H ;分個位
MOV A,@R0
INC A
CJNE A,NUMBER_D6,ALARM_OUT1
MOV R0,#0D4H
MOV A,@R0 ;秒十位
CJNE A,NUMBER_E6,ALARM_OUT1
MOV R0,#0D5H
MOV A,@R0 ;秒個位
CJNE A,NUMBER_F6,ALARM_OUT1
MOV R0,#0D6H
MOV A,@R0 ;秒十分位
CJNE A,NUMBER_G6,ALARM_OUT1
MOV R0,#0D7H
MOV A,@R0 ;秒百分位
CJNE A,NUMBER_H6,ALARM_OUT1
SETB BUZZ
CLR 20H.2 ;關鬧鐘鈴聲標志
ALARM_OUT1:POP PSW
POP B
POP ACC
RET
;**********************************
;鬧鐘賦初值程序
;**********************************
ALARMC: PUSH ACC
PUSH B
PUSH PSW
JB 20H.0,ALARMCOUT ;判斷是否可以改變定時的時間,0可以,1不可以
MOV R2,#09H
MOV R1,#0D0H
SETB 20H.0 ;判斷是否可以改變定時的時間,0可以,1不可以
ALARMCOUT:
POP PSW
POP B
POP ACC
RET
;**********************************
;更改鬧鐘時間程序
;**********************************
ACKCHANGE:PUSH ACC
PUSH B
PUSH PSW
MOV R2,#09H
MOV R1,#0D0H
MOV R0,#0D0H
BACK_2: MOV @R0,#0AH ;D0~D8是存儲鬧鐘空間,只能在初始化時清0
INC R0
CJNE R0,#0D8H,BACK_2
;CLR 20H.0
POP PSW
POP B
POP ACC
RET
;**********************************
;啟動/關閉鬧鐘
;**********************************
ACKSTART: PUSH ACC
PUSH B
PUSH PSW
MOV A,4BH ;
RL A
MOV 4BH,A
JNB ACC.1,ACK_OUT ;查詢,A最低位為0時暫停計時,為1繼續計時
SETB 20H.1 ;啟動鬧鐘標志位0關,1開
SETB P3.4
LJMP ACKOUT
ACK_OUT: CLR 20H.1 ;啟動鬧鐘標志位0關,1開
CLR P3.4
ACKOUT: POP PSW
POP B
POP ACC
RET
;**********************************
;顯示程序
;**********************************
DISPLAY: PUSH ACC
PUSH B
PUSH PSW
MOV R3,#0FEH
MOV A,39H
CJNE A,#5,YU_0
MOV R0,#37H
LJMP DISPLAY_A
YU_0: CJNE A,#1,YU_1
MOV R4,3AH
INC R4
CJNE R4,#01H,SAVE_1
MOV R0,#87H
LJMP DISPLAY_A
SAVE_1: CJNE R4,#02H,SAVE_2
MOV R0,#8FH
LJMP DISPLAY_A
SAVE_2: CJNE R4,#03H,SAVE_3
MOV R0,#97H
LJMP DISPLAY_A
SAVE_3: CJNE R4,#04H,SAVE_4
MOV R0,#9FH
LJMP DISPLAY_A
SAVE_4: CJNE R4,#05H,SAVE_5
MOV R0,#0A7H
LJMP DISPLAY_A
SAVE_5: CJNE R4,#06H,SAVE_6
MOV R0,#0AFH
LJMP DISPLAY_A
SAVE_6: CJNE R4,#07H,SAVE_7
MOV R0,#0B7H
LJMP DISPLAY_A
SAVE_7: CJNE R4,#08H,SAVE_8
MOV R0,#0BFH
LJMP DISPLAY_A
SAVE_8: CJNE R4,#09H,SAVE_9
MOV R0,#0C7H
LJMP DISPLAY_A
SAVE_9: CJNE R4,#0AH,YU_1
MOV R0,#0CFH ;動態顯示初始化,使r0指向緩沖區首地址
LJMP DISPLAY_A
YU_1: CJNE A,#2,YU_2
MOV R0,#0D7H
LJMP DISPLAY_A
YU_2: CJNE A,#3,YU_3
MOV R0,#0DFH
LJMP DISPLAY_A
YU_3: CJNE A,#4,YU_4
MOV R0,#0EFH
LJMP DISPLAY_A
YU_4: MOV R0,#47H
DISPLAY_A:
MOV DPTR,#TABLE
MOV A,@R0
MOVC A,@A+DPTR
MOV P2,R3
MOV P0,A
ACALL DELAYDIS
DEC R0
MOV A,R3
JNB ACC.7,LD1
RL A
MOV R3,A
LJMP DISPLAY_A
LD1: POP PSW
POP B
POP ACC
RET
; *********************
;查表程序
;*********************
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0F7H,0FEH,0BFH,0FFH
; 0 1 2 3 4 5 6 7 8 9 A B C D
RET
DELAYDIS: MOV R7,#250 ;04H
DELDIS: DJNZ R7,DELDIS
RET
;************************************
;計分器選擇程序A/B
;************************************
SCOREAB: PUSH ACC
PUSH B
PUSH PSW
MOV A,4CH ;
RL A
MOV 4CH,A
JNB ACC.1,SCO_B ;查詢,調整分數
SETB 20H.3
SETB P3.1
CLR P3.7 ;計分器標志位,甲A調整
LJMP SCOOUT
SCO_B:CLR 20H.3 ;計分器標志位,乙B調整
SETB P3.7
CLR P3.1
SCOOUT: POP PSW
POP B
POP ACC
RET
;************************************
;計分器分數調整:加1
;************************************
SCOREINC: PUSH ACC
PUSH B
PUSH PSW
JNB 20H.3,INCB ;計分器標志位,0時乙B調整
MOV R0,#0DAH ;1時甲A乙B調整
LJMP SCOMID_0
INCB: MOV R0,#0DFH
SCOMID_0: MOV A,@R0
INC A
MOV @R0,A
CJNE A,#0AH,INCAB_0
MOV A,#0
MOV @R0,A
DEC R0
MOV A,@R0
CJNE A,#0DH,SCOYU
MOV A,#0
SCOYU: INC A
MOV @R0,A
CJNE A,#0AH,INCAB_0
MOV A,#0
MOV @R0,A
DEC R0
MOV A,@R0
CJNE A,#0DH,SCOWEI
MOV A,#0
SCOWEI: INC A
MOV @R0,A
INCAB_0:
POP PSW
POP B
POP ACC
RET
;************************************
;計分器分數調整:減1
;************************************
SCOREDEC: PUSH ACC
PUSH B
PUSH PSW
SETB PSW.3
CLR PSW.4
JNB 20H.3,DECB ;計分器標志位,0時乙B調整
MOV R0,#0DAH ;1時甲A乙B調整
LJMP SCOMID_1
DECB: MOV R0,#0DFH ;個位
SCOMID_1: MOV A,@R0
DEC A
MOV @R0,A
CJNE A,#0FFH,DECAB_5
MOV R1,#0DEH
MOV A,@R1
CJNE A,#00H,DECABPENG
MOV R1,#0DDH
MOV A,@R1
CJNE A,#0DH,DECAB_1
MOV A,#0
MOV @R0,A
LJMP DECAB_5
DECABPENG:CJNE A,#0DH,DECAB_1
MOV A,#0
MOV @R0,A
LJMP DECAB_5
LJMP DECAB_2
DECAB_1: MOV A,#9
DECAB_2: MOV @R0,A
DEC R0 ;十位
MOV A,@R0
DEC A
MOV @R0,A
CJNE A,#0FFH,DECAB_6
MOV R1,#0DDH
MOV A,@R1
CJNE A,#00H,DECAB_YU
MOV A,#0DH
MOV @R0,A
LJMP DECAB_5
DECAB_6: CJNE A,#00H,DECAB_5
MOV R1,#0DDH
MOV A,@R1
CJNE A,#0DH,DECAB_YU
MOV A,#0DH
MOV @R0,A
LJMP DECAB_5
DECAB_YU: CJNE A,#0DH,DECAB_3
MOV A,#0DH
LJMP DECAB_4
DECAB_3: MOV A,#9
DECAB_4: MOV @R0,A
DEC R0 ;百位
MOV A,@R0
DEC A
MOV @R0,A
CJNE A,#00H,DECAB_5
MOV A,#0DH
MOV @R0,A
DECAB_5: CLR PSW.3
CLR PSW.4
POP PSW
POP B
POP ACC
RET
;*************************************
;紅外遙控模塊
;*************************************
;// 8 192 128 96
;//144 184 248 176
;//152 216 136 168
;//232 72 104 50
;// 2 18 32 0
;// 64 160 42 178
;// 80 120 112 88
;// 56 40 240 48
TELECONTROL:
CJNE R5,#1,NOCH
LJMP CHIN
NOCH:
DJNZ R5, CHOUT_0
CHIN: MOV R4,NO_OUT
CJNE R4,#0,CH0
CHOUT_0:LJMP CHOUT
CH0: ;0 碼型
CJNE R4,#216,CH1
MOV A,#0
MOV NO_OUT,#0H ;紅外遙控最終控制號碼存放單元清0
LJMP KEY_0
CH1: ;1 碼型
CJNE R4,#8,CH2
MOV A,#1
MOV NO_OUT,#0H ;紅外遙控最終控制號碼存放單元清0
LJMP KEY_0
CH2: ;2碼型
CJNE R4,#192,CH3
MOV A,#2
MOV NO_OUT,#0H ;紅外遙控最終控制號碼存放單元清0
LJMP KEY_0
CH3: ;3 碼型
CJNE R4,#128,CH4
MOV A,#3
MOV NO_OUT,#0H ;紅外遙控最終控制號碼存放單元清0
LJMP KEY_0
CH4: ;4 碼型
CJNE R4,#96,CH5
MOV A,#4
MOV NO_OUT,#0H ;紅外遙控最終控制號碼存放單元清0
LJMP KEY_0
CH5: ;5 碼型
CJNE R4,#144,CH6
MOV A,#5
MOV NO_OUT,#0H ;紅外遙控最終控制號碼存放單元清0
LJMP KEY_0
CH6: ;6 碼型
CJNE R4,#184,CH7
MOV A,#6
MOV NO_OUT,#0H ;紅外遙控最終控制號碼存放單元清0
LJMP KEY_0
CH7: ;7 碼型
CJNE R4,#248,CH8
MOV A,#7
MOV NO_OUT,#0H ;紅外遙控最終控制號碼存放單元清0
LJMP KEY_0
CH8: ;8 碼型
CJNE R4,#176,CH9
MOV A,#8
MOV NO_OUT,#0H ;紅外遙控最終控制號碼存放單元清0
LJMP KEY_0
CH9: ;9 碼型
CJNE R4,#152,CHKEYA
MOV A,#9
MOV NO_OUT,#0H ;紅外遙控最終控制號碼存放單元清0
LJMP KEY_0
CHKEYA: ;A 碼型
CJNE R4,#136,CHKEYB
MOV NO_OUT,#0H ;紅外遙控最終控制號碼存放單元清0
LJMP TIME
CHKEYB: ;B 碼型
CJNE R4,#168,CHSAVE
MOV NO_OUT,#0H ;紅外遙控最終控制號碼存放單元清0
LJMP STOPWATCH
CHSAVE: ;C 碼型
CJNE R4,#232,CHDIS
MOV NO_OUT,#0H ;紅外遙控最終控制號碼存放單元清0
LJMP SAVE_T_S
CHDIS: ;D 碼型
CJNE R4,#72,CHCHN
MOV NO_OUT,#0H ;紅外遙控最終控制號碼存放單元清0
LJMP DISPLAY_T_S
CHCHN: ;E 碼型
CJNE R4,#104,CHCLR
MOV NO_OUT,#0H ;紅外遙控最終控制號碼存放單元清0
LJMP CHANGE_DIS
CHCLR: ;F 碼型
CJNE R4,#50,CHINT
MOV NO_OUT,#0H ;紅外遙控最終控制號碼存放單元清0
LJMP CLEAR
CHINT: ;G 碼型
CJNE R4,#2, CHACK ;ALARM CLOCK
MOV NO_OUT,#0H ;紅外遙控最終控制號碼存放單元清0
CLR P3.2
SETB P3.2
CHACK:
CJNE R4,#18, CHACKC ;ALARM CLOCK CHANGE
MOV NO_OUT,#0H ;紅外遙控最終控制號碼存放單元清0
MOV 39H,#2
LJMP ALARMC
CHACKC:
CJNE R4,#32, CHACKST ;ALARM CLOCK START
MOV NO_OUT,#0H ;紅外遙控最終控制號碼存放單元清0
MOV 39H,#2
LJMP ACKCHANGE
CHACKST:
CJNE R4,#0, CHSCOREDIS
MOV NO_OUT,#0H ;紅外遙控最終控制號碼存放單元清0
LJMP ACKSTART
CHSCOREDIS:
CJNE R4,#64, CHSCOREAB
MOV NO_OUT,#0H ;紅外遙控最終控制號碼存放單元清0
MOV 39H,#3
LJMP CHOUT
CHSCOREAB:
CJNE R4,#160, CHSCOREINC
MOV NO_OUT,#0H ;紅外遙控最終控制號碼存放單元清0
LJMP SCOREAB
CHSCOREINC:
CJNE R4,#42, CHSCOREDEC
MOV NO_OUT,#0H ;紅外遙控最終控制號碼存放單元清0
LJMP SCOREINC
CHSCOREDEC:
CJNE R4,#178, CHDIAN
MOV NO_OUT,#0H ;紅外遙控最終控制號碼存放單元清0
LJMP SCOREDEC
CHDIAN:
CJNE R4,#48, CHOUT
MOV NO_OUT,#0H ;紅外遙控最終控制號碼存放單元清0
MOV R0,#0E7H
BACK_DIAN:
MOV @R0,#0DH
INC R0
CJNE R0,#0F0H,BACK_DIAN
MOV 39H,#4
CHOUT: RET
;*********************
;時鐘外部中斷程序
;*********************
INTOUT1:
PUSH ACC
PUSH PSW
MOV PSW,#18H
CLR EX1
MOV R4,#10
SB: LCALL DL865
JB P3.3,EXIT
DJNZ R4, SB
JNB P3.3, $
LCALL DL4737
MOV R5,#16
JJJJA: JNB P3.3,$
LCALL DL865
MOV C,P3.3
JNC UUUA
LCALL DL1000
UUUA: DJNZ R5,JJJJA
MOV R1,#22H
MOV R2,#2
PP: MOV R3,#8
JJJJ: JNB P3.3,$
LCALL DL865
MOV C,P3.3
JNC UUU
LCALL DL1000
UUU: MOV A,@R1
RLC A
MOV @R1,A
DJNZ R3,JJJJ
INC R1
DJNZ R2,PP
MOV A,22H
CPL A
CJNE A,23H,EXIT
MOV A,22H
MOV NO_OUT,A
EXIT: SETB EX1
;MOV 3DH,#40
CLR PSW.3
CLR PSW.4
POP PSW
POP ACC
RETI
;**********************<<延時程序>>******************************
;本程序完整版的下載地址:http://m.izizhuan.cn/ziliao/file/dgndzz.rar
DL865: MOV R7,#12 ; 1.09*(2R6+4)*R7+2 延時子程序1,精確延時865 微秒
D1: MOV R6,#31
DJNZ R6,$
DJNZ R7,D1
RET
DL4737: MOV R7,#12 ;延時子程序2,精確延時4737 微秒
D2: MOV R6,#179
DJNZ R6,$
DJNZ R7,D2
RET
DL1000: MOV R7,#17;延時程序3,精確延時1000 微秒
D3: MOV R6,#25
DJNZ R6,$
DJNZ R7,D3
RET
DL40: MOV R7,#1;延時程序4,精確延時40/17 微秒
D4: MOV R6,#1
DJNZ R6,$
DJNZ R7,D4
RET
;*************************
;秒表、定時器外部中斷程序
;**************************
INTOUT0: PUSH ACC
PUSH B
PUSH PSW
CLR TR0 ;停止計數
MOV 39H,#0
MOV A,48H ;
RL A
MOV 48H,A
JNB ACC.1,OUT0 ;查詢,A最低位為0時暫停計時,為1時繼續計時
MOV TH0,#0DCH ;#0FFH
MOV TL0,#00H ;#00H
SETB TR0 ;開始計數
OUT0: POP PSW
POP B
POP ACC
RETI
;***************************
; 時鐘溢出中斷程序
;***************************
COUNT1: PUSH ACC
PUSH B
PUSH PSW
MOV TL1 ,#00H
MOV TH1 ,#0DCH
MOV A,NUMBER_H6 ;秒百分位
INC A
MOV NUMBER_H6,A
CJNE A,#0AH,RETURN_1
MOV NUMBER_H6,#00H
MOV A,NUMBER_G6 ;秒十分位
INC A
MOV NUMBER_G6,A
CJNE A,#0AH,RETURN_1
MOV NUMBER_G6,#00H
MOV A,NUMBER_F6 ;秒個位
INC A
MOV NUMBER_F6,A
CJNE A,#0AH,RETURN_1
MOV NUMBER_F6,#00H
MOV A,NUMBER_E6 ;秒十位
INC A
MOV NUMBER_E6,A
CJNE A,#06H,RETURN_1
MOV NUMBER_E6,#00H
MOV A,NUMBER_D6 ;分個位
INC A
MOV NUMBER_D6,A
CJNE A,#0AH,RETURN_1
MOV NUMBER_D6,#00H
MOV A,NUMBER_C6 ;分十位
INC A
MOV NUMBER_C6,A
CJNE A,#06H,RETURN_1
MOV NUMBER_C6,#00H
MOV A,NUMBER_A6
CJNE A,#02H,GO_ON_1
MOV A,NUMBER_B6
INC A
MOV NUMBER_B6,A
CJNE A,#04H,RETURN_1
MOV NUMBER_B6,#00H
MOV NUMBER_A6,#00H
LJMP RETURN_1
GO_ON_1:
MOV A,NUMBER_B6 ;時個位
INC A
MOV NUMBER_B6,A
CJNE A,#0AH,RETURN_1
MOV NUMBER_B6,#00H
MOV A,NUMBER_A6 ;時個位和時十位一同設置
INC A
MOV NUMBER_A6,A
RETURN_1:
POP PSW
POP B
POP ACC
RETI ;散轉
;***************************
; 秒表溢出中斷程序
;***************************
COUNT0: PUSH ACC
PUSH B
PUSH PSW
MOV TL0 ,#00H
MOV TH0 ,#0DCH
MOV A, 49H
JB ACC.0,TIMER0
JB ACC.1,PENG
LJMP RETURN_0
PENG: LJMP STOP_00
TIMER0:
MOV A,NUMBER_H ;秒百分位
INC A
MOV NUMBER_H,A
CJNE A,#0AH,RETURN_0
MOV NUMBER_H,#00H
MOV A,NUMBER_G ;秒十分位
INC A
MOV NUMBER_G,A
CJNE A,#0AH,RETURN_0
MOV NUMBER_G,#00H
;
MOV A,NUMBER_F ;秒個位
INC A
MOV NUMBER_F,A
CJNE A,#0AH,RETURN_0
MOV NUMBER_F,#00H
;
MOV A,NUMBER_E ;秒十位
INC A
MOV NUMBER_E,A
CJNE A,#06H,RETURN_0
MOV NUMBER_E,#00H
MOV A,NUMBER_D ;分個位
INC A
MOV NUMBER_D,A
CJNE A,#0AH,RETURN_0
MOV NUMBER_D,#00H
MOV A,NUMBER_C ;分十位
INC A
MOV NUMBER_C,A
CJNE A,#06H,RETURN_0
MOV NUMBER_C,#00H
MOV A,NUMBER_A
CJNE A,#02H,GO_ON_0
MOV A,NUMBER_B
INC A
MOV NUMBER_B,A
CJNE A,#04H,RETURN_0
MOV NUMBER_B,#00H
MOV NUMBER_A,#00H
LJMP RETURN_0
GO_ON_0:
MOV A,NUMBER_B ;時個位
INC A
MOV NUMBER_B,A
CJNE A,#0AH,RETURN_0
MOV NUMBER_B,#00H
;
MOV A,NUMBER_A ;時個位和時十位一同設置
INC A
MOV NUMBER_A,A
RETURN_0:
POP PSW
POP B
POP ACC
RETI ;散轉
;**************************
;定時器計時中斷入口
;****************************
STOP_00:
MOV A,NUMBER_H ;0.01秒位
DEC A
MOV NUMBER_H,A
CJNE A,#0FFH,RETURN_00
MOV A,NUMBER_A
CJNE A,#0,REL_H
MOV A,NUMBER_B
CJNE A,#0,REL_H
MOV A,NUMBER_C
CJNE A,#0,REL_H
MOV A,NUMBER_D
CJNE A,#0,REL_H
MOV A,NUMBER_E
CJNE A,#0,REL_H
MOV A,NUMBER_F
CJNE A,#0,REL_H
MOV A,NUMBER_G
CJNE A,#0,REL_H
MOV NUMBER_H,#00H
LJMP RETURN_00
REL_H: MOV NUMBER_H,#09H
LJMP WEI_G
RETURN_00:
LJMP RETURN_02
WEI_G: MOV A,NUMBER_G ;0.1秒位
DEC A
MOV NUMBER_G,A
CJNE A,#0FFH,RETURN_01
MOV A,NUMBER_A
CJNE A,#0,REL_G
MOV A,NUMBER_B
CJNE A,#0,REL_G
MOV A,NUMBER_C
CJNE A,#0,REL_G
MOV A,NUMBER_D
CJNE A,#0,REL_G
MOV A,NUMBER_E
CJNE A,#0,REL_G
MOV A,NUMBER_F
CJNE A,#0,REL_G
MOV NUMBER_G,#00H
LJMP RETURN_01
REL_G: MOV NUMBER_G,#09H
;
WEI_F: MOV A,NUMBER_F ;秒個位
DEC A
MOV NUMBER_F,A
CJNE A,#0FFH,RETURN_01
MOV A,NUMBER_A
CJNE A,#0,REL_F
MOV A,NUMBER_B
CJNE A,#0,REL_F
MOV A,NUMBER_C
CJNE A,#0,REL_F
MOV A,NUMBER_D
CJNE A,#0,REL_F
MOV A,NUMBER_E
CJNE A,#0,REL_F
MOV NUMBER_F,#00H
AJMP RETURN_01
REL_F: MOV NUMBER_F,#09H
AJMP WEI_E
RETURN_01:
LJMP RETURN_02
;
WEI_E: MOV A,NUMBER_E ;秒十位
DEC A
MOV NUMBER_E,A
CJNE A,#0FFH,RETURN_02
MOV A,NUMBER_A
CJNE A,#0,REL_E
MOV A,NUMBER_B
CJNE A,#0,REL_E
MOV A,NUMBER_C
CJNE A,#0,REL_E
MOV A,NUMBER_D
CJNE A,#0,REL_E
MOV NUMBER_E,#00H
LJMP RETURN_02
REL_E: MOV NUMBER_E,#05H
;
WEI_D: MOV A,NUMBER_D ;分個位
DEC A
MOV NUMBER_D,A
CJNE A,#0FFH,RETURN_02
MOV A,NUMBER_A
CJNE A,#0,REL_D
MOV A,NUMBER_B
CJNE A,#0,REL_D
MOV A,NUMBER_C
CJNE A,#0,REL_D
MOV NUMBER_D,#00H
LJMP RETURN_02
REL_D: MOV NUMBER_D,#09H
;
WEI_C: MOV A,NUMBER_C ;分十位
DEC A
MOV NUMBER_C,A
CJNE A,#0FFH,RETURN_02
MOV A,NUMBER_A
CJNE A,#0,REL_C
MOV A,NUMBER_B
CJNE A,#0,REL_C
MOV NUMBER_C,#00H
LJMP RETURN_02
REL_C: MOV NUMBER_C,#05H
;
WEI_B: MOV A,NUMBER_B ;時個位
DEC A
MOV NUMBER_B,A
CJNE A,#0FFH,RETURN_02
MOV A,NUMBER_A
CJNE A,#0,REL_B
MOV NUMBER_B,#00H
LJMP RETURN_02
REL_B: MOV NUMBER_B,#09H
;
WEI_A: MOV A,NUMBER_A ;時個位和時十位一同設置
DEC A
MOV NUMBER_A,A
CJNE A,#0FFH,RETURN_02
MOV NUMBER_A,#00H
RETURN_02:
MOV A,NUMBER_H2 ;秒百分位
INC A
MOV NUMBER_H2,A
CJNE A,#0AH,RETURN_22
MOV NUMBER_H2,#00H
;
MOV A,NUMBER_G2 ;秒十分位
INC A
MOV NUMBER_G2,A
CJNE A,#0AH,RETURN_22
MOV NUMBER_G2,#00H
;
MOV A,NUMBER_F2 ;秒個位
INC A
MOV NUMBER_F2,A
CJNE A,#0AH,RETURN_22
MOV NUMBER_F2,#00H
;
MOV A,NUMBER_E2 ;秒十位
INC A
MOV NUMBER_E2,A
CJNE A,#06H,RETURN_22
MOV NUMBER_E2,#00H
MOV A,NUMBER_D2 ;分個位
INC A
MOV NUMBER_D2,A
CJNE A,#0AH,RETURN_22
MOV NUMBER_D2,#00H
MOV A,NUMBER_C2 ;分十位
INC A
MOV NUMBER_C2,A
CJNE A,#06H,RETURN_22
MOV NUMBER_C2,#00H
MOV A,NUMBER_A2
CJNE A,#02H,GO_ON_22
MOV A,NUMBER_B2
INC A
MOV NUMBER_B2,A
CJNE A,#04H,RETURN_22
MOV NUMBER_B2,#00H
MOV NUMBER_A2,#00H
LJMP RETURN_0
GO_ON_22:
MOV A,NUMBER_B2 ;時個位
INC A
MOV NUMBER_B2,A
CJNE A,#0AH,RETURN_22
MOV NUMBER_B2,#00H
;
MOV A,NUMBER_A2 ;時個位和時十位一同設置
INC A
MOV NUMBER_A2,A
RETURN_22:
POP PSW
POP B
POP ACC
RETI
END