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

📄 pf8563.asm

📁 PF8563测试程序
💻 ASM
字号:

;=============================================================================
;系统时钟芯片PCF8563检测子程序
;=============================================================================
TEST_CLOCK:	CPL	WATCH_DOG
		CALL	READ_CLOCK
		JZ	TEST_CLOCK_01
		MOV	B,#0FFH
		DJNZ	B,$
		CALL	READ_CLOCK
		JZ	TEST_CLOCK_01
		MOV	B,#0FFH
		DJNZ	B,$
		CALL	READ_CLOCK
		JZ	TEST_CLOCK_01
		CALL	CLOCK_ERR
		CALL	DELAY_1S
		CALL	CLOCK_ERR
		CALL	DELAY_1S
		SJMP	TEST_CLOCK
TEST_CLOCK_01:	MOV	A,B
		CJNE	A,#0A5H,TEST_CLOCK_02
		RET
TEST_CLOCK_02:	CPL	WATCH_DOG
		MOV	B,#0FFH
		DJNZ	B,$
		CALL	READ_CLOCK
		JZ	TEST_CLOCK_03
		SJMP	TEST_CLOCK_02
TEST_CLOCK_03:	MOV	A,B
		CJNE	A,#0A5H,TEST_CLOCK_04
		RET
TEST_CLOCK_04:	CALL	CLOCK_ERR
		CALL	DELAY_1S
		CALL	CLOCK_ERR
		CALL	DELAY_1S
		CALL	CLOCK_INI
		CALL	READ_CLOCK
		JZ	TEST_CLOCK_05
		MOV	B,#0FFH
		DJNZ	B,$
		CALL	READ_CLOCK
		JZ	TEST_CLOCK_05
		MOV	B,#0FFH
		DJNZ	B,$
		CALL	READ_CLOCK
		JZ	TEST_CLOCK_05
		CALL	CLOCK_ERR
		CALL	DELAY_1S
		CALL	CLOCK_ERR
		CALL	DELAY_1S
		SJMP	TEST_CLOCK
TEST_CLOCK_05:	MOV	A,B
		CJNE	A,#0A5H,TEST_CLOCK_04
		RET	
CLOCK_ERR:	MOV	B,#CLOCK_ERR_CODE
		CALL	DISP_ERR
		CALL	SPEAK_ERR
		CALL	DELAY_1S
		RET
;=============================================================================
;系统时钟芯片PCF8563初始化子程序
;=============================================================================
CLOCK_INI:	MOV	SEC_BUFF,#00H		;送秒字节
		MOV	MINUTE_BUFF,#00H	;送分钟字节
		MOV	HOUR_BUFF,#00H		;送小时字节
		MOV	DAY_BUFF,#01H		;送日字节
		MOV	WEEK_BUFF,#04H		;送星期字节
		MOV	MONTH_BUFF,#01H		;送月字节	
		MOV	YEAR_BUFF,#04H		;送年字节
		CALL	WRITE_CLOCK
		JZ	CLOCK_INI_END
		CALL	DELAY_1S
		SJMP	CLOCK_INI
CLOCK_INI_END:	RET
;=============================================================================
;时钟芯片PCF8563的读取程序,读取成功A=00H,读取失败A=0FFH(3次失败后自动退出)
;=============================================================================
READ_CLOCK:	MOV	PROTECT_LOOP_BUFF,#1	;3
READ_CLOCK_LP:	CPL	WATCH_DOG
		CALL	RCVDATA			;读取时间并放入接收缓冲区中,测试标志放入B
		JNB	CLOCK_ERR_LABL,READ_CLOCK_LP1
		DJNZ	PROTECT_LOOP_BUFF,READ_CLOCK_LP
		CLR	CLOCK_ERR_LABL
		MOV	A,#0FFH
		SJMP	READ_CLOCK_END
READ_CLOCK_LP1:	MOV	A,#00H
READ_CLOCK_END:	RET
;=============================================================================
;时钟芯片PCF8563的写入程序,写入成功A=00H,写入失败A=0FFH(3次失败后自动退出)
;=============================================================================
WRITE_CLOCK:	MOV	PROTECT_LOOP_BUFF,#3
WRITE_CLOCK_LP:	CPL	WATCH_DOG
		CALL	SENDDATA		;写时间、控制条件及测试标志
		JNB	CLOCK_ERR_LABL,WRITE_CLOCK_LP1
		DJNZ	PROTECT_LOOP_BUFF,WRITE_CLOCK_LP
		CLR	CLOCK_ERR_LABL
		MOV	A,#0FFH
		SJMP	WRITE_CLOCK_END
