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

📄 tpsz.asm

📁 89c51电子钟,运用12C887时钟模块及7219LED模块制作而成
💻 ASM
字号:
;GPS卫星同步时钟,文件名:TPSZ.ASM
;P1.0 MAX7219 数据线 DIN
;P1.1 MAX7219 时钟线 CLK
;P1.2 MAX7219 片选线 LOAD/CS
;P1.3 计数键 
;P1.4 右移键
;P1.5 设置键
;34H 时间调整缓存
;35H 时标缓存
;36H 显示地址缓存
;37H 双字节秒缓存
;38H 双字节分缓存
;39H 双字节时缓存
;3AH 3BH 3CH 3DH 3EH 3FH 调整时间交替显示缓存
;40H 41H 42H 43H 44H 45H 时间显示单字节缓存(40H 41H 秒,42H 43H 分, 44H 45H 时)
;47H 移动校时键移位指针缓存
;48H-4FH 指针时钟缓存
;50H-5FH 卫星时间缓存
		
;=================================================
                ORG 8000H
;================================================= 缓存清零
           MOV   40H,#00H		; 显示第一位缓存
           MOV   41H,#00H		; 显示第二位缓存
           MOV   42H,#00H		; 显示第三位缓存
           MOV   43H,#00H       ; 显示第四位缓存
           MOV   44H,#00H		; 显示第五位缓存
           MOV   45H,#00H		; 显示第六位缓存
           MOV   34H,#00H
           MOV   35H,#00H
           MOV   37H,#00H
           MOV   38H,#00H
           MOV   39H,#00H
	MOV A,8EH
	SETB ACC.1
	MOV 8EH,A
;=================================================
           AJMP  START 
;=================================================
START: 
                   MOV   SP,#07H        ;堆栈设定
                   MOV   A,#0AH	    	;LED初始化
                   MOV   R4,#02H
                   ACALL WRITE7219
                   MOV   A,#0BH
                   MOV   R4,#05H
                   ACALL WRITE7219
                   MOV   A,#09H
                   MOV   R4,#0FFH
                   ACALL WRITE7219
                   MOV   A,#0CH
                   MOV   R4,#01H
                   ACALL WRITE7219
; DS12C887初始化 =================================================                
; 开启振荡器和允许计时
                   PUSH  ACC
                   PUSH  DPH
                   PUSH  DPL
                   MOV   DPTR,#000AH
                   MOV   A,#00100000B
                   MOVX  @DPTR,A
; ;设定SET=1,禁止更新数据 
                   MOV   DPTR,#000BH
                   MOV   A,#10000000B
                   MOVX  @DPTR,A
; 设定秒
                   MOV   DPTR,#0000H
                   MOV   R0,#37H
                   MOV   A,@R0
                   MOVX  @DPTR,A
; 设定分
                   MOV   DPTR,#0002H
                   MOV   R0,#38H
                   MOV   A,@R0
                   MOVX  @DPTR,A
; 设定时
                   MOV   DPTR,#0004H
                   MOV   R0,#39H
                   MOV   A,@R0
                   MOVX  @DPTR,A
; 设定SET=0,BCD模式,24小时制
                   MOV   DPTR,#000BH
                   MOV   A,#00000010B
                   MOVX  @DPTR,A
                   POP   DPL
                   POP   DPH
                   POP   ACC
; 主程序===============================================
MAIN:
                   LCALL READTIME
                   LCALL RTOY
                   MOV   36H,#40H
                   LCALL DISPLAY
                   SETB  P1.5
                   ACALL DL
                   SETB  P1.5
                   JNB   P1.5,SETKEY
                   SETB  P1.5
                   NOP
                   NOP
                   AJMP  MAIN
READTIME: 
; 读取秒数据         
                   PUSH  ACC
                   PUSH  DPH
                   PUSH  DPL
                   MOV   DPTR,#0000H
                   MOVX  A,@DPTR
                   MOV   37H,A
; 读取分数据
                   MOV   DPTR,#0002H
                   MOVX  A,@DPTR
                   MOV   38H,A
; 读取时数据
                   MOV   DPTR,#0004H
                   MOVX  A,@DPTR
                   MOV   39H,A
                   POP   DPL
                   POP   DPH
                   POP   ACC
                   RET

; MAX7219 LED显示子程序 ===========================================
DISPLAY:
                   MOV   R0,36H
                   MOV   R1,#01H
                   MOV   R3,#06H
L2:
                   MOV   A,@R0
                   MOV   R4,A
                   MOV   A,R1
                   ACALL WRITE7219
                   INC   R0
                   INC   R1
                   DJNZ  R3,L2
                   RET

;MAX7219 发送地址数据子程序===========================================
SEND7219:
                   MOV   R2,#08H
L1:
                   NOP
                   NOP
                   CLR   P1.1
                   RLC   A
                   MOV   P1.0,C
                   NOP
                   NOP
                   SETB  P1.1
                   DJNZ  R2,L1
                   CLR   C
                   RET
;MAX7219 数据写入子程序===========================================
WRITE7219:
                   ACALL SEND7219
                   MOV   A,R4
                   ACALL SEND7219
                   CLR   P1.2
                   NOP
                   SETB  P1.2
                   NOP
                   RET
;双字节BCD码转换成单字节BCD码===========================================
RTOY:
                   MOV   R0,#37H
                   MOV   R1,#40H
                   MOV   R3,#03H
CBCD:
                   MOV   A,@R0
                   ANL   A,#0FH
                   MOV   @R1,A
                   INC   R1
                   MOV   A,@R0
                   SWAP  A
                   ANL   A,#0FH
                   MOV   @R1,A
                   INC   R0
                   INC   R1
                   DJNZ  R3,CBCD
                   RET
;键盘输入子程序===========================================
;设置键子程序
SETKEY:
                   AJMP  WYKEY
SETEXIT:
                   AJMP  START
; 位移功能键子程序
WYKEY:
                   MOV   47H,#00H
WYKEYY:
                   SETB  P1.4
                   SETB  P1.5
                   ACALL DL					;调用延时子程序
                   SETB  P1.4
                   SETB  P1.5
                   JNB   P1.5,SETEXIT
                   JNB   P1.4,KEYADD		        	;没有按下->KEYADD
KEYTEST:
                   MOV   A,47H
                   JZ    WYKEY1					;按第一下,转WYKEY1
                   CLR   C
                   SUBB  A,#03H
                   JZ    WYKEY2					;按第二下,转WYKEY2
                   CLR   C
                   SUBB  A,#03H
                   JZ    WYKEY3					;按第三下,转WYKEY3
WYKEY1:											;校时
                   MOV   34H,39H				;当前时间送调整缓存
                   MOV   35H,#24H				;时标送35H(最大23,24时清“0”,重新开始)
                   ACALL JSKEY					;调用时间调整子程序
                   MOV   39H,34H				;调整后的时间替换成当前时间
                   ACALL RTOY					;双字节BCD码转换成单字节BCD码
                   ACALL MOVE					;数据送入交替显示缓存
                   MOV   3EH,#0FH				;送消隐字低位
                   MOV   3FH,#0FH				;送消隐字高位
                   MOV   36H,#40H				;送正常显示地址
                   ACALL DISPLAY				;调用显示子程序
                   ACALL DL						;调用延时子程序
                   MOV   36H,#3AH				;送闪显地址
                   ACALL DISPLAY				;调用显示子程序
                   AJMP  WYKEYY
WYKEY2:								;校分
                   MOV   34H,38H
                   MOV   35H,#60H
                   ACALL JSKEY
                   MOV   38H,34H
                   ACALL RTOY
                   ACALL MOVE
                   MOV   3CH,#0FH
                   MOV   3DH,#0FH
                   MOV   36H,#40H
                   ACALL DISPLAY
                   ACALL DL
                   MOV   36H,#3AH
                   ACALL DISPLAY
                   AJMP  WYKEYY
WYKEY3:								;校秒
                   MOV   34H,37H
                   MOV   35H,#60H
                   ACALL JSKEY
                   MOV   37H,34H
                   ACALL RTOY
                   ACALL MOVE
                   MOV   3AH,#0FH
                   MOV   3BH,#0FH
                   MOV   36H,#40H
                   ACALL DISPLAY
                   ACALL DL
                   MOV   36H,#3AH
                   ACALL DISPLAY
                   AJMP  WYKEYY
KEYADD:
                   INC   47H
                   INC   47H
                   INC   47H
                   MOV   A,#09H
                   CLR   C
                   SUBB  A,47H
                   JZ    CLEAR
                   AJMP  KEYTEST
CLEAR:
                   MOV   47H,#00H
                   LJMP  WYKEYY
;===========================================
JSKEY:
                   SETB  P1.3
                   LCALL DL				
                   SETB  P1.3
                   JB    P1.3,JYEXIT				;按下计数,否则转移位
                   MOV   A,34H					;当前时间->A
                   ADD   A,#01H					;当前时间+1
                   DA    A					;BCD码调整为十进制
                   MOV   R5,A					;保存调整好的时间
                   CLR   C
                   SUBB  A,35H					;与时标进行相减比较
                   MOV   R1,34H					;当前时间->R1
                   JZ    ACLEAR					;相减后A中为“0”转移,调整的时间清零
                   MOV   A,R5					;恢复调整好的时间
                   MOV   34H,A					;调整后的时间为当前时间
                   AJMP  JYEXIT
ACLEAR:
                   MOV   34H,#00H
                   LJMP  JYEXIT

JYEXIT:
                   RET
;数据移动,使3AH与40H的内容交替显示,产生调整位闪亮的效果
MOVE:
                   MOV   3AH,40H
                   MOV   3BH,41H
                   MOV   3CH,42H
                   MOV   3DH,43H
                   MOV   3EH,44H
                   MOV   3FH,45H
                   RET
;延时子程序===========================================
DL:                MOV   R7,#0FFH
DL1:               MOV   R6,#0FFH
DL6:               DJNZ  R6,DL6
                   DJNZ  R7,DL1
                   RET 


                   END

⌨️ 快捷键说明

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