数字钟1.asm

来自「自己做的单片机Proteus仿真实例」· 汇编 代码 · 共 332 行

ASM
332
字号
SECOND  EQU  30H
MINUTE  EQU  31H
HOUR    EQU  32H
ALARM_SECOND  EQU  33H
ALARM_MINUTE  EQU  34H
ALARM_HOUR    EQU  35H
CLOCK_SECOND  EQU  36H
CLOCK_MINUTE  EQU  37H
CLOCK_HOUR    EQU  38H
DAY   EQU  41H
MONTH EQU  42H
YEARL EQU  43H 
YEARH EQU  44H 
TCNT  EQU  45H
TIME1 BIT 20H   
TIME2 BIT 21H   
	  ORG 0000H
	  LJMP  START 
	  ORG 000BH
	  LJMP  T00
	  ORG 0030H

START:  MOV DPTR,#TAB
		MOV TCNT,#0
		CLR TIME1
		CLR TIME2
		MOV  R3,#10
		CLR  P1.7
        MOV CLOCK_HOUR,#7
		MOV CLOCK_MINUTE,#59
		MOV CLOCK_SECOND,#56
		
		MOV ALARM_SECOND,#0
		MOV ALARM_MINUTE,#0
		MOV ALARM_HOUR,#7

		MOV DAY,#28
        MOV MONTH,#2
		MOV YEARL,#00
		MOV YEARH,#19

		MOV TMOD,#01H
		MOV TH0,#(65536-50000)/256
		MOV TL0,#(65536-50000) MOD 256
		MOV IE,#83H
		SETB TR0

A1:     LCALL  DISPLAY
		MOV  P1,#0FFH
		JNB  P1.2,S1
		JNB  P1.3,S2
		JNB  P1.4,S3
		JNB  P1.5,START
		LJMP  A1
S1:		LCALL  DELAY
 		JB  P1.2,A1
		INC CLOCK_SECOND
		LCALL  DISPLAY
		MOV  A,CLOCK_SECOND
		CJNE  A,#60,L1
		MOV  CLOCK_SECOND,#0
		LJMP  K1
S2:		LCALL  DELAY
 		JB  P1.3,A1
K1:		MOV   A,CLOCK_MINUTE
		INC   A
		MOV   CLOCK_MINUTE,A
		LCALL  DISPLAY
		
		CJNE  A,#60,L2
		MOV  CLOCK_MINUTE,#0
		LJMP  K2
S3:		LCALL  DELAY
 		JB  P1.4,A1
K2:     INC CLOCK_HOUR
		LCALL  DISPLAY
		MOV  A,CLOCK_HOUR
		CJNE  A,#24,L3
		MOV  CLOCK_HOUR,#0
		LJMP A1


L1:		JB   P1.2,A1
 		LCALL   DISPLAY
	    JMP  L1
L2:		JB   P1.3,A1
 		LCALL   DISPLAY
		JMP  L2
L3:		JB   P1.4,A1
 		LCALL   DISPLAY
		JMP  L3






T00:    MOV TH0,#(65536-50000)/256
		MOV TL0,#(65536-50000) MOD 256
		INC   TCNT
		MOV   A,TCNT
		CJNE  A,#20,RETUNE1
		MOV   TCNT,#0
	
	
		JB  TIME1,J1
J1:     JB  TIME2,J2
		SJMP   J3
J2:		CPL   P1.7
		SJMP  J4
J3:		JNB  TIME1,J4
		SETB  P1.7
		DJNZ R3,J4
		CLR   P1.7
		CLR   TIME1
		MOV  R3,#10
J4:		INC   CLOCK_SECOND	
		MOV   A,CLOCK_SECOND
		CJNE  A,#60,RETUNE1
		INC   CLOCK_MINUTE
		MOV   CLOCK_SECOND,#0
		MOV   A,CLOCK_MINUTE
		CJNE  A,#60,RETUNE1
		INC   CLOCK_HOUR
		MOV   CLOCK_MINUTE,#0
		MOV   A,CLOCK_HOUR
		CJNE  A,#24,RETUNE1
		MOV   CLOCK_HOUR,#0
		INC   DAY
    	MOV   A,MONTH
		CJNE  A,#8,T01
		LJMP  T01
RETUNE1:LJMP  RETUNE
T01:    JC    T02
        RRC   A
		JC    T011
		MOV   A,DAY
		CJNE  A,#32,RETUNE
		INC   MONTH
		MOV   DAY,#1
		MOV   A,MONTH
		CJNE  A,#13,RETUNE
		INC   YEARL
		MOV   MONTH,#1
		MOV   A,YEARL
		CJNE  A,#100,RETUNE
		INC   YEARH
		MOV   YEARL,#1
		SJMP  RETUNE
T011:   MOV   A,DAY
		CJNE  A,#31,RETUNE
		INC   MONTH
		MOV   DAY,#1
		SJMP  RETUNE
T02:    RRC   A
  		JNC   T03
		MOV   A,DAY
		CJNE  A,#32,RETUNE
		INC   MONTH
		MOV   DAY,#1
		SJMP  RETUNE
T03:    MOV   A,MONTH
    	CJNE  A,#2,T04
		MOV   A,YEARL
	    CJNE  A,#0,T031
		MOV   A,YEARH
		MOV   B,#04
		DIV   AB
		MOV   A,B
		CJNE  A,#0,T04
		SJMP  T032
T031:   MOV   A,YEARL
		MOV   B,#04
		DIV   AB
		MOV   A,B
		CJNE  A,#0,T04
T032:	MOV   A,DAY
		CJNE  A,#30,RETUNE
		INC   MONTH
		MOV   DAY,#1 
		SJMP  RETUNE


T04:    MOV   A,DAY
		CJNE  A,#29,RETUNE
		INC   MONTH
		MOV   DAY,#1 
RETUNE: LCALL  DISPLAY
		MOV   A,CLOCK_SECOND
		CJNE  A,#00,EXIT1
		MOV   A,CLOCK_MINUTE
		CJNE  A,#00,EXIT1
		SETB  TIME1
EXIT1:	
        MOV   A,CLOCK_MINUTE
        CJNE  A,ALARM_MINUTE,EXIT2
		MOV   A,CLOCK_HOUR
		CJNE  A,ALARM_HOUR,EXIT2
		SETB  TIME2
		SJMP  EXIT3
EXIT2:  CLR   TIME2 
        CLR   P1.7   
            
		
EXIT3:	RETI











DISPLAY:JNB P1.0,DISDATE1
		JNB P1.1,DISALARM
	
		MOV   HOUR,CLOCK_HOUR
		MOV   MINUTE,CLOCK_MINUTE
		MOV   SECOND,CLOCK_SECOND
DISP:   MOV  A,SECOND
		MOV  B,#10
		DIV  AB
		CLR  P2.6
		MOVC A,@A+DPTR
		MOV  P0,A
		LCALL  DELAY
		SETB P2.6
		MOV  A,B
		CLR  P2.7
		MOVC A,@A+DPTR
		MOV  P0,A
		LCALL  DELAY
		SETB P2.7

		CLR  P2.5
		MOV P0,#40H
		LCALL  DELAY
		SETB P2.5
		
		MOV  A,MINUTE
		MOV  B,#10
		DIV  AB
		CLR  P2.3
		MOVC A,@A+DPTR
		MOV  P0,A
		LCALL  DELAY
		SETB P2.3
		MOV  A,B
		CLR  P2.4
		MOVC A,@A+DPTR
		MOV  P0,A
		LCALL  DELAY
		SETB P2.4

		CLR  P2.2
		MOV P0,#40H
		LCALL  DELAY
		SETB P2.2


		MOV  A,HOUR
		MOV  B,#10
		DIV  AB
		CLR  P2.0
		MOVC A,@A+DPTR
		MOV  P0,A
		LCALL  DELAY
		SETB P2.0
		MOV  A,B
		CLR  P2.1
		MOVC A,@A+DPTR
		MOV  P0,A
		LCALL  DELAY
		SETB P2.1
		SJMP EXIT
DISDATE1:SJMP  DISDATE	
DISALARM:MOV   HOUR,ALARM_HOUR
		 MOV   MINUTE,ALARM_MINUTE
	 	 MOV   SECOND,ALARM_SECOND 
	   	 SJMP  DISP

DISDATE:MOV  R0,#DAY
		MOV  R1,#60H
		MOV  R7,#4
DIS1:	MOV  A,@R0
		MOV  B,#10
		DIV  AB
		MOV  @R1,B
		INC  R1
		MOV  @R1,A
		INC  R1
		INC  R0
		DJNZ R7,DIS1
    
		MOV  R0,#60H
		MOV  R7,#8
DIS2:	MOV  A,@R0
		MOVC A,@A+DPTR
		MOV  @R0,A
		INC  R0
		DJNZ R7,DIS2
	
		MOV  R0,#67H
		MOV  R7,#8
		MOV  A,#0FEH
DIS3:	MOV  P2,A
		MOV  P0,@R0
		LCALL  DELAY
	    DEC  R0
		RL   A
		DJNZ R7,DIS3


EXIT:		RET
DELAY:  MOV  R5,#10
D1:     MOV  R6,#100
        DJNZ R6,$
		DJNZ R5,D1
		RET
TAB:  DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
	  ;   0   1   2   3   4   5   6   7   8   9
	 
	 
	  END




⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?