WRITE_CLOCK_LP1:MOV	A,#00H
WRITE_CLOCK_END:RET
;=============================================================================
;发送数据程序
;名称:SENDDATA
;描述:发送数据给被控器PCF8563
;所发送的数据在时钟缓冲区中
;发送数据正常,返回标志CLOCK_ERR_LABL=0;CLOCK_ERR_LABL=1表示被控器无应答或损坏。
;=============================================================================
SENDDATA:	CALL	STARTI2C		;发送I2C 总线起始条件
		MOV	A,#0A2H			;送被控器总线地址
		CALL	SENTBYTE		;发送被控器总线地址
		JB	CLOCK_ERR_LABL,SENDRETURN;出错返回
		MOV	A,#00H			;取写入寄存器的首字节地址从00H 开始写
		CALL	SENTBYTE		;发送单元地址
		JB	CLOCK_ERR_LABL,SENDRETURN;出错返回
		MOV	A,#00H
		CALL	SENTBYTE		;发送启动时钟命令
		JB	CLOCK_ERR_LABL,SENDRETURN;出错返回
		MOV	A,#00H
		CALL	SENTBYTE		;发送不设置报警及定时器中断命令
		JB	CLOCK_ERR_LABL,SENDRETURN;出错返回
		MOV	A,SEC_BUFF
		CALL	SENTBYTE		;发送秒字节
		JB	CLOCK_ERR_LABL,SENDRETURN;出错返回
		MOV	A,MINUTE_BUFF
		CALL	SENTBYTE		;发送分钟字节
		JB	CLOCK_ERR_LABL,SENDRETURN;出错返回
		MOV	A,HOUR_BUFF
		CALL	SENTBYTE		;发送小时字节
		JB	CLOCK_ERR_LABL,SENDRETURN;出错返回
		MOV	A,DAY_BUFF
		CALL	SENTBYTE		;发送日字节
		JB	CLOCK_ERR_LABL,SENDRETURN;出错返回
		MOV	A,WEEK_BUFF
		CALL	SENTBYTE		;发送星期字节
		JB	CLOCK_ERR_LABL,SENDRETURN;出错返回
		MOV	A,MONTH_BUFF		
		CALL	SENTBYTE		;发送月字节
		JB	CLOCK_ERR_LABL,SENDRETURN;出错返回
		MOV	A,YEAR_BUFF
		CALL	SENTBYTE		;发送年字节
		JB	CLOCK_ERR_LABL,SENDRETURN;出错返回
		MOV	A,#0A5H
		CALL	SENTBYTE		;发送测试标志“#0A5H”字节
		JB	CLOCK_ERR_LABL,SENDRETURN;出错返回
		CALL	STOPI2C			;发送I2C 总线停止条件
DELAY10:	MOV	R7,#28H			;延时10ms,等待数据写完
		MOV	R6,#00H
D2:		DJNZ	R6,D2
		DJNZ	R7,D2
SENDRETURN:	RET
;=============================================================================
;接收数据程序;
;名称:RCVDATA
;描述:从被控器PCF8563接收数据
;所接收的数据在时钟缓冲区中
;接收数据正常,返回标志CLOCK_ERR_LABL=0;CLOCK_ERR_LABL=1表示被控器无应答或损坏
;=============================================================================
RCVDATA:	CALL	STARTI2C		;发送I2C总线起始条件
		MOV	A,#0A2H			;送被控器总线地址
		CALL	SENTBYTE		;发送被控器总线地址
		JB	CLOCK_ERR_LABL,RCVRETURN;出错返回
		MOV	A,#02H			;取读时间的首字节地址从秒开始读
		CALL	SENTBYTE		;发送单元地址
		JB	CLOCK_ERR_LABL,RCVRETURN;出错返回
		CALL	STARTI2C		;发送I2C总线重复起始条件
		MOV	A,#0A2H			;送被控器总线地址
		SETB	ACC.0			;取总线读操作位
		CALL	SENTBYTE		;发送被控器总线地址
		JB	CLOCK_ERR_LABL,RCVRETURN;出错返回
		CLR	CLOCK_ACK_LABL		;清接收非应答标志准备接收数据
		CALL	RCVBYTE			;接收数据	
		ANL	A,#7FH			;屏蔽无效位
		MOV	SEC_BUFF,A
		CALL	RCVBYTE			;接收数据	
		ANL	A,#7FH			;屏蔽无效位
		MOV	MINUTE_BUFF,A
		CALL	RCVBYTE			;接收数据	
		ANL	A,#3FH			;屏蔽无效位
		MOV	HOUR_BUFF,A
		CALL	RCVBYTE			;接收数据	
		ANL	A,#3FH			;屏蔽无效位
		MOV	DAY_BUFF,A
		CALL	RCVBYTE			;接收数据	
		ANL	A,#07H			;屏蔽无效位
		MOV	WEEK_BUFF,A
		CALL	RCVBYTE			;接收数据	
		ANL	A,#1FH			;屏蔽无效位
		MOV	MONTH_BUFF,A
		CALL	RCVBYTE			;接收数据	
		MOV	YEAR_BUFF,A		;取年字节
		SETB	CLOCK_ACK_LABL		;置接收非应答标志准备在接收完最后一个数据后发出非应答信
