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