?? pic16f877控制ds1302時間芯片.txt
字號:
初學PIC,原來是搞51的.寫了個程序,經過幾天辛苦調試,終于在PIC16F877上運行通過,特此發布,算我初學PIC給大家見面禮,呵呵,希望能有用.
;================================================
;DS1302控制子程序
;=================================================
;程序包括:DS1302初始化,時間數據寫入和讀取程序
;DS1302_init ;init ds1302
;Set_DS1302 ;set time to ds1302
;Get_DS1302 ;get time from ds1302
;=================================================
;============== 1302定義 ===========================================
#DEFINE T_IO PORTE,2 ;1302 I_O
#DEFINE T_CLK PORTE,1 ;1302時鐘
#DEFINE T_RST PORTE,0 ;1302使能位
#DEFINE DS1302_RX 20H ;保存接受的1個數據
#DEFINE DS1302_TX 28H ;準備寫入到DS1302的一個數據
counter equ xxxh
temp_cnt equ xxxh
;**************************************************
; DS1302初始化程序
;**************************************************
DS1302_init
;未寫
return
;**********************************************************
;子程序名:Set_DS1302
;功 能:設置DS1302 初始時間,并啟動計時。
;說 明:
;調 用:Write_byte
;入口參數:初始時間在:W_Second,W_Minute,W_Hour,W_Day,W_Month,W_Week.W_YearL(地址連續)
;出口參數:無
;消耗資源:counter,SecAddr(預定義)
;設 計:zhengYanbo 日 期:2005.4.21
;修 改: 日 期:
;**********************************************************
Set_DS1302:
bcf T_RST
bcf T_CLK
bsf T_RST
movlw 8eh
movwf DS1302_TX ;數據發送寄存器
call Write_byte ;發送字節
movlw 00h ;WP=0
movwf DS1302_TX
call Write_byte
bsf T_CLK
bcf T_RST
movlw W_Second
movwf FSR
movlw counter,D'7'
movlw 80h
movwf SecAddr ;秒寫地址
S13021:
bcf T_RST
bcf T_CLK
bsf T_RST
movf SecAddr,W
movwf DS1302_TX
call Write_byte ;寫秒地址
movf INDF,W
movwf DS1302_TX
call Write_byte ;寫秒數據
incf FSR
incf SecAddr
incf SecAddr
bsf T_CLK
bcf T_RST
decfsz counter,F
goto S13021
bcf T_RST
bcf T_CLK
bsf T_RST
movlw 8eh ;控制寄存器
movwf DS1302_TX
call Write_byte
movlw 80h ;控制WP=1,寫保護
movwf DS1302_TX
call Write_byte
bsf T_CLK
bcf T_RST
return
;**********************************************************
;子程序名:Get_DS1302
;功 能:從DS1302 讀時間
;說 明:
;調 用:Write_byte,Read_byte
;入口參數:時間保存在:R_Second,R_Minute,R_Hour,R_Day,R_Month,R_Week.R_YearL
;出口參數:無
;消耗資源: counter,SecAddr(預先定義)
;設 計:zhengYanbo 日 期:2005.4.21
;修 改: 日 期:
;**********************************************************
Get_DS1302:
movlw R_Second ;準備地址
movwf FSR
movlw D'7'
movwf counter
movlw 81h ;秒讀地址
movwf SecAddr
G13021
bcf T_RST
bcf T_CLK
bsf T_RST
movf SecAddr,W
movwf DS1302_TX
call Write_byte
call Read_byte
movf DS1302_RX,W
movwf INDF
incf FSR
incf SecAddr
incf SecAddr
bsf T_CLK
bcf T_RST
decfsz counter,F ;接受7個數據
goto G13021
return
;**********************************************************
;功 能:寫1302一字節 (內部子程序)
;入口:數據預先在DS1302_TX中
;出口:無
;消耗資源:temp_cnt(預先定義)
;**********************************************************
Write_byte
movlw D'8'
movwf tmp_cnt
W_shift
rrf DS1302_TX,F ;帶C移位(低位在前)
btfsc STATUS,C
goto send_1
bcf T_IO
goto send_0
send_1
bsf T_IO
send_0
bsf T_CLK ;上升沿寫
nop
bcf T_CLK
decfsz temp_cnt,F
goto W_shift
return
;**********************************************************
;功 能:讀1302一字節 (內部子程序)
;入口:無
;出口:數據保存在DS1302_RX中
;消耗資源:temp_cnt(預先定義)
;**********************************************************
Read_byte
bsf STATUS,RP0 ;bank1
bsf TRISE,2 ;設置串行數據口為輸入
bcf STATUS,RP0 ;bank0
movlw D'8'
movwf temp_cnt
R_shift
btfsc T_IO
goto get_1
bcf STATUS,C ;clr c
goto get_0
get_1
bsf STATUS,C
get_0
rrf DS1302_RX,F
bsf T_CLK
nop
bcf T_CLK ;下降沿讀
decfsz temp_cnt,F
goto R_shift
;reset output
bsf STATUS,RP0 ;bank1
bcf TRISE,2 ;設置T_IO為輸出
bcf STATUS,RP0 ;bank0
return
這個程序一定要,PIC默認PORTE為A/D口,切記,切記!改為其他口時候請參考PIC的DATASHEET
;=============================================
; 初始化端口
;=============================================
Port_Init
bsf STATUS,RP0 ;bank1
bcf ADCON1,PCFG0
bsf ADCON1,PCFG1
bsf ADCON1,PCFG2
bcf ADCON1,PCFG3 ;PORTA and PORTE:digital I/O
bcf STATUS,RP0 ;bank0
return
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -