www.pudn.com > DS1302_Dri.rar > ds1302.asm


;时钟芯片DS1302汇编程序  《PIC接口技术》王有绪P213有参考资料  
 
	include  
 
 	CBLOCK 20H 
 	SEC  	;秒 
 	MIN  	;分 
 	HOU  	;小时 
 	DATE 	;日期 
 	MON  	;月 
	DAY  	;日 
 	YERR 	;年 
 	DDD  	;写使能位 
 	TIME_TX ;1302发送寄存器 
 	TIME_RX ;1302接收寄存器 
 	COUNT1 	; 
 	COUNT2 	; 
 	DELAY1 
 	DELAY2 
 	ENDC 
 
;================================= 
;1302子程序说明 
; DS1302INI 	;1302初始化,先禁止RST,设定充电方式 
; SET_TIME 	;一次发送7个数据设定时间,包含写使能寄存器,8个数据 
; GET_TIME 	;一次接收7个数据显示时间 
; TIME_WRITE_1	;一次写入1302一个字节 
; TIME_READ_1 	;一次接收一个字节数据 
 
;============== 1302定义 =================== 
#DEFINE I_O  	PORTC,7 	;1302I_O 
#DEFINE SCLK 	PORTC,6 	;1302时钟 
#DEFINE RST  	PORTA,0 	;1302使能位 
#DEFINE RX_ADD 	40H  	;保存接受的7个数据 
#DEFINE TX_ADD 	20H  	;开始保存7个要写入的时间数据 
BANK1 MACRO 
 	BSF  	STATUS,RP0 
 	ENDM 
BANK0 MACRO 
 	BCF  	STATUS,RP0 
 	ENDM 
 
;====================================== 
	ORG  	00H 
 	NOP 
 	GOTO 	MAIN 
MAIN  
 	CALL  	CLR_RAM 	;清除RAN 
 	CALL 	PORT_INI  	;端口定义 
 	CALL 	DS1302_INI 
 	CALL 	SET_TIME 	; 一次写入7个时间数据 
 	CALL 	GET_TIME 	; 一次读回7个时间数据 
 	GOTO 	$ 
 
 
;写入秒,可以写任意的7个时间数据,单字节 
 	MOVLW 	B'10000000' 
 	MOVWF 	TIME_TX 
 	BSF  	RST 
 	CALL 	CMD 
 	MOVLW 	B'00100101' 
 	MOVWF 	TIME_TX 
 	CALL 	CMD 
 	BCF  	RST 
 
;读秒,可以读任意7个时间,单字节 
 	MOVLW 	B'10000001' 
 	MOVWF 	TIME_TX 
 	BSF  	RST 
 	CALL 	CMD 
  	CALL 	TIME_READ_1 
 	BCF  	RST     
	GOTO 	$ 
 
;************************************************** 
; DS1302_INI:子程序 
; 作用:初始化1302,先禁止RST,允许写使能 
;************************************************** 
DS1302_INI 
 	BCF  	SCLK 
 	BCF  	RST   		;先禁止 
 	MOVLW 	B'10001110' 	;写使能寄存器 
 	MOVWF 	TIME_TX 
 	BSF  	RST 
 	CALL 	CMD 
 	MOVLW 	B'0'  		;允许写使能 
 	MOVWF 	TIME_TX 
 	CALL 	CMD		;发送一个字节的数据 
 	BCF  	RST 
  
;设定充电方式  没有设定 
 	RETURN   
  
;************************************************** 
; SET_TIME      
; 作用:一次输入7个数据来一次性的设定时间,同时使能写寄存器 
; 突发模式写入,必须写入8个数据,不是7个 
; INPUT:要设定的8个数据已经写入到TIME_TX_ADD开始的8个字节里面 
;************************************************** 
SET_TIME    
   	MOVLW 	B'10111110' ;标志位 
 	MOVWF 	TIME_TX 
 	BSF  	RST   
 	CALL 	CMD 
	;TIME_WRITE_8   	;发送8个数据 
 	MOVLW 	TX_ADD  ;//发送数据的起始地址 
 	MOVWF 	FSR 
 	MOVLW 	D'8' 
 	MOVWF 	COUNT2 
