#INCLUDE CBLOCK 20H SEC ;秒 MIN ;分 HOU ;小時 DATE ;日期 MON ;月 DAY ;日 YERR ;年 DDD ;寫使能位 TIME_TX ;1302發(fā)送寄存器 TIME_RX ;1302接收寄存器 COUNT1 ; COUNT2 ; DELAY1 DELAY2 ENDC ******************************* ; ; 1302子程序說明 ; ;****************************** ; DS1302INI ;1302初始化,先禁止RST,設定充電方式 ; SET_TIME ;一次發(fā)送7個數據設定時間,包含寫使能寄存器,8個數據 ; GET_TIME ;一次接收7個數據顯示時間 ; TIME_WRITE_1;一次寫入1302一個字節(jié) ; TIME_READ_1 ;一次接收一個字節(jié)數據 ; ;******* 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個時間數據,單字節(jié) 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個時間,單字節(jié)
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;發(fā)送一個字節(jié)的數據 BCF RST
;設定充電方式
沒有設定 RETURN
;************************************************** ; SET_TIME ; 作用:一次輸入7個數據來一次性的設定時間,同時使能寫寄存器 ; 突發(fā)模式寫入,必須寫入8個數據,不是7個 ; INPUT:要設定的8個數據已經寫入到TIME_TX_ADD開始的8個字節(jié)里面 ;************************************************** SET_TIME MOVLW B'10111110' ;標志位 MOVWF TIME_TX BSF RST CALL TIME_WRITE_1 ;TIME_WRITE_8 ;發(fā)送8個數據 MOVLW TIME_TX_ADD ;發(fā)送數據的起始地址 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個字節(jié)的時間數據,突發(fā)模式讀取 ; 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 ; 作用:一次發(fā)送一個字節(jié)的數據,用于發(fā)送1302的 ; 控制字或者發(fā)送一個數據 ; 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 ;高電平發(fā)送數據 DECFSZ COUNT1,F GOTO TLOP BCF SCLK ;恢復 RETURN ;************************************************ ; TIME_READ_1 ; 作用:讀取1302一個字節(jié)的數據 ; INPUT: NONE ; OUTPUT:接收數據保存在TIME_RX里面 ; 原理:在SCLK下降沿接收數據,低字節(jié)在前,根據I_O的 ; 的電平的高低,采取帶進位和不帶進位右移. ;*********************************************** TIME_READ_1 BANK1 BSF TRISC,7 ;I_O IS INPUT BANK0 MOVLW D'8' MOVWF COUNT1 ;讀取8個字節(jié) 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 NOP
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
|
|