初学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