;================================================ ;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 |
|