last.asm

来自「本设计主要是运用单片机设计一个最小系统——电子时钟」· 汇编 代码 · 共 376 行

ASM
376
字号
	    LED0	EQU   30H
		LED1	EQU   31H
		LED2	EQU   32H
		LED3	EQU   33H
		STA0	EQU   34H
        STA2    EQU   35H
		SEC  	EQU   36H	;秒计数初始值200		
		TCN     EQU   37H
		LDS		EQU   38H
		SL		EQU	  39H
		SH		EQU	  3AH	
		ML		EQU   3BH
		MH      EQU   3CH
		YST		EQU	  3DH;延时1min计数器	
		NZT		EQU	  3EH;闹钟响铃时间计数器
		NZON	EQU	  3FH
		NZOFF	EQU	  40H			
		HL      EQU   41H
		HH      EQU   42H

		FLAG0   EQU   21H	 ;键标志位		
		FKZJ    BIT   FLAG0.0
		HKZJ    BIT   FLAG0.1 ;增加键按下标志位=1有效;
		FKXZ    BIT   FLAG0.2
		HKXZ    BIT   FLAG0.3 ;选择键按下标志位=1有效
		FKFU	BIT	  FLAG0.4
		HKFU	BIT	  FLAG0.5		
       	STOP    BIT   FLAG0.6;走时允许标志位(当stop=1时禁止走时)
		FLASH  	BIT   FLAG0.7;flash=0时数码管正常显示,flash=1数码管闪)
		FLAG1	EQU	  22H
		LEDS	BIT	  FLAG1.0
		RING	BIT	  FLAG1.1;鸣叫标志位,为“1”时有效		
		HNZ		BIT	  FLAG1.2;整点报时有效标志位
		FNZ		BIT	  FLAG1.3;正常响铃标志位
		SFNZ	BIT	  FLAG1.4;延时响铃标志位
		BELL	BIT	  FLAG1.5						
;------------------LED0-LED3片选位
		CS0 	BIT   P3.0
		CS1		BIT   P3.1
		CS2		BIT   P3.2
		CS3    	BIT   P3.7		
		KXZ		BIT   P3.3;选择键
		KZJ		BIT   P3.4;增加键
		KFU		BIT	  P3.5	
			
		ORG 	0000H
		LJMP	MAIN
MAIN:	MOV    	R1,	#04H
		MOV    	R2,	#04H
		MOV		R3,	#04H
		MOV		R4,	#04H	
		MOV		R0,	#30H		
FW:     MOV 	@R0,	A
        INC 	R0
		CJNE 	R0,	#3DH,FW; 清30H-3CH单元
		MOV		HL,#02H
		MOV		HH,#01H
		MOV    	TCN,	#50 ;数码管闪烁初始值50
        MOV    	SEC,	#200 
        MOV		YST,	#28H
        MOV		NZT,	#14H
        MOV		NZON,	#02H
        MOV		NZOFF,	#04H      
        MOV    	FLAG0,	#00H;总清按键标志位
        MOV    	FLAG1,	#00H
        MOV    	LDS,	#02H
		MOV		TMOD,	#01H;使用定时器T0的方式1功能
;----------------------------程序开始-------------------------------
START:	MOV		TH0,#0ECH;定时5ms
		MOV		TL0,#78H
        CLR 	TF0
		SETB    TR0
		DJNZ 	TCN,LOOP;250ms到了位闪标志取反
		MOV 	TCN,#50
		CPL 	FLASH
        JB		STOP,LOOP
        DJNZ    LDS,LOOP;秒标志亮灭0.5s
        CPL     LEDS
        MOV     LDS,#2
        ;闹钟处理
NZCL:	JNB		HNZ,WORK		
		SETB	BELL	  	
		DJNZ	R4,WORK
		CLR		BELL
		CLR		HNZ
		MOV		R4,#04H		
WORK:	JNB		FNZ,NZYS
		JB		RING,LMP0		
		CLR		BELL
		DJNZ	NZOFF,LOOP
		CPL		RING
		MOV		NZOFF,#02H
		SJMP	LOOP		
LMP0:	SETB	BELL
		DJNZ	NZON,NZYS
		CPL		RING
		MOV		NZON,#02H
		DJNZ	NZT,LOOP
		MOV		NZT,#14H
		CLR		FNZ	
		CLR		BELL
		SJMP	LOOP
NZYS:	JNB		SFNZ,LOOP
		DJNZ	YST,LOOP
		MOV		YST,#28H
		SETB	FNZ	
		CLR		SFNZ		
LOOP:	LCALL   AJSM
		LCALL   TIME
	    LCALL   DISP0
	    LCALL	NZPD
