;================================================
;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
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中
;出口:无
;消耗资源: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 cnt,F
goto W_shift
return
;**********************************************************
;功 能:读1302一字节 (内部子程序)
;入口:无
;出口:数据保存在DS1302_RX中
;消耗资源:cnt(预先定义)
;**********************************************************
Read_byte
bsf STATUS,RP0 ;bank1
bsf TRISE,2 ;设置串行数据口为输入
bcf STATUS,RP0 ;bank0
MOVlw D’8’
MOVwf 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 cnt,F
goto R_shift
;reset output
bsf STATUS,RP0 ;bank1
bcf TRISE,2 ;设置T_IO为输出
bcf STATUS,RP0 ;bank0
return
这个程序一定要,PIC默认PORTA为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
上一篇:12864LCD带中文字库(PIC程序)
下一篇:pic单片机控制时钟芯片DS1302程序
推荐阅读最新更新时间:2024-03-16 15:48
设计资源 培训 开发板 精华推荐
- 【EEWORLD带你DIY】数字示波器V1.0进展贴
- 有奖下载Intel 最新白皮书《软件定义的联网和电信云端》
- ADI有奖下载活动之23:ADI民用无人机解决方案
- 有奖直播:TI 超低功耗 MCU 在触摸及智能化工业网关中的应用
- ST MEMS传感器交流论坛正式上线啦!
- 限时免费下载|NI《O-RAN简介》
- 安世半导体&世平集团 高效能&小型化, Nexperia MOSFET的5G解决方案 观看、下载 闯关赢好礼!
- ADI 系统方案精选【用于多路抽头输出隔离电源的简易解决方案】
- 是德科技 DATA Center 资料,满足您的需求~下载有好礼!
- 有奖直播|PI助力高可靠性与高效率的工业计量方案