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

📄 基于1302的数码管数字钟.asm

📁 适合初学者的用汇编语言写的基于1302的数码管数字钟的设计
💻 ASM
字号:
;*********************************************************************/
T_RST	Bit	P3.3 ;实时时钟复位线引脚
T_CLK	Bit	P3.4 ;实时时钟时钟线引脚
T_IO	Bit	P3.5 ;实时时钟数据线引脚
SECOND	EQU	30H
MINUTE	EQU	31H
HOUR	EQU	32H
DAY	EQU	33H
MONTH	EQU	34H
WEEK	EQU	35H
YEARL	EQU	36H
ONEBCD	EQU	37H
TENBCD	EQU	38H
;*********************************************************************/
        ORG	0000H
        LJMP	START
        ORG	0060H
START:  CLR     T_RST
        CLR     T_CLK
        MOV	SP,#60H
        MOV	SECOND,#00H
        MOV	MINUTE,#00H
        MOV	HOUR,#12H
        MOV	DAY,#01H
        MOV	MONTH,#01H
        MOV	WEEK,#01H
        MOV	YEARL,#08H
        LCALL	SET1302
        LCALL	GET1302
        LCALL	DISPLAY
MAIN:	MOV	R3,#20
        MOV	TMOD,#01H
        MOV	TH0,#0b8H		;置定时器初值
        MOV	TL0,#00H
        SETB	TR0				;启动定时器0
LP1:    JBC	TF0,LP2			;查询计数溢出
        SJMP	LP1				;未到50 ms继续计数
LP2:    MOV	TH0,#0B8H		;重新置定时器初值
        MOV	TL0,#00H
        LCALL	DISPLAY
        DJNZ	R3,LP1	        ;未到1 S继续循环
        LCALL	GET1302
        SJMP	MAIN
;---------------------------------------------------------------------------------
;数码管显示子程序
DISPLAY:
        MOV	DPTR,#DIG_CODE ;显示码表首地址
        MOV	A,SECOND		;取秒值
	ANL	A,#0FH			;取秒值个位数
        MOVC	A,@A+DPTR		;取秒值个位数显示码,并显示
        MOV	P2,A
        MOV	P1,#11011111B
        LCALL	DIS_DELAY
	MOV	A,SECOND		;取秒值十位数
	SWAP	A
	ANL	A,#07H
        MOVC	A,@A+DPTR    ;取秒十位数显示码,并显示
        MOV	P2,A
        MOV	P1,#11101111B
        LCALL 	DIS_DELAY
        MOV	A,MINUTE		;取分值个位
	ANL	A,#0FH
        MOVC	A,@A+DPTR		;取分值个位数显示码,并显示
        MOV	P2,A
        MOV	P1,#11110111B
        LCALL	DIS_DELAY
        MOV	A,MINUTE       ;取分值十位数显示码,并显示
	SWAP	A
	ANL	A,#07H
	MOVC	A,@A+DPTR
        MOV	P2,A
        MOV	P1,#11111011B
        LCALL	DIS_DELAY
	MOV	A,HOUR			;取小时值个位
	ANL	A,#0FH
        MOVC	A,@A+DPTR		;取小时个位数显示码,并显示
        MOV	P2,A
        MOV	P1,#11111101B
        LCALL	DIS_DELAY
        MOV	A,HOUR       	;取小时十位数显示码,并显示
	SWAP	A
	ANL	A,#03H
        MOVC	A,@A+DPTR
        MOV	P2,A
        MOV	P1,#11111110B
        LCALL	DIS_DELAY
        RET
;--------------------------------------------------------------------------------
;十位个位分离子程序
BINBCD:
        MOV	B,#10
        DIV	AB
        MOV	TENBCD,A        ;保存十位数
        MOV	ONEBCD,B        ;保存个位数
        RET
;----------------------------------------------------------------------------------------------------

;显示延时5MS
DIS_DELAY:
        PUSH	PSW
        MOV	R7,#10
D1:     MOV	R6,#248
D2:     DJNZ	R6,$
        DJNZ	R7,D1
        POP	PSW
        RET
;---------------------------------------------------------------------------------------------------
;字符显示码表
DIG_CODE:
        DB	0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H

;**********************************************************
;子程序名:SET1302
;功 能:设置DS1302 初始时间,并启动计时。
;调 用:RTINPUTBYTE
;入口参数:初始时间在:SECOND,MINUTE,HOUR,DAY,MONTH,WEEK,YEARL(地址连续)
;出口参数:无
;影响资源:A B R0 R1 R4 R7
;**********************************************************
SET1302:
        CLR	T_RST
        CLR	T_CLK
        SETB	T_RST
        MOV	B, #8EH ;控制寄存器
        LCALL	RTINPUTBYTE
        MOV	B, #00H ;写操作前WP=0
        LCALL	RTINPUTBYTE
        SETB	T_CLK
        CLR	T_RST
        MOV	R0, #SECOND;
        MOV	R7, #7 ;秒 分 时 日 月 星期 年
        MOV	R1, #80H ;秒写地址
S13021: CLR	T_RST
        CLR	T_CLK
        SETB	T_RST
        MOV 	B, R1 ;写秒 分 时 日 月 星期 年 地址
        LCALL	RTInputByte
        MOV	A, @R0 ;写秒数据
        MOV	B, A
        LCALL	RTInputByte
        INC	R0
        INC	R1
        INC	R1
        SETB	T_CLK
        CLR	T_RST
        DJNZ	R7, S13021
        CLR	T_RST
        CLR	T_CLK
        SETB	T_RST
        MOV	B, #8EH ;控制寄存器
        LCALL	RTInputByte
        MOV	B, #80H ;控制,WP=1,写保护
        LCALL	RTInputByte
        SETB	T_CLK
        CLR	T_RST
        RET
;**********************************************************
;子程序名:Get1302
;功 能:从DS1302 读时间
;说 明:
;调 用:RTInputByte,RTOutputByte
;入口参数:时间保存在:Second,Minute,Hour,Day,Month,Week.YearL
;出口参数:无 ;影响资源:A B R0 R1 R4 R7
;**********************************************************
Get1302:
        MOV	R0, #Second;
        MOV	R7, #7
        MOV	R1, #81H ;秒地址
G13021: CLR	T_RST
        CLR	T_CLK
        SETB	T_RST
        MOV	B, R1 ;秒 分 时 日 月 星期 年 地址
        LCALL	RTInputByte
        LCALL	RTOutputByte
        MOV	@R0, A ;秒
        INC	R0
        INC	R1
        INC	R1
        SETB	T_CLK
        CLR	T_RST
        DJNZ	R7, G13021
        RET
;**********************************************************
;功 能:写1302一字节 (内部子程序)
;**********************************************************
RTInputByte:
        MOV	R4, #8
Inbit1: MOV	A, B
        RRC	A
        MOV	B, A
        MOV	T_IO, C
        SETB	T_CLK
        CLR	T_CLK
        DJNZ	R4, Inbit1
        RET
;**********************************************************
;功 能:读1302一字节 (内部子程序)
;**********************************************************
RTOutputByte:
        MOV	R4, #8
Outbit1:MOV	C, T_IO
        RRC	A
        SETB	T_CLK
        CLR	T_CLK
        DJNZ	R4, Outbit1
        RET

        END

⌨️ 快捷键说明

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