TW1 
 	MOVF 	INDF,W 
 	MOVWF 	TIME_TX 
 	CALL 	CMD 
 	INCF 	FSR,F 
 	DECFSZ 	COUNT2,F 
 	GOTO 	TW1 
 	BCF  	RST 
 	RETURN  
 
;*********************************************** 
; GET_TIME   
; 作用:一次接受7个字节的时间数据,突发模式读取 
; INPUT:NONE 
; OUTPUT:把7个时间数据保存在TIME_RX_ADD开始的7个寄存器里面 
;*********************************************** 
GET_TIME     
    	MOVLW 	B'10111111' 
 	MOVWF 	TIME_TX 
 	BSF  	RST 
 	CALL 	CMD 
	;TIME_READ_7   		;接收7个数据 
 	MOVLW 	RX_ADD  	;保存数据的起始地址 
 	MOVWF 	FSR 
 	MOVLW 	D'7' 
 	MOVWF 	COUNT2 
TR2 
 	CALL 	TIME_READ_1 
 	MOVF 	TIME_RX,W 
 	MOVWF 	INDF 
 	INCF 	FSR,F 
 	DECFSZ 	COUNT2,F 
 	GOTO 	TR2 
 	BCF  	RST 
 	RETURN 
 
;************************************************ 
; TIME_WRITE_1 
; 作用:一次发送一个字节的数据,用于发送1302的 
; 控制字或者发送一个数据 
; INPUT: TIME_TX 
;************************************************ 
CMD 
 	MOVLW D'8' 
 	MOVWF COUNT1 
TLOP 
 	BCF  	I_O   	;初始值是低电平 
 	BCF  	SCLK 
 	BTFSC 	TIME_TX,0 
 	BSF  	I_O 
 	RRF  	TIME_TX,F 
 	BSF  	SCLK  	;高电平发送数据 
 	DECFSZ 	COUNT1,F 
 	GOTO 	TLOP 
 	BCF  	SCLK  	;恢复 
 	RETURN 
 
;************************************************ 
; TIME_READ_1 
; 作用:读取1302一个字节的数据 
; INPUT: NONE 
; OUTPUT:接收数据保存在TIME_RX里面 
; 原理:在SCLK下降沿接收数据,低字节在前,根据I_O的 
;    的电平的高低,采取带进位和不带进位右移. 
;*********************************************** 
TIME_READ_1 
 	BANK1 
 	BSF  	TRISC,7 	;I_O  IS INPUT 
 	BANK0 
 	MOVLW 	D'8' 
 	MOVWF 	COUNT1 		;读取8个字节 
TR1 
 	BCF  	SCLK 		;下降沿读取 
 	BCF  	STATUS,C 
 	BTFSC 	I_O 
 	BSF  	STATUS,C 
 	RRF  	TIME_RX,F 
 	BSF  	SCLK 		;恢复高电平 
 	DECFSZ 	COUNT1,F 
 	GOTO 	TR1 
 	BANK1 
 	BCF  	TRISC,7 	;OUTPUT 
 	BANK0 
 	BCF  	SCLK 		;恢复 
 	RETURN 
 
;====================================== 
PORT_INI 
 	BANK1 
 	MOVLW 	B'00000000' 
 	MOVWF 	TRISC 
 	MOVLW 	B'0' 
 	MOVWF 	TRISB 
 	MOVLW 	B'00000111' 
 	MOVWF 	ADCON1 
 	MOVLW 	B'00000000' 
 	MOVWF 	TRISA 
 	BANK0 
 	MOVLW 	18H 
 	MOVWF 	20H 
 	MOVLW 	19H 
 	MOVWF 	21H 
 	MOVLW 	05H 
 	MOVWF 	22H 
 	MOVLW 	13H 
 	MOVWF 	23H 
 	MOVLW 	14H 
 	MOVWF 	24H 
 	MOVLW 	15H 
 	MOVWF 	25H 
 	MOVLW 	16H 
 	MOVWF 	26H 
 	RETURN 
 
;========================== 
CLR_RAM 
  	MOVLW 	20H 
  	MOVWF 	FSR 
LOOP  
  	CLRF 	INDF 
  	INCF 	FSR,F 
  	BTFSS 	FSR,7 
  	GOTO 	LOOP 	;清除32个 
  	RETURN 
;========================== 
 	END