#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 000H 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 TIME_WRITE_1 MOVLW B'00100101' MOVWF TIME_TX CALL TIME_WRITE_1 BCF RST
读秒,可以读任意7个时间,单字节 MOVLW B'10000001' MOVWF TIME_TX BSF RST CALL TIME_WRITE_1 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 TIME_WRITE_1 MOVLW B'0' ;允许写使能 MOVWF TIME_TX CALL TIME_WRITE_1;发送一个字节的数据 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 TIME_WRITE_1 ;TIME_WRITE_8 ;发送8个数据 MOVLW TIME_TX_ADD ;发送数据的起始地址 MOVWF FSR MOVLW D'8' MOVWF COUNT2 TW1 MOVF INDF,W MOVWF TIME_TX CALL TIME_WRITE_1 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 TIME_WRITE_1 ;TIME_READ_7 ;接收7个数据 MOVLW TIME_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 ;************************************************ TIME_WRITE_1 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 ;************************************************ |