NEXT0:	JB   	TF0,START
		SJMP 	NEXT0
;----- -按键扫描---------------------------------
AJSM:	SETB	KFU
		SETB 	KXZ
		SETB	KZJ	
ANJFU:	JB		KFU,ANJ2
		DJNZ	R3,ANJ2
		MOV		R3,#04H
		SETB	HKFU
ANJ2:	JNB		KFU,ANJXZ
		MOV		R3,#04H
		JNB		HKFU,ANJXZ
		CLR		HKFU
		CPL		F0
ANJXZ:  JB 		KXZ,ANJ0
		DJNZ 	R1,ANJ0
		MOV		R1,#04
		SETB 	HKXZ
ANJ0:   JNB  	KXZ,ANJZJ;是否放开
		MOV  	R0,#04H
		JNB  	HKXZ,ANJZJ
		CLR  	HKXZ
		SETB 	FKXZ
ANJZJ:  JB	 	KZJ,ANJ1
		DJNZ	R2,ANJ1
		MOV	 	R2,#04H
		SETB	HKZJ
ANJ1:   JNB 	KZJ,ANJCL
		MOV 	R2,#04H
		JNB 	HKZJ,ANJCL
		CLR 	HKZJ
		SETB 	FKZJ
;--- ---按键处理---------------
ANJCL:	JNB     FKXZ,L0
       	CLR     FKXZ
       	JNB		FNZ,LMP1
       	CLR		FNZ       	
       	CLR	BELL
       	RET
LMP1: 	INC     STA0;STA0按键次数的查表指针
       	INC     STA0
       	MOV    	A,STA0
		CJNE    A,#0AH,L0;判断查表指针是否超过范围
      	MOV    	STA0,#00H
      	CLR    	STOP;若调整完所有4位数码管,进入走时状态
      	MOV		SL,#00H
      	MOV		SH,#00H      			
        RET
;-----------增加键处理-----------

L0:		JNB 	FKZJ,NEXT1
		CLR    	FKZJ
		JNB		FNZ,LMP2
		CLR		FNZ
		SETB	SFNZ
		CLR		BELL
		RET	
LMP2:	SETB   	STOP;停止走时
        MOV    	A,STA0
       	MOV    	DPTR,#TAB0
       	JMP     @A+DPTR
TAB0:   AJMP	BACK
		AJMP   	TZ_HH
       	AJMP   	TZ_HL
       	AJMP   	TZ_MH
       	AJMP   	TZ_ML
TZ_ML:  INC    	ML	  ;分低位处理
       	MOV   	A,ML
      	CJNE   	A,#0AH,NEXT1
       	MOV    	ML,#00H
       	RET
TZ_MH:  INC    	MH	  ;分高位处理
        MOV    	A,MH
       	CJNE    A,#06H,NEXT1
       	MOV    	MH,#00H
        RET
TZ_HL:  INC 	HL  ;时低位处理
        MOV 	A,HH
        XRL 	A,#02H
        JZ   	L1
        MOV 	A,HL
        CJNE    A,#0AH,NEXT1
       	MOV 	HL,#00H
       	RET
L1:     MOV    	A,HL
        CJNE   	A,#04H,NEXT1
     	MOV 	HL,#00H
	   	RET
TZ_HH: 	INC 	HH	 ;时高位处理
		MOV 	A,HH
       	CJNE 	A,#03H,NEXT1
       	MOV 	HH,#00H
NEXT1: 	RET
BACK:	CLR		SOP
		RET
;---- ---正常走时----------
TIME:   JB		STOP,NEXT2
		DJNZ    SEC,NEXT2
        MOV    	SEC,#200
       	INC		SL
       	MOV		A,SL
       	CJNE	A,#0AH,NEXT2
       	MOV		SL,#00H
       	INC		SH
       	MOV		A,SH
       	CJNE	A,#06H,NEXT2
       	MOV		SH,#00H
        INC     ML				  ;秒计数溢出,分低位加1
		MOV    	A,ML
        CJNE    A,#0AH,NEXT2
        MOV    	ML,#00H
        INC     MH				  ;分低位计数溢出,分高位加1
M1:     MOV    	A,MH
        CJNE    A,#06H,NEXT2
        MOV    	MH,#00H
        INC    	HL			  ;分高位计数溢出,时低位加1
        SETB	HNZ
M2:     MOV    	A,HH
        CJNE    A,#02H,M3
        MOV    	A,HL
        CJNE    A,#04H,NEXT2
        MOV    	HL,#00H
        INC     HH			   ;时低位计数溢出,时高位加1
        LJMP   	M4
M3:		MOV    	A,HL
        CJNE    A,#0AH,NEXT2
        MOV    	HL,#00H
        INC     HH        
M4:		MOV    	A,HH
        CJNE    A,#03H,NEXT2
        MOV    	HH,#00H
NEXT2:	RET
;--- ---扫描显示子程序---------
DISP0:  JB		F0,ZZS5
		MOV 	DPTR,#TAB
		MOV 	A,STA0
       	JMP 	@A+DPTR
TAB:    AJMP	ZZS4;正常显示
		AJMP 	ZZS3;时高位闪
       	AJMP	ZZS2;时低位闪
       	AJMP	ZZS1;分高位闪
       	AJMP	ZZS0;分低位闪
ZZS0:	JNB  	FLASH,ZZS4
		MOV		LED0,#0AH
		MOV		LED1,MH
		MOV		LED2,HL
		MOV		LED3,HH
		LCALL  	DISP
		RET
ZZS1:	JNB  	FLASH,ZZS4
		MOV		LED0,ML
		MOV		LED1,#0AH
		MOV		LED2,HL
		MOV		LED3,HH
		LCALL  	DISP
		RET
ZZS2:	JNB  	FLASH,ZZS4
		MOV		LED0,ML
		MOV		LED1,MH
		MOV		LED2,#0AH
		MOV		LED3,HH
		LCALL  	DISP
		RET
ZZS3:	JNB  	FLASH,ZZS4
		MOV		LED0,ML
		MOV		LED1,MH
		MOV 	LED2,HL
		MOV		LED3,#00H
		LCALL  DISP
		RET
ZZS4:	MOV		LED0,ML
		MOV		LED1,MH
		MOV		LED2,HL
		MOV		LED3,HH
		LCALL  	DISP
		RET
ZZS5:	MOV		LED0,SL
		MOV		LED1,SH
		MOV		LED2,ML
		MOV		LED3,MH
		LCALL	DISP
		RET		
;闹钟时间判断**********************
NZPD:	JB		STOP,NEXT5
		MOV		A,ML
		CJNE	A,#00H,NEXT5
		MOV		A,MH
		CJNE	A,#00H,NEXT5
		MOV     A,HL
		CJNE	A,#06H,NEXT5
		MOV		A,HH
		CJNE	A,#00H,NEXT5
		MOV		A,SL
		CJNE	A,#00H,NEXT5
		MOV		A,SH
		CJNE	A,#00H,NEXT5		
		SETB	FNZ
NEXT5:	RET

;---------5ms刷新动态显示子程序
DISP:	SETB	CS0
		SETB   	CS1
		SETB   	CS2
		SETB	CS3
		CLR		C
		MOV		C,BELL      
        MOV     DPTR,#TAB1
        MOV    	A,STA2
        JMP     @A+DPTR
TAB1:   AJMP    DLED3
        AJMP    DLED2
        AJMP    DLED1
        AJMP    DLED0
DLED0:  MOV  	A,LED0;分低
		RLC		A
        MOV 	DPTR,#TAB2
        MOVC	A,@A+DPTR
        MOV 	P1,A
        CLR 	CS0
        MOV 	STA2,#00H
        RET
DLED1:  MOV  	A,LED1
		RLC		A
        MOV  	DPTR,#TAB2
        MOVC 	A,@A+DPTR
        MOV 	P1,A
        CLR 	CS1
        MOV		STA2,#06H
        RET
DLED2: 	MOV 	A,LED2;时低
		RLC		A
 		JNB		F0,N0 		
 		MOV		A,#0F7H
 		SJMP	N2 	
N0:     MOV  	DPTR,#TAB2
        MOVC	A,@A+DPTR
N2:     MOV 	P1,A
        CLR 	CS2
        MOV 	STA2,#04H
        RET
DLED3: 	
 		MOV  	A,LED3;时高
 		RLC		A 
 		CLR		C
 		MOV		C,LEDS
 		RLC		A
 		JNB		F0,NN 		
 		MOV		A,#0F7H
 		SJMP	N1 				
NN:    	MOV  	DPTR,#TAB3 	
		MOVC	A,@A+DPTR
N1:     MOV 	P1,A
        CLR 	CS3
        MOV 	STA2,#02H
        RET
TAB2:	DB 88H,08H,0BEH,3EH,0C4H,44H,94H,14H,0B2H,32H
        DB 91H,11H,81H,01H,0BCH,3CH,80H,00H,90H,10H,0FFH,7FH

TAB3:	DB	0FFH,0FBH,07FH,07BH;0,0:,"0-BELL","0:BELL"
		DB  0BEH,0BAH,3EH,3AH
		DB  0C4H,0C0H,24H,20H;" "," :","1","1:","2","2:"
END

⌨️ 快捷键说明

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