×
单片机 > 单片机程序设计 > 详情

超强多功能电子钟程序

发布时间:2020-06-08 发布时间:
|
;*****************************************************************************
;实现功能:定时功能,参数是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	 [page] 
;************************
;秒表存储功能
;************************
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[page]
;*************************************
;红外遥控模块
;*************************************
;//  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
关键字:电子钟  计分器 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会