;***************************************************************************** ;实现功能:定时功能,参数是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.51hei.com/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