;***************************************************************************** ;實現功能:定時功能,參數是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://www.zg4o1577.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