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

📄 time.txt

📁 可调时钟单片机程序
💻 TXT
字号:
RTC	EQU	0200H		;定义MC146818起始地址=秒地址
LCDIR	EQU	0100H		;指令寄存器地址
LCDDR	EQU	0500H		;数据寄存器地址
RAM	EQU	20H		;寄存器RAM-20H
PTR	EQU	28H		;年月日时分秒位置的指针
	ORG	00H
	JMP	START
	ORG	13H
	JMP	EXT1		;INT1中断子程序

START:	MOV	SP,#60H		;设置堆栈
	MOV	RAM,#01H	;LCD清屏
	CALL	PUTIR
	CALL	DELAY1		;2MS
	MOV	RAM,#038H	;LCD功能设定,8位,2行显示
	CALL	PUTIR
	MOV	RAM,#0FH	;设定显示屏,光标ON,闪烁
	CALL	PUTIR
	MOV	RAM,#06H	;加1,光标向右移
	CALL	PUTIR
	MOV	PTR,#00		;位置指针为0,停在年
	MOV	IE,#084H	;TIMER1 INT1中断使能
	MOV	DPTR,#RTC+0AH	;A寄存器32.768KHZ
	MOV	A,#20H		;DV2=0,DV1=1,DV0=0
	MOVX	@DPTR,A
	MOV	DPTR,#RTC+0BH	;B寄存器SET=1,更新周期停止
	MOV	A,#80H
	MOVX	@DPTR,A
	MOV	DPTR,#RTC+0EH	;读取RTC 0E地址内容判断是否为3
	MOVX	A,@DPTR
	CJNE	A,#01H,START0
	JMP	START1
	
START0:	MOV	RAM,#080H	;不是则写入95/3/13 12:00:00
	CALL	PUTIR
	MOV	DPTR,#RTC	;秒地址写入00秒
	MOV	A,#00H
	MOV	@DPTR,A
	MOV	DPTR,@RTC+2	;00分
	MOV	A,#00H
	MOVX	@DPTR,A
	MOV	DPTR,#RTC+4	;12时
	MOV	A,#12H
	MOVX	@DPTR,A
	MOV	DPTR,#RTC+7	;13日
	MOV	A,#13H
	MOVX	@DPTR,A
	MOVX	@DPTR,#RTC+8	;3月
	MOV	A,#03H
	MOVX	@DPTR,A
	MOV	DPTR,#RTC+9	;95年
	MOV	A,#095H
	MOVX	@DPTR,A
	MOV	DPTR,#RTC+0EH	;RTC OE地址写入1,表示内部有时间值
	MOV	A,#01H
	MOVX	@DPTR,A
	MOV	DPTR,#TAB	;LCD显示内定日期时间
	CALL	PUTSTR
	JMP	START2
	
START1:	MOV	RAM,#080H	;是1表示RTC内有时间
	CALL	PUTIR		;光标在1行1格
	MOV	DPTR,#TAB1
	CALL	PUTIR		;LCD显示"19 : : "
SRATT2:	MOV	RAM,#082H	;光标停在年
	CALL	PUTIR
	MOV	DPTR,#RTC+0BH	;B寄存UIE=1RTC中断使能
	MOV	A,#12H
	MOV	@DPTR,A
	
LOOP:	JNB	P1.0,CUR0	;P1.0为1则光标位置加1
	JNB	P1.1,INC0	;P1.1为1则光标位置数加1
	JNB	P1.2.DEC0	;P1.2为1光标位置数减1
	JMP	LOOP
CUR0:	JMP	CUR1		;间接跳跃
INC0:	JMP	INC1
DEC0:	JMP	DEC1

CUR1:	CALL	DELAY		;按钮消除抖动
	JNB	P1.0,$		;检测按钮是否放开
	CALL	DELAY		;按钮消除抖动
	INC	PTR
	MOV	A,PTR		;读取位置指针
	CJNE	A,#06H,CUR10	;是否超过秒位置
	MOV	PTR,#00H