;						 号以停止接收数据
		CALL	RCVBYTE			;接收最后一个数据
		MOV	B,A			;将最后一个数据(测试标志)放入B中
		CALL	STOPI2C			;发送I2C 总线停止条件
RCVRETURN:	RET
;=============================================================================
; 延时5微秒子程序。(芯片PCF8563)
;=============================================================================
DELAY5US:	MOV	R7,#2			;22.1184MHz晶体
		DJNZ	R7,$
		RET
;=============================================================================
;名称:STARTI2C
;描述:启动I2C 总线子程序--发送I2C 起始条件(芯片PCF8563)
;=============================================================================
STARTI2C:	SETB	PCF8563_SDA		;发送起始条件的数据信号
		NOP
		SETB	PCF8563_SCL		;发送起始条件的时钟信号
		CALL	DELAY5US
		CLR	PCF8563_SDA		;发送起始信号
		CALL	DELAY5US
		CLR	PCF8563_SCL		;钳住I2C总线准备发送或接收数据
		RET
;=============================================================================
;名称:STOPI2C
;描述:停止I2C 总线子程序--发送I2C 总线停止条件(芯片PCF8563)
;=============================================================================
STOPI2C:	CLR	PCF8563_SDA		;发送停止条件的数据信号
		NOP
		SETB	PCF8563_SCL		;发送停止条件的时钟信号
		CALL	DELAY5US
		SETB	PCF8563_SDA		;发送I2C总线停止信号
		CALL	DELAY5US
		RET
;=============================================================================
;名称:SENTBYTE
;描述:字节数据传送子程序,发送一个字节数据或地址给被控器PCF8563
;要发送的数据在ACC中
;发送数据正常,返回标志CLOCK_ERR_LABL=0;CLOCK_ERR_LABL=1表示被控器无应答或损坏
;=============================================================================
SENTBYTE:	MOV	R2,#08H			;要传送的数据长度为8位
SENTB:		RLC	A			;要发送的数据左移,发送位入C
		JC	SENT1			;发送位为“1”转发送数据位“1”
		CLR	PCF8563_SDA		;发送数据位“0”
		JMP	SENT			;转发送数据位
SENT1:		SETB	PCF8563_SDA		;发送数据位“1”
		NOP
SENT:		NOP
		SETB	PCF8563_SCL		;置时钟线为高通知被控器开始接收数据位
		CALL	DELAY5US
		CLR	PCF8563_SCL		;钳住总线准备接收下一个数据位
		DJNZ	R2,SENTB		;8位没发送完继续发送
		NOP
		NOP
		SETB	PCF8563_SDA		;8位发送完后释放数据线准备收应答位
		NOP
		NOP
		SETB	PCF8563_SCL		;开始接收应答信号
		NOP
		NOP
		CLR	CLOCK_ERR_LABL		;预先清发送数据出错标志
		JNB	PCF8563_SDA, ACKEND	;判断是否接收到应答信号正常转ACKEND
		SETB	CLOCK_ERR_LABL		;未收到应答置位错误标志
ACKEND:		NOP
		CLR	PCF8563_SCL		;发送结束钳住总线准备下一步发送或接收数据或进行其它处理
		RET
;=============================================================================
;名称:RCVBYTE
;描述:字节数据接收子程序,从被控器PCF8563接收一个字节数据,然后根据主程序要求发送应答位
;接收的字节数据在ACC中
;=============================================================================
RCVBYTE:	SETB	PCF8563_SDA		;置数据线为输入方式
		MOV	R2,#08H			;要传送的数据长度为8位
RCV:		NOP
		CLR	PCF8563_SCL		;置时钟线为低准备接收数据位
		CALL	DELAY5US
		SETB	PCF8563_SCL		;置时钟线为高使数据线上数据有效
		NOP
		NOP
		CLR	C			;准备将接收的数据位放入ACC中
		JNB	PCF8563_SDA,RCV0	;读数据位若为“0”则置C=0并转RCV0接收数据位
		SETB	C			;读数据位若为“1”则置C=1
RCV0:		RLC	A			;接收的数据位放入ACC中
		NOP
		NOP
		DJNZ	R2,RCV			;8位没收完继续接收
		CLR	PCF8563_SCL		;8位接收完置时钟线和数据线为低准备发送应答或非应答信号
		NOP
		NOP
		NOP
		CLR	PCF8563_SDA
		JNB	CLOCK_ACK_LABL,SENTACKB	;判断是否需要继续接收字节数据若需要则转SENTACKB发送应答位
		SETB	PCF8563_SDA		;发送非应答信号
SENTACKB:	NOP				;以下程序发送应答位
		NOP
		SETB	PCF8563_SCL		;置时钟线为高使应答位有效
		CALL	DELAY5US
		CLR	PCF8563_SCL		;清时钟线钳住I2C总线以便继续接收字接数据或发送停止条件
		CLR	CLOCK_ACK_LABL		;清接收非应答标志
		RET
;==================================================================================
END

⌨️ 快捷键说明

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