⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 a_clock.asm

📁 AT89C2051时钟程序 定时器T0、T1溢出周期为50MS
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	    JNB   P1.7,COL3
	    AJMP  KEYEND
COL3:   MOV   60H,#3				;存储列号
	    AJMP  KEYVALUE
COL2:   MOV   60H,#2
	    AJMP  KEYVALUE
COL1:   MOV   60H,#1
	    AJMP  KEYVALUE
COL0:   MOV   60H,#0
KEYVALUE:
        MOV   A,60H
		CJNE  A,#0,LS1			  ;转向功能键服务子程序
		ACALL KEY0
		SJMP  KEYEND
LS1:    CJNE  A,#1,LS2
        ACALL KEY1
		SJMP  KEYEND
LS2:    CJNE  A,#2,LS3
        ACALL KEY2
		SJMP  KEYEND		
LS3:    CJNE  A,#3,KEYEND
        ACALL KEY3	                     
KEYEND:	POP   DPL
		POP   DPH
		POP   ACC
		POP   PSW				
        RETI

KEY0:   							;功能设置控制按键,,34H=#02H进行日期校准,34H=#03H进行闹钟设置,34H=#04H进行秒表功能
      	INC   34H					
		MOV   A,34H					
		MOV   38H,#00H
		MOV   65H,#00H
    	CJNE  A,#05H,K0_EXIT
		MOV   34H,#00H
K0_EXIT:RET

KEY1:						        ;参数修改加1操作,秒表功能时做开始、停止操作
        MOV   50H,#00H  
K1_14:  MOV   36H,#01H
        MOV   A,34H
        CJNE  A,#01H,K1_1
K1_12:	MOV   A,65H
		CJNE  A,#01H,K1_2
K1_5:	MOV   66H,#0AH
        SJMP  K1_EXIT
K1_2:   CJNE  A,#02H,K1_3
K1_7:   MOV   66H,#01H
		SJMP  K1_EXIT
K1_3:   CJNE  A,#03H,K1_4
        SJMP  K1_5
K1_4:   CJNE  A,#04H,K1_6
        SJMP  K1_7
K1_6:   CJNE  A,#05H,K1_8
        SJMP  K1_5
K1_8:   CJNE  A,#06H,K1_9
        SJMP  K1_7
K1_9:   CJNE  A,#07H,K1_10
        SJMP  K1_5
K1_10:  CJNE  A,#08H,K1_EXIT
        SJMP  K1_7
K1_1:	CJNE  A,#02H,K1_11
        SJMP  K1_12
K1_11:	CJNE  A,#03H,K1_13
        SJMP  K1_12
K1_13:  CJNE  A,#04H,K1_EXIT
     	MOV   66H,#00H
        INC   35H
		MOV   A,35H
		CJNE  A,#03H,K1_EXIT
		MOV   35H,#01H      
K1_EXIT:RET
 
KEY2:              		             ;参数修改减一操作,秒表功能是做复位操作
	    MOV   50H,#00H
K2_15:  MOV   36H,#02H
        MOV   A,34H
        CJNE  A,#01H,K2_1
K2_12:	MOV   A,65H
		CJNE  A,#01H,K2_2
K2_5:	MOV   66H,#10
        SJMP  K1_EXIT
K2_2:   CJNE  A,#02H,K2_3
K2_7:   MOV   66H,#01H
		SJMP  K1_EXIT
K2_3:   CJNE  A,#03H,K2_4
        SJMP  K2_5
K2_4:   CJNE  A,#04H,K2_6
        SJMP  K2_7
K2_6:   CJNE  A,#05H,K2_8
        SJMP  K2_5
K2_8:   CJNE  A,#06H,K2_9
        SJMP  K2_7
K2_9:   CJNE  A,#07H,K2_10
        SJMP  K2_5
K2_10:  CJNE  A,#08H,K2_EXIT
        SJMP  K2_7
K2_1:	CJNE  A,#02H,K2_11
        SJMP  K2_12
K2_11:	CJNE  A,#03H,K2_13
        SJMP  K2_12
K2_13:  CJNE  A,#04H,K2_EXIT
     	MOV   66H,#00H		
        MOV   A,35H
		CJNE  A,#01H,K2_14
		SJMP  K2_EXIT
K2_14:	CJNE  A,#02H,K2_EXIT
		MOV   35H,#03H
K2_EXIT:RET

KEY3:   							 ;按住不放显示日期,或者选择修改那个参数        
        MOV   A,34H					  
        CJNE  A,#00H,K3_1
K3_2:	LCALL DISPLAY2
        JB    P1.7,K3_0
		SJMP  K3_2
K3_0:   LCALL DISPLAY0
        LCALL D40MS
        SJMP  K3_EXIT
K3_1:	CJNE  A,#01H,K3_3
K3_5:   INC   65H
		MOV   A,65H
		CJNE  A,#09H,K3_EXIT
		MOV   65H,#00H
		SJMP  K3_EXIT
K3_3:   CJNE  A,#02H,K3_4
        SJMP  K3_5
K3_4:   CJNE  A,#03H,K3_6
        SJMP  K3_5        
K3_6:   CJNE  A,#04H,K3_EXIT              		
K3_EXIT:RET
;*******************************************************************************************
SERVE1:  							   ;T1定时器中断子程序
        PUSH  PSW
        PUSH  ACC
		PUSH  DPH
		PUSH  DPL					   ;保护现场
		MOV   TH1,#0FCH
		MOV   TL1,#2AH				   ;重置初值
		DJNZ  20H,RET1			       ;判断是否到10ms,没有则返回
		MOV   20H,#10				   ;重装中断次数
		MOV   A,34H					   ;判断是否是秒表功能,
		CJNE  A,#04H,SE_1
		MOV   A,35H					   ;判断是否开始计时
		CJNE  A,#01H,SE_1
		LCALL TIME
SE_1:	INC   33H					   
		INC   39H
		MOV   A,50H
		CJNE  A,#01H,SE_24
		MOV   A,31H
		CLR   C
		SUBB  A,71H
		CJNE  A,#05H,SE_23
		MOV   50H,#00H
SE_24:	SETB  P3.6
		SJMP  SE_22
SE_23:	INC   49H
		MOV   A,49H
		CJNE  A,#30,SE_22
		MOV   49H,#00H
        CPL   P3.6
SE_22:	MOV   A,39H
		CJNE  A,#70,SE_20
		MOV   39H,#00H
SE_20:	MOV   A,33H
        CJNE  A,#100,RET1			   ;是否到1s,否则返回
		MOV   33H,#00H				   ;是则10ms单元清0
		INC   32H					   ;秒单元进1
    	MOV   A,32H
		CJNE  A,#60,RET1			   ;是否到60秒,否则返回
		MOV   32H,#00H				   ;是则秒单元清0
		INC   31H					   ;分单元进1
		MOV   A,31H
		CJNE  A,#60,RET1			   ;是否到60分,否则返回
		MOV   31H,#00H				   ;分单元清0
		INC   30H					   ;时单元进1
		MOV   A,30H
		CJNE  A,#24,RET1			   ;是否到24时,否则返回
		MOV   30H,#00H				   ;是则清0
		INC   77H					   ;日单元进1
        MOV   A,76H
        CJNE  A,#01H,SE_2
SE_9:	MOV   A,77H
		CJNE  A,#32,RETUNT
		MOV   77H,#01H
		AJMP  SE_6
RET1:   AJMP  RETUNT
SE_2:   CJNE  A,#02H,SE_3
        MOV   A,75H
		CJNE  A,#00H,SE_4
		MOV   A,74H
SE_4:	MOV   B,#4
		DIV   AB
		MOV   A,B
		CJNE  A,#00H,SE_5
		MOV   A,77H
		CJNE  A,#30,RETUNT
		MOV   77H,#01H
		AJMP  SE_6