CUR10:	MOV	DPTR,#CUR	;指向LCD位置表
	MOVC	A,@A+DPTR	;依位置指针读取对应的光标地址
	MOV	RAM,A		;设定LCD光标地址
	CALL	PUTIR
	JMP	LOOP
	
INC1:	CALL	DELAY		;按钮消除抖动
	JNB	P1.1,$		;检测按键是否放开
	CALL	DELAY
	MOV	DPTR,#RTC+0BH	;B寄存器SET=1更新周期停止
	MOV	A,#080H		;进行时间设定
	MOVX	@DPTR,A
	MOV	DPTR,#TIM	;依位置指针读取该RTC地址存入20H
	MOV	A,PTR
	MOVC	A,@A+DPTR
	MOV	RAM,A
	MOV	DPTR,#MAX	;取该时间最大值存入21H
	MOV	A,PTR
	MOVC	A@A+DPTR
	MOV	RAM+1,A
	MOV	DPTR,#MIN	;取时间最小值存入22H
	MOV	A,PTR					
	MOVC	A,@A+DPTR
	MOV	RAM+2,A
	MOV	DPTR,#RTC	;读取(#RTC+RAM)地址内容
	MOV	DPL,RAM
	MOV	A,@DPTR
	CJNE	A,RAM+1,INC10	;是否=最大值,不是则跳INC10
	MOV	A,RAM+2		;是则存入最小值
	JMP	INC11
	
INC10:	ADD	A,#10H		;最大值+1,十进制调整
	DA	A
INC11:	MOVX	@DPTR,A		;写入RTC
	MOV	B,#10H		;将时间十进制十位个位拆开
	DIV	AB
	ADD	A,#'0'		;转换为ASCⅡ码送LCD显示
	MOV	RAM,A
	CALL	PUTICHR
	MOV	A,B
	ADD	A,#'0'
	MOV	RAM,A
	CALL	PUTCHR
	MOV	DPTR,#CUR	;光标回到原来位置
	MOV	A,PTR
	MOVC	A,@A+DPTR
	MOV	RAM,A
	CALL	PUTIR
	MOV	DPTR,#RTC+0BH	;B寄存器UIE=1,RTC中断使能计时
	MOV	A,#12H
	MOVX	@DPTR,A
	JMP	LOOP
	
DEC1:	CALL	DELAY		;消除抖动
	JNB	P1.2,$
	CALL	DELAY
	MOV	DPTR,#RTC+0BH	;B寄存器SET=1更新周期停止
	MOV	A,#080H		;进行时间设定
	MOVX	@DPTR,A
	MOV	DPTR,#TIM	;依位置指针读取该RTC地址存入20H
	MOV	A,PTR
	MOVC	A,@A+DPTR
	MOV	RAM,A
	MOV	DPTR,#MAX	;取该时间最大值存入21H
	MOV	A,PTR
	MOVC	A,@A+DPTR
	MOV	RAM+1,A
	MOV	DPTR,#MIN	;取该时间最小值存入22H
	MOV	A,PTR
	MOVC	A,@A+DPTR
	MOV	RAM+2,A
	MOV	DPTR,#RTC	;读取(#RTC+RAM)地址内容
	MOV	DPL,RAM
	MOVX	A,@DPTR
	MOV	RAM+3,A
	CJNE	A,RAM+2,DEC10	;是否为最小值,否则跳
	MOV	A,RAM+1		;是则存入最大值
	JMP	DEC12
	
DEC10:	ANL	A,#0FH		;检测个位数是否为0
	XRL	A,#00H
	JNZ	DEC11		;不为0跳DEC11
	MOV	A,RAM+3		;为0判RTC值减1-十位数减1,个位为9
	CLR	C
	SUBB	A,#07H
	JMP	DEC12
DEC11:	MOV	A,RAM+3		;不为0,读取RTC减1
	DEC	A
DEC12;	JMP	INC11

