原创 时钟pcf8583的程序

2008-1-30 13:02 3316 7 7 分类: MCU/ 嵌入式

;*************************************************************************  PCF8583 PROGRAM
;*************************************************************************  PCF8583 PROGRAM
;         Read and Write
;**transtimation : i2c bus
;** interface: 2 line
;**            SCL---- siler clock
;**            SDA---- siler data           
;** 功能描述:器件地址:1 0 1 0 0 0 A0 R/-W
;**             A0 PIN接地时,器件地址=1010000x
;**           A0 PIN接高电平时,器件地址=1010001x
;** 调用模块: 模拟I2C BUS SUB
;** use register:   year month day hour minute second
;*******************************************************
PCF8583_INI   ;// 日历时钟方式
       ;// 计数,32。768khz ,读出月日计数值,禁止起闹,
        CLRF PCF8583_DATA
        CLRW
        MOVWF PCF8583_AD             ;   // 写入地址
        CALL PCF8583_WriteByte
        RETURN
;******************************************************
;** 函数名:Write a byte
;** 输 入: PCF8583_DATA    要写入的字节。
;**         PCF8583_AD      要写入PCF8583的地址
;** 输 出: NO
;** 功能描述:a byte 写入PCF8583
;** 全局变量:
;** 调用模块:模拟I2C BUS SUB
;** 作 者:lijun  leejun@qingdaonews.com
;** 日 期:2003/1/17
;** 版本  1.0
;******************************************************
PCF8583_WriteByte    
        CALL STA
        MOVLW B'10100010'   ;写器件地址。
        CALL WRBYT
        CALL CACK
       
        MOVF PCF8583_AD,W    ; 指定要写入pcf8583中的首地址。
        CALL WRBYT
        CALL CACK
             
        MOVF PCF8583_DATA,W   ;要写入的数据。
        CALL WRBYT
        CALL CACK
       
        CALL STOP
        RETURN
 ;/*******************************************************
;** 函数名:Read a byte
;** 输 入:PCF8583_AD           
;** 输 出: PCF8583_DATA    要读出的字节。
;** 功能描述:a byte 写入pcf8583
;** 调用模块:模拟I2C BUS SUB
;** 功能描述
;** 作 者:lijun  leejun@qingdaonews.com
;** 日 期:2003/1/17
;** 版本  1.0
;****************************************************************/
PCF8583_ReadByte
        CALL STA
        MOVLW B'10100010'     ;SLAW
        CALL WRBYT
        CALL CACK             ;A
       
        MOVF PCF8583_AD,W     ;Wordadr
        CALL WRBYT
        CALL CACK             ;A
       
        CALL STA              ;S
        MOVLW B'10100011'
        CALL WRBYT            ;SLAR
        CALL CACK             ;A
       
        CALL RDBYT            ;DATA1
        MOVWF PCF8583_DATA
        CALL MNACK            ;/A
        CALL STOP             ;P
        RETURN


;*******************************************************************/
;** 函数名:Write second.minute.hour.one_year.month.day
;** 输 入: second.minute.hour.one_year.month.day    (bcd码)       
;** 输 出:  no
;** 功能描述:把年.月.日.时.分.秒写入pcf8583
;** 调用模块:模拟I2C BUS SUB
;** 功能描述:one_year---年只需要0~3.
;** 作 者:lijun  leejun@qingdaonews.com
;** 日 期:2003/1/17
;** 版本  1.0
;******************************************************************* 
Write_ymdhms
     ;把年和日期和成一字节.
       CLC
       RLF one_year
       CLC
       RLF one_year
       CLC
       RLF one_year
       CLC
       RLF one_year
       CLC
       RLF one_year
       CLC
       RLF one_year
       
      ;;; OR one_year,day---》one_year 
        MOVF day,W
        IORWF one_year,1
       


     ;写入pcf8583
     CALL STA             ;S
     MOVLW B'10100010'
     CALL WRBYT           ;器件的地址
     CALL CACK
    
     MOVLW 02H         ;要写入的 Adress
     CALL WRBYT
     CALL CACK
    
     MOVF second,W  
     CALL WRBYT
     CALL CACK
    
     MOVF minute,W
     CALL WRBYT
     CALL CACK
    
     MOVF hour,W
     CALL WRBYT
     CALL CACK
    
     MOVF one_year,W    ;年和日期合成在一字节。
     CALL WRBYT
     CALL CACK
    
     MOVF month,W
     CALL WRBYT
     CALL CACK
    
     CALL STOP
    
      return



;*******************************************************************/
;** 函数名:Read second.minute.hour.one_year.month.day
;** 输 出: second.minute.hour.one_year.month.day           
;** 输 入: no 
;** 功能描述:从pcf8583中读出 年.月.日.时.分.秒
;** 调用模块:模拟I2C BUS SUB
;** 作 者:lijun  leejun@qingdaonews.com
;** 日 期:2003/1/17
;** 版本  1.0
;******************************************************************* 
Read_ymdhms
    CALL STA                ;S
    MOVLW B'10100010'       ;SLAW
    CALL WRBYT
    CALL CACK               ;A
   
    MOVLW 02H
    CALL WRBYT              ;Wordadr
    CALL CACK               ;A
   
    CALL STA                ;S
    MOVLW B'10100011'       ;SLAR
    CALL WRBYT
    CALL CACK               ;A
   
    CALL RDBYT              ;data1
    MOVWF second
    CALL MACK               ;A
   
    CALL RDBYT              ;data2
    MOVWF minute
    CALL MACK               ;A
   
    CALL RDBYT              ;data3
    MOVWF hour
    CALL MACK               ;A
   
    CALL RDBYT              ;data4  one_year + day
    MOVWF one_year
    CALL MACK               ;A
   
    CALL RDBYT              ;data5
    MOVWF month
    CALL MNACK              ;/A
    CALL STOP               ;P
   
 ;读出后数据要简单的处理. 年和日期要分开.月要屏蔽高3位.
       movf one_year,W
             
       ;and day,b'00111111'
        andlw b'00111111'
        movwf day
      
       CLC
       rrf one_year
       CLC
       rrf one_year
       CLC
       rrf one_year
       CLC
       rrf one_year
       CLC
       rrf one_year
       CLC
       rrf one_year
        ;and month,b'00011111'
       movf month,w
       andlw b'00011111'
       movwf month
      RETURN

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条