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

📄 clock.asm

📁 基于at89s52的电子钟汇编源程序。采用八位数码管
💻 ASM
字号:
;***********************************************************
;时钟程序
;K5键:模式选择, K6键:时间设定
;
;programing:corf
;***********************************************************
	DIS_BUF   EQU 40H        ;数码管显存
	LED_DATA  EQU P0         ;数码管数据口
	SEC       EQU 30H		 ;秒
	MIN       EQU 31H	     ;分
	HOU       EQU 32H	     ;时
	BLINK     BIT 07H

;***********************************************************

	ORG 0000H
	AJMP MAIN
	ORG 0003H
	AJMP INT_EX0
	ORG 000BH
	AJMP INT_T0
	ORG 0013H
	AJMP INT_EX1
	ORG 001BH
	AJMP INT_T1
	ORG 50H
;************************************************************


;主程序
;************************************************************
MAIN:
	MOV SP,#60H		      ;初始化堆栈

	
	MOV TMOD,#11H	      ;写控制字,T0工作方式一  
	MOV TH0,#0DCH	 	  ;设定计数初始值
	MOV TL0,#00H
	SETB TR0	          ;启动T0
	MOV TH1,#0DCH	 	  ;设定计数初始值
	MOV TL1,#00H
	SETB TR1	          ;启动T1
	SETB ET0	          ;允许T0中断
	SETB ET1
    SETB EA		          ;开总中断
	SETB EX0			  ;开int0
	SETB IT0			  ;边沿触发
	SETB EX1
	SETB IT1

	MOV P0,#0FFH
	MOV P2,#0FFH          ;初始化端口

	MOV R5,#100		  ;100*10MS=1S
	MOV R3,#25
	MOV R4,#0			;默认工作在模式0

	MOV R0,#DIS_BUF
	
	MOV SEC,#0			;清零
	MOV MIN,#0
	MOV HOU,#0
	SETB BLINK
DIS_CLR:		        ;初始化显存
	MOV @R0,#00H
	INC R0
	CJNE R0,#DIS_BUF+8,DIS_CLR
	MOV DIS_BUF+2,#0AH	 ;0AH代表显示横杠
	MOV DIS_BUF+5,#0AH

LOOP:
	ACALL CONVT	     ;数据转换
	ACALL DISPLAY
	AJMP LOOP
;**********************************************************


 ;数据转换
;**********************************************************
CONVT:
	MOV A,SEC
	MOV B,#10
	DIV AB
	MOV DIS_BUF,B
	MOV DIS_BUF+1,A
	MOV A,MIN
	MOV B,#10
	DIV AB
	MOV DIS_BUF+3,B
	MOV DIS_BUF+4,A
	MOV A,HOU
	MOV B,#10
	DIV AB
	MOV DIS_BUF+6,B
	MOV DIS_BUF+7,A
	RET
;************************************************************

; 数码管 显示 
;************************************************************
DISPLAY:
		 MOV R0,#DIS_BUF      ;获得显存单元首地址
         MOV R1,#0FEH          ;从第一个数码管开始
         MOV R2,#08          ;共显示8位数码管
DISP1:
         MOV A,@R0             ;获得当前位地址
         MOV DPTR,#TAB_NU      ;获得表头
         MOVC A,@A+DPTR        ;查表获得显示数据
         MOV LED_DATA,A        ;送段码
		 MOV C,BLINK
		 MOV A,#0
		 JC DISP2
		 MOV A,R4
		 MOV DPTR,#TAB_B
		 MOVC A,@A+DPTR
DISP2:
		 ORL A,R1
	     MOV P2,A

         MOV A,R1              ;准备下一位的位码
         RL A
         MOV R1,A              
         INC R0                ;取下一个显存单元地址
         ACALL DELAY1MS        ;延时 1 MS
         DJNZ R2,DISP1         ;重复显示下一个
         MOV  P2,#0FFH         ;关闭显示
         RET                   ;显示完成,返回

;*********************************************************

;延时子程序

;*********************************************************
DELAY1MS:
         MOV  R6,#5
DEL1:
         MOV  R7,#93
         DJNZ  R7,$
         DJNZ  R6,DEL1
         RET
	
;**********************************************************




;计数器T0中断服务程序
;**********************************************************
INT_T0:
	CLR EA		;关总中断
	PUSH ACC	; 保护现场
	PUSH PSW    ;
	DJNZ R5,RELOAD
    MOV R5,#100
	INC SEC
	MOV A,SEC
	CJNE A,#60,MIN_PROC
	MOV SEC,#0
	INC MIN
MIN_PROC:
	MOV A,MIN
	CJNE A,#60,HOU_PROC
	MOV MIN,#0
	INC HOU
HOU_PROC:
	MOV A,HOU
	CJNE A,#24,RELOAD
	MOV HOU,#0
RELOAD:
	MOV TH0,#0DCH	 	  ;重装计数初始值
	MOV TL0,#00H
	POP PSW
	POP ACC
	SETB EA
	RETI

;*********************************************************
;按键中断服务程序
;**********************************************************

INT_EX0:
	CLR EA
	CLR TR0
	PUSH  ACC          ;入栈保护
    PUSH  PSW
	INC R4				 ;改变工作模式
	CJNE R4,#4,NEXT1
	MOV R4,#0
	SETB TR0
NEXT1: 
	POP PSW
	POP ACC
	SETB EA
	RETI

	
;**********************************************************	
;计数器T1中断服务程序
;***********************************************************
INT_T1:
	CLR TR1
	DJNZ R3,INT_T1_END
	MOV R3,#25
	CPL BLINK
INT_T1_END:
	MOV TH1,#0DCH
	MOV TL1,#000H
	SETB TR1 
	RETI

	

;*********************************************************
;int1中断服务程序
;*********************************************************
INT_EX1:
	CLR EA
	PUSH ACC
	PUSH PSW
	MOV DPTR,#TAB_RUN
	MOV A,R4
	RL A
	JMP @A+DPTR
TAB_RUN:
	AJMP INT_EX1_END
	AJMP KL1
	AJMP KL2
	AJMP KL3
KL1:
	INC SEC
	MOV A,SEC
	CJNE A,#60,INT_EX1_END
	MOV SEC,#0
	AJMP INT_EX1_END
KL2:
	INC MIN
	MOV A,MIN
	CJNE A,#60,INT_EX1_END
	MOV MIN,#0
	AJMP INT_EX1_END
KL3:
	INC HOU
	MOV A,HOU
	CJNE A,#24,INT_EX1_END
	MOV HOU,#0
INT_EX1_END:
	POP PSW
	POP ACC
	SETB EA
	RETI

	

	

	   



;*********************************************************

TAB_NU:
    DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H
    DB 080H,090H,0BFH
TAB_B:
	DB 000H,003H,018H,0C0H
    
;*********************************************************

	END

;**********************************************************







⌨️ 快捷键说明

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