PUTIR:	CALL	BUSY		;写入指令子程序
	MOV	DPTR,#LCDIR	;检测忙碌标志位
	MOV	A,RAM		;LCD指令寄存器
	MOVX	@DPTR,A		;将RAM内容写入指令寄存器
	RET
	
PUTCHR:	CALL	BUSY		;显示字子程序
	MOV	DPTR,#LCDDR	;LCD数据寄存器
	MOV	A,RAM		;将RAM内容写入数据寄存器显示
	MOVX	@DPTR,A
	RET
	
PUTSTR:	MOV	R2.#00H		;显示字符串子程序,取字串的指针为0
PUTSTR1:MOV	A,R2		;载入字串指针值
	MOVC	A,@A+DPTR	;取字串数据码
	MOV	RAM,A		;写入RAM寄存器
	XRL	RAM,A		;是否取到结束码0
	JZ	PUTSTR2		;是否返回
	PUSH	DPH		;是则返回
	PUSH	DPL		;不是则压DPTR入栈,保存字符指针
	CALL	PUTCHR		;显示字串数据码
	INC	R2		;指向下一个数据码
	POP	DPL		;取回字串指针
	POP	DPH
	JMP	PUTSTR1
PUTSTR2:RET

BUSY:	MOV	DPTR,#LCDIR	;检测忙碌标志
BUSY1:	MOVX	A,@DPTR		;LCD指令寄存器
	ANL	A,#080H		;读忙碌标志位BIT7
	XRL	A,#080H		;BIT7=1?
	JZ	BUSY1		;是则在忙碌中
	RET
	
EXT1:	PUSH	ACC
	PUSH	PSW
	MOV	DPTR,#RTC+0CH	;读C寄存器,清中断标志位IRQF
	MOVX	A,@DPTR
	MOV	R2,#00
EXT10:	MOV	DPTR,#CUR	;依R2值读取光标地址
	MOV	A,R2
	MOVC	A,@A+DPTR
	MOV	RAM,A		;设定停在指定位置
	CALL	PUTIR
	MOV	DPTR,#TIM	;依R2值读取RTC内部地址
	MOV	A,R2
	MOVC	A,@A+DPTR
	MOV	DPTR,#RTC	;DPTR指向#RTC外部地址
	MOV	DPL,A		;DPTR=#RTC+OFFSET地址
	MOVX	A,@DPTR		;读取该地址内容
	MOV	B,#10H		;十位个位分开
	DIV	AB
	ADD	A,#'0'		;十位数转换后送LCD显示
	MOV	RAM,A
	CALL	PUTCHR
	MOV	A,B		;个位数转换后送LCD显示
	ADD	A,#'0'
	MOV	RAM,A
	CALL	PUTCHR
	INC	R2		;指向下一组时间
	CJNE	R2,#06H,EXT10
	MOV	DPTR,#CUR	;光标回原位置
	MOV	A,PTR
	MOVC	A,@A+DPTR
	MOV	RAM,A
	CALL	PUTIR
	POP	PSW
	POP	ACC
	RETI
	
DELAY:	MOV	R6,#60		;延时30MS
D1:	MOV	R7,#248
	DJNZ	R7,$
	DJNZ	R6,D1
	RET
DELAY1:	MOV	R6,#4		;延时2MS
D11:	MOV	R7,#248
	DJNZ	R7,$
	DJNZ	R6,D11
	RET

TAB:	DB	'1995 03 13 12:00:00',00H	;内定时间 						
TAB1:	DB	'1995               ',00H 	;LCD屏幕显示
TIM:	DB	09H,08H,07H,04H,02H,00H		;RTC时间地址
CUR:	DB	82H,85H,88H,8BH,8EH,91H		;LCD时间地址
MAX:	DB	99H,12H,31H,23H,59H,59H		;时间最大值
MIN:	DB	00H,01H,01H,00H,00H,00H		;时间最小值
	END

⌨️ 快捷键说明

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