您的位置 首页 知识

时钟芯片DS1302的PIC程序

includep16f877.inc>CBLOCK20HSEC;秒MIN;分HOU;小时DATE;日期MON;月DAY;日YERR;年DDD;写使能位TIM…

include

CBLOCK 20H
SEC ;秒
MIN ;分
HOU ;小时
DATE ;日期
MON ;月
DAY ;日
YERR ;年
DDD ;写使能位
TIME_TX ;1302发送寄存器
TIME_RX ;1302接纳寄存器
COUNT1 ;
COUNT2 ;
DELAY1
DELAY2
ENDC

;=================================
;1302子程序阐明
; DS1302INI ;1302初始化,先制止RST,设定充电方法
; SET_TIME ;一次发送7个数据设定时刻,包括写使能寄存器,8个数据
; GET_TIME ;一次接纳7个数据显现时刻
; TIME_WRITE_1 ;一次写入1302一个字节
; TIME_READ_1 ;一次接纳一个字节数据

;============== 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 00H
NOP
GOTO MAIN
MAIN
CALL CLR_RAM ;铲除RAN
CALL PORT_INI ;端口界说
CALL DS1302_INI
CALL SET_TIME ; 一次写入7个时刻数据
CALL GET_TIME ; 一次读回7个时刻数据
GOTO $

;写入秒,能够写恣意的7个时刻数据,单字节
MOVLW B10000000
MOVWF TIME_TX
BSF RST
CALL CMD
MOVLW B00100101
MOVWF TIME_TX
CALL CMD
BCF RST

;读秒,能够读恣意7个时刻,单字节
MOVLW B10000001
MOVWF TIME_TX
BSF RST
CALL CMD
CALL TIME_READ_1
BCF RST
GOTO $

;**************************************************
; DS1302_INI:子程序
; 效果:初始化1302,先制止RST,答应写使能
;**************************************************
DS1302_INI
BCF SCLK
BCF RST ;先制止
MOVLW B10001110 ;写使能寄存器
MOVWF TIME_TX
BSF RST
CALL CMD
MOVLW B0 ;答应写使能
MOVWF TIME_TX
CALL CMD ;发送一个字节的数据
BCF RST

;设定充电方法 没有设定
RETURN

;**************************************************
; SET_TIME
; 效果:一次输入7个数据来一次性的设定时刻,一起使能写寄存器
; 突发形式写入,有必要写入8个数据,不是7个
; INPUT:要设定的8个数据现已写入到TIME_TX_ADD开端的8个字节里边
;**************************************************
SET_TIME
MOVLW B10111110 ;标志位
MOVWF TIME_TX
BSF RST
CALL CMD
;TIME_WRITE_8 ;发送8个数据
MOVLW TX_ADD ;//发送数据的开端地址
MOVWF FSR
MOVLW D8
MOVWF COUNT2
TW1
MOVF INDF,W
MOVWF TIME_TX
CALL CMD
INCF FSR,F
DECFSZ COUNT2,F
GOTO TW1
BCF RST
RETURN

;***********************************************
; GET_TIME
; 效果:一次承受7个字节的时刻数据,突发形式读取
; INPUT:NONE
; OUTPUT:把7个时刻数据保存在TIME_RX_ADD开端的7个寄存器里边
;***********************************************
GET_TIME
MOVLW B10111111
MOVWF TIME_TX
BSF RST
CALL CMD
;TIME_READ_7 ;接纳7个数据
MOVLW RX_ADD ;保存数据的开端地址
MOVWF FSR
MOVLW D7
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
; 效果:一次发送一个字节的数据,用于发送1302的
; 操控字或许发送一个数据
; INPUT: TIME_TX
;************************************************
CMD
MOVLW D8
MOVWF COUNT1
TLOP
BCF I_O ;初始值是低电平
BCF SCLK
BTFSC TIME_TX,0
BSF I_O
RRF TIME_TX,F
BSF SCLK ;高电平发送数据
DECFSZ COUNT1,F
GOTO TLOP
BCF SCLK ;康复
RETURN

;************************************************
; TIME_READ_1
; 效果:读取1302一个字节的数据
; INPUT: NONE
; OUTPUT:接纳数据保存在TIME_RX里边
; 原理:在SCLK下降沿接纳数据,低字节在前,依据I_O的
; 的电平的凹凸,采纳带进位和不带进位右移.
;***********************************************
TIME_READ_1
BANK1
BSF TRISC,7 ;I_O IS INPUT
BANK0
MOVLW D8
MOVWF COUNT1 ;读取8个字节
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

;======================================
PORT_INI
BANK1
MOVLW B00000000
MOVWF TRISC
MOVLW B0
MOVWF TRISB
MOVLW B00000111
MOVWF ADCON1
MOVLW B00000000
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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/326012.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部