SE_5:   MOV   A,77H
        CJNE  A,#29,RETUNT
		MOV   77H,#01H
		AJMP  SE_6		
SE_3:  	CJNE  A,#04H,SE_7
SE_11:  MOV   A,77H
		CJNE  A,#31,RETUNT
		MOV   77H,#01H
		AJMP  SE_6
SE_7:   CJNE  A,#03H,SE_8
        SJMP  SE_9
SE_8:   CJNE  A,#05H,SE_10
        SJMP  SE_9
SE_10:  CJNE  A,#06H,SE_12
        AJMP  SE_11
SE_12:  CJNE  A,#07H,SE_13
        SJMP  SE_9
SE_13:  CJNE  A,#08H,SE_14
        AJMP  SE_9
SE_14:  CJNE  A,#09H,SE_15
        AJMP  SE_11
SE_15:  CJNE  A,#10,SE_16
        AJMP  SE_9
SE_16:  CJNE  A,#11,SE_17
        AJMP  SE_11
SE_17:  CJNE  A,#12,RETUNT
        AJMP  SE_9
SE_6:	INC   76H  
		MOV   A,76H
		CJNE  A,#13,RETUNT
		MOV   76H,#01H
		INC   75H
		MOV   A,75H
		CJNE  A,#100,RETUNT
		MOV   75H,#00H
		INC   74H
RETUNT: POP   DPL
        POP   DPH
        POP   ACC
        POP   PSW
		RETI																							             
;*********************************************************************************
DISPLAY0:        					;时钟显示子程序,30H~33H(时分秒)
    	MOV   R0,#30H							   
		MOV   R1,#00H
		MOV   R2,#04H
D0_1:	MOV   A,@R0					;取要显示的值
		MOV   B,#10
		DIV   AB					;求十位数和个位数
		MOV   DPTR,#TAB1			;取十位数的字型码
		MOVC  A,@A+DPTR
		MOV   P0,A					;输出到P0口显示
		MOV   A,R1					;选择要显示的数码管
		MOV   DPTR,#TAB3
		MOVC  A,@A+DPTR
		MOV   P2,A				    ;点亮该数码管
		LCALL D1MS
		INC   R1				    ;准备下一个要显示的数码管
		MOV   A,B					;取个位数
		CJNE  R0,#33H,D0_2			;判断是否扫描到了最后一个数码管
		MOV   DPTR,#TAB1
		MOVC  A,@A+DPTR
		MOV   P0,A
		SJMP  D0_3
D0_2:	MOV   DPTR,#TAB2		    ;取个位数的字型码
		MOVC  A,@A+DPTR
		MOV   P0,A
D0_3:	MOV   A,R1
		MOV   DPTR,#TAB3
		MOVC  A,@A+DPTR
		MOV   P2,A
		LCALL D1MS
		INC   R1
		INC   R0
		DJNZ  R2,D0_1				 ;判断时分秒是否显示完毕							
		RET
;*****************************************************************************************
DISPLAY1:                            ;调时显示子程序,40H~43H
        MOV   R0,#40H				 
		MOV   R1,#01H
		MOV   R2,#04H
D1_7:	MOV   A,R1
        CJNE  A,65H,D1_1
		MOV   A,39H
		CLR   C
		CJNE  A,#35,D1_8
D1_8:	JB    PSW.7,D1_2 
D1_1:	MOV   A,@R0					;取要显示的值
		MOV   B,#10
		DIV   AB					;求十位数和个位数		
		MOV   DPTR,#TAB1			;取十位数的字型码
		MOVC  A,@A+DPTR
		MOV   P0,A					;输出到P0口显示
		DEC   R1
		MOV   A,R1					;选择要显示的数码管
		MOV   DPTR,#TAB3
		MOVC  A,@A+DPTR
		MOV   P2,A				    ;点亮该数码管
		LCALL D1MS
    	INC   R1
D1_2:	INC   R1				    ;准备下一个要显示的数码管
        MOV   A,R1
        CJNE  A,65H,D1_3
		MOV   A,39H
		CLR   C
		CJNE  A,#35,D1_9
D1_9:	JB    PSW.7,D1_4
D1_3:	MOV   A,@R0
        MOV   B,#10
		DIV   AB
        MOV   A,B					;取个位数		
		MOV   DPTR,#TAB1
		MOVC  A,@A+DPTR
		MOV   P0,A		
	    DEC   R1
        MOV   A,R1
		MOV   DPTR,#TAB3
		MOVC  A,@A+DPTR
		MOV   P2,A                 
		LCALL D1MS
        INC  R1
D1_4:   CJNE  R0,#43H,D1_5			;判断是否扫描到了最后一个数码管
        SJMP  D1_6
D1_5:   MOV   P0,#7FH
        DEC   R1
        MOV   A,R1
        MOV   DPTR,#TAB3
        MOVC  A,@A+DPTR
        MOV   P2,A
        LCALL D1MS
	    INC   R1
D1_6:   INC   R1
		INC   R0
		DJNZ  R2,D1_7				;判断是否显示完毕
        RET
;**********************************************************************************
DISPLAY2:                           ;日期校准显示子程序,74H~77H(年月日)
        MOV   R0,#74H				 
		MOV   R1,#01H
		MOV   R2,#04H
D2_8:  	MOV   A,R1
	    CJNE  A,65H,D2_1
		MOV   A,39H
		CLR   C
		CJNE  A,#35,D2_10
D2_10:	JB    PSW.7,D2_2
D2_1:	MOV   A,@R0					;取要显示的值
		MOV   B,#10
		DIV   AB					;求十位数和个位数
		MOV   DPTR,#TAB1			;取十位数的字型码
		MOVC  A,@A+DPTR
		MOV   P0,A					;输出到P0口显示
	    DEC   R1
		MOV   A,R1					;选择要显示的数码管
		MOV   DPTR,#TAB3
		MOVC  A,@A+DPTR
		MOV   P2,A				    ;点亮该数码管
		LCALL D1MS
	    INC   R1
D2_2:	INC   R1				    ;准备下一个要显示的数码管
        MOV   A,R1
		CJNE  A,65H,D2_3
		MOV   A,39H
		CLR   C
		CJNE  A,#35,D2_11
D2_11:	JB    PSW.7,D2_4
D2_3:	MOV   A,@R0
        MOV   B,#10
		DIV   AB
        MOV   A,B					;取个位数		
        MOV   DPTR,#TAB1		    ;取个位数的字型码
		MOVC  A,@A+DPTR
		MOV   P0,A	
	    DEC   R1
        MOV   A,R1
		MOV   DPTR,#TAB3
		MOVC  A,@A+DPTR
		MOV   P2,A
		LCALL D1MS
	    INC   R1
D2_4:   CJNE  R0,#77H,D2_5			;判断是否扫描到了最后一个数码管
        SJMP  D2_6
D2_5:   CJNE  R0,#74H,D2_7			;判断是否是年份高二位的显示,是小数点不显示
        SJMP  D2_6
D2_7:   MOV   P0,#7FH
        DEC   R1
        MOV   A,R1
        MOV   DPTR,#TAB3
        MOVC  A,@A+DPTR
        MOV   P2,A
        LCALL D1MS
        INC   R1
D2_6:   INC   R1
		INC   R0
		DJNZ  R2,D2_8				;判断时分秒是否显示完毕
        RET
;************************************************************************************
DISPLAY3:							;闹钟设置显示子程序,70H~73H(时分秒)
        MOV   R0,#70H				 
		MOV   R1,#01H
		MOV   R2,#04H
D3_10:	MOV   A,R1
		CJNE  A,65H,D3_1
		MOV   A,39H
		CLR   C
		CJNE  A,#35,D3_8
D3_8:	JB    PSW.7,D3_2
D3_1:	MOV   A,@R0					;取要显示的值
		MOV   B,#10
		DIV   AB					;求十位数和个位数
		MOV   DPTR,#TAB1			;取十位数的字型码
		MOVC  A,@A+DPTR
		MOV   P0,A					;输出到P0口显示
		DEC   R1
		MOV   A,R1					;选择要显示的数码管
		MOV   DPTR,#TAB3
		MOVC  A,@A+DPTR
		MOV   P2,A				    ;点亮该数码管
	    LCALL D1MS
    	INC   R1				    ;准备下一个要显示的数码管
D3_2:	INC   R1
		MOV   A,R1
		CJNE  A,65H,D3_3
		MOV   A,39H
		CLR   C
		CJNE  A,#35,D3_9
D3_9:   JB    PSW.7,D3_4
D3_3:	MOV   A,@R0
        MOV   B,#10
    	DIV   AB
        MOV   A,B					;取个位数		
	    MOV   DPTR,#TAB1
	    MOVC  A,@A+DPTR
	    MOV   P0,A
        DEC   R1
        MOV   A,R1
     	MOV   DPTR,#TAB3
    	MOVC  A,@A+DPTR
    	MOV   P2,A
    	LCALL D1MS
        INC   R1
D3_4:   CJNE  R0,#73H,D3_5			;判断是否扫描到了最后一个数码管
        SJMP  D3_6
D3_5:   MOV   P0,#7FH
        DEC   R1
        MOV   A,R1
    	MOV   DPTR,#TAB3
    	MOVC  A,@A+DPTR
    	MOV   P2,A
    	LCALL D1MS                  ;显示小数点
        INC   R1   
D3_6:   INC   R1
        INC   R0
		DJNZ  R2,D3_10				;判断时分秒是否显示完毕 
		RET
;**************************************************************************************
DISPLAY4:							;秒表子程序显示	  52~55H
        MOV   R0,#52H				 
		MOV   R1,#00H
		MOV   R2,#04H
D4_1:	
        MOV   A,@R0					;取要显示的值
		MOV   B,#10
		DIV   AB					;求十位数和个位数
		MOV   DPTR,#TAB1			;取十位数的字型码
		MOVC  A,@A+DPTR
		MOV   P0,A					;输出到P0口显示
		MOV   A,R1					;选择要显示的数码管
		MOV   DPTR,#TAB3
		MOVC  A,@A+DPTR
		MOV   P2,A				    ;点亮该数码管
		LCALL D1MS
		INC   R1				    ;准备下一个要显示的数码管
		MOV   A,B					;取个位数
		CJNE  R0,#55H,D4_2			;判断是否扫描到了最后一个数码管
		MOV   DPTR,#TAB1
		MOVC  A,@A+DPTR
		MOV   P0,A
		SJMP  D4_3
D4_2:	MOV   DPTR,#TAB2		    ;取个位数的字型码
		MOVC  A,@A+DPTR
		MOV   P0,A
D4_3:	MOV   A,R1
		MOV   DPTR,#TAB3
		MOVC  A,@A+DPTR
		MOV   P2,A
		LCALL D1MS
		INC   R1
		INC   R0
		DJNZ  R2,D4_1				;判断时分秒是否显示完毕 
        RET
TAB1:   DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H	              ;无小数点数码显示
TAB2:   DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H					  ;有小数点数码显示
TAB3:   DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH					  ;八个数码管选通
;********************************************************************************************       
D1MS:   MOV   R6,#2					  ;1ms延时子程序
S11:	MOV   R7,#248
S22:	DJNZ  R7,S22
		DJNZ  R6,S11
		RET
;********************************************************************************************        
D10MS:          					;10ms延时子程序
        MOV   R4,#20
D10_1:	MOV   R5,#248
D10_2:	DJNZ  R5,D10_2
		DJNZ  R4,D10_1
		RET
;********************************************************************************************
D40MS:  MOV   R6,#80					  ;20ms延时子程序
DS_1:	MOV   R7,#248
DS_2:	DJNZ  R7,DS_2
		DJNZ  R6,DS_1
		RET
		END

⌨️ 快捷键说明

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