用户工具

站点工具


micropython:mpy-lib:misc:pcf8563实时时钟

PCF8563实时时钟

PCF8563 是一款低功耗的 CMOS 1 实时时钟/日历芯片,支持可编程时钟输出、中断输出和低压检测。所有地址和数据通过双线双向 I2C 总线串联传输,最高速率:400 kbps。每次读写数据字节后,寄存器地址自动累加。

主要特点

  • 基于 32.768kHz 的晶振,提供年、月、日、星期、时、分和秒计时
  • Century flag
  • 时钟工作电压:1.0 - 5.5 V(室温)
  • 低备用电流;典型值为 0.25 μA(V DD = 3.0 V,T amb =25 °C)
  • 400 kHz 双线 I 2 C 总线接口(V DD = 1.8 - 5.5 V)
  • 可编程时钟输出(32.768 kHz、1.024 kHz、32 Hz 和 1Hz)
  • 报警和定时器功能
  • 集成晶振电容器
  • 内部上电复位(POR)
  • 开漏中断管脚
地址 寄存器
7 6 5 4 3 2 1 0
控制和状态寄存器
00h Controlstatus1 TEST1 N STOP N TESTC N N N
01h Controlstatus2 N N N TITP | AF | TF | AIE | TIE | | 时间和数据寄存器 |||||||||| | 02h | VLseconds VL 秒(0~59)
03h 分钟 X 分钟(0~59)
04h 小时 X X 小时(0~23)
05h X X 天(1~31)
06h 周天数 X X X X X 周天数(0~6)
07h 世纪 月 C X X 月(1~12)
08h 年(0~99)
报警寄存器
09h Minutealarm | AEM MINUTEALARM(0~59) ||||||| | 0Ah | Houralarm AEH | X | HOURALARM(0~23)
0Bh Dayalarm | AED X DAYALARM(1~31) |||||| | 0Ch | Weekdayalarm AEW | X | X | X | X | WEEKDAYALARM(0~6)
CLKOUT 控制寄存器
0Dh CLKOUTcontrol | FE | X | X | X | X | X | FD[1:0] || | 定时器寄存器 |||||||||| | 0Eh | Timercontrol TE X X X X X TD[1:0
0Fh 定时器 定时器[7:0]
pcf8563.py
'''
    PCF8563 RTC drive
 
    Author: shaoziyang
    Date:   2021.1
 
    http://www.micropython.org.cn
'''
from micropython import const
 
PCF8563_I2C_ADDRESS  = const(81)
PCF8563_REG_CTRL1    = const(0)
PCF8563_REG_CTRL2    = const(1)
PCF8563_REG_SECOND   = const(2)
PCF8563_REG_MINUTE   = const(3)
PCF8563_REG_HOUR     = const(4)
PCF8563_REG_WEEKDAY  = const(6)
PCF8563_REG_DAY      = const(5)
PCF8563_REG_MONTH    = const(7)
PCF8563_REG_YEAR     = const(8)
 
class PCF8563():
    def __init__(self, i2c):
        self.i2c = i2c
        self.tb = bytearray(1)
        self.rb = bytearray(1)
        self.buf = bytearray(7)
        self.DT = [0] * 8
 
    # set reg
    def	setReg(self, reg, dat):
        self.tb[0] = dat
        self.i2c.writeto_mem(PCF8563_I2C_ADDRESS, reg, self.tb)
 
    # get reg
    def	getReg(self, reg):
        self.i2c.readfrom_mem_into(PCF8563_I2C_ADDRESS, reg, self.rb)
        return self.rb[0]
 
    def DecToHex(self, dat):
        return (dat//10) * 16 + (dat%10)
 
    def HexToDec(self, dat):
        return (dat//16) * 10 + (dat%16)
 
    def year(self, year = None):
        if year == None:
            return self.HexToDec(self.getReg(PCF8563_REG_YEAR)) + 2000
        else:
            self.setReg(PCF8563_REG_YEAR, self.DecToHex(year%100))
 
    def month(self, month = None):
        if month == None:
            return self.HexToDec(self.getReg(PCF8563_REG_MONTH)%32)
        else:
            self.setReg(PCF8563_REG_MONTH, self.DecToHex(month%13))
 
    def day(self, day = None):
        if day == None:
            return self.HexToDec(self.getReg(PCF8563_REG_DAY)%64)
        else:
            self.setReg(PCF8563_REG_DAY, self.DecToHex(day%32))
 
    def weekday(self, weekday = None):
        if weekday == None:
            return self.HexToDec(self.getReg(PCF8563_REG_WEEKDAY)%8)
        else:
            self.setReg(PCF8563_REG_WEEKDAY, self.DecToHex(weekday%8))
 
    def hour(self, hour = None):
        if hour == None:
            return self.HexToDec(self.getReg(PCF8563_REG_HOUR)%64)
        else:
            self.setReg(PCF8563_REG_HOUR, self.DecToHex(hour%24))
 
    def minute(self, minute = None):
        if minute == None:
            return self.HexToDec(self.getReg(PCF8563_REG_MINUTE)%128)
        else:
            self.setReg(PCF8563_REG_MINUTE, self.DecToHex(minute%60))
 
    def second(self, second = None):
        if second == None:
            return self.HexToDec(self.getReg(PCF8563_REG_SECOND)%128)
        else:
            self.setReg(PCF8563_REG_SECOND, self.DecToHex(second%60))
 
    def datetime(self, DT=None):
        if DT == None:
            self.i2c.readfrom_mem_into(PCF8563_I2C_ADDRESS, PCF8563_REG_SECOND, self.buf)
            self.DT[0] = self.HexToDec(self.buf[6]) + 2000
            self.DT[1] = self.HexToDec(self.buf[5]%32)
            self.DT[2] = self.HexToDec(self.buf[3]%64)
            self.DT[3] = self.HexToDec(self.buf[4]%8)
            self.DT[4] = self.HexToDec(self.buf[2]%64)
            self.DT[5] = self.HexToDec(self.buf[1]%128)
            self.DT[6] = self.HexToDec(self.buf[0]%128)
            self.DT[7] = 0
            return self.DT
        else:
            self.buf[0] = self.DecToHex(DT[6]%60)    # second
            self.buf[1] = self.DecToHex(DT[5]%60)    # minute
            self.buf[2] = self.DecToHex(DT[4]%24)    # hour
            self.buf[3] = self.DecToHex(DT[2]%32)    # date
            self.buf[4] = self.DecToHex(DT[3]%8)     # week day
            self.buf[5] = self.DecToHex(DT[1]%13)    # month
            self.buf[6] = self.DecToHex(DT[0]%100)   # year
            self.i2c.writeto_mem(PCF8563_I2C_ADDRESS, PCF8563_REG_SECOND, self.buf) 
 


purge    随机主题   
micropython/mpy-lib/misc/pcf8563实时时钟.txt · 最后更改: 2021/02/28 23:12 (外部编辑) · 查看次数: 15082