Skip to content

Commit ebcaa5d

Browse files
committed
add pcf8653 RTC drive
1 parent bbd9023 commit ebcaa5d

File tree

2 files changed

+110
-0
lines changed

2 files changed

+110
-0
lines changed

misc/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
* [AT24XX EEPROM drive](AT24XX)
77
* [UART with rxd irq](irqUART)
88
* [MCP401x 7-Bit Digital POT](MCP401x)
9+
* [PCF8653 RTC drive](pcf8653)
910

1011
From microbit/micropython Chinese community.
1112
www.micropython.org.cn

misc/pcf8563/pcf8563.py

+109
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
'''
2+
PCF8563 RTC drive
3+
4+
Author: shaoziyang
5+
Date: 2021.1
6+
7+
http://www.micropython.org.cn
8+
'''
9+
from micropython import const
10+
11+
PCF8563_I2C_ADDRESS = const(81)
12+
PCF8563_REG_CTRL1 = const(0)
13+
PCF8563_REG_CTRL2 = const(1)
14+
PCF8563_REG_SECOND = const(2)
15+
PCF8563_REG_MINUTE = const(3)
16+
PCF8563_REG_HOUR = const(4)
17+
PCF8563_REG_WEEKDAY = const(6)
18+
PCF8563_REG_DAY = const(5)
19+
PCF8563_REG_MONTH = const(7)
20+
PCF8563_REG_YEAR = const(8)
21+
22+
class PCF8563():
23+
def __init__(self, i2c):
24+
self.i2c = i2c
25+
self.tb = bytearray(1)
26+
self.rb = bytearray(1)
27+
self.buf = bytearray(7)
28+
self.DT = [0] * 8
29+
30+
# set reg
31+
def setReg(self, reg, dat):
32+
self.tb[0] = dat
33+
self.i2c.writeto_mem(PCF8563_I2C_ADDRESS, reg, self.tb)
34+
35+
# get reg
36+
def getReg(self, reg):
37+
self.i2c.readfrom_mem_into(PCF8563_I2C_ADDRESS, reg, self.rb)
38+
return self.rb[0]
39+
40+
def DecToHex(self, dat):
41+
return (dat//10) * 16 + (dat%10)
42+
43+
def HexToDec(self, dat):
44+
return (dat//16) * 10 + (dat%16)
45+
46+
def year(self, year = None):
47+
if year == None:
48+
return self.HexToDec(self.getReg(PCF8563_REG_YEAR)) + 2000
49+
else:
50+
self.setReg(PCF8563_REG_YEAR, self.DecToHex(year%100))
51+
52+
def month(self, month = None):
53+
if month == None:
54+
return self.HexToDec(self.getReg(PCF8563_REG_MONTH)%32)
55+
else:
56+
self.setReg(PCF8563_REG_MONTH, self.DecToHex(month%13))
57+
58+
def day(self, day = None):
59+
if day == None:
60+
return self.HexToDec(self.getReg(PCF8563_REG_DAY)%64)
61+
else:
62+
self.setReg(PCF8563_REG_DAY, self.DecToHex(day%32))
63+
64+
def weekday(self, weekday = None):
65+
if weekday == None:
66+
return self.HexToDec(self.getReg(PCF8563_REG_WEEKDAY)%8)
67+
else:
68+
self.setReg(PCF8563_REG_WEEKDAY, self.DecToHex(weekday%8))
69+
70+
def hour(self, hour = None):
71+
if hour == None:
72+
return self.HexToDec(self.getReg(PCF8563_REG_HOUR)%64)
73+
else:
74+
self.setReg(PCF8563_REG_HOUR, self.DecToHex(hour%24))
75+
76+
def minute(self, minute = None):
77+
if minute == None:
78+
return self.HexToDec(self.getReg(PCF8563_REG_MINUTE)%128)
79+
else:
80+
self.setReg(PCF8563_REG_MINUTE, self.DecToHex(minute%60))
81+
82+
def second(self, second = None):
83+
if second == None:
84+
return self.HexToDec(self.getReg(PCF8563_REG_SECOND)%128)
85+
else:
86+
self.setReg(PCF8563_REG_SECOND, self.DecToHex(second%60))
87+
88+
def datetime(self, DT=None):
89+
if DT == None:
90+
self.i2c.readfrom_mem_into(PCF8563_I2C_ADDRESS, PCF8563_REG_SECOND, self.buf)
91+
self.DT[0] = self.HexToDec(self.buf[6]) + 2000
92+
self.DT[1] = self.HexToDec(self.buf[5]%32)
93+
self.DT[2] = self.HexToDec(self.buf[3]%64)
94+
self.DT[3] = self.HexToDec(self.buf[4]%8)
95+
self.DT[4] = self.HexToDec(self.buf[2]%64)
96+
self.DT[5] = self.HexToDec(self.buf[1]%128)
97+
self.DT[6] = self.HexToDec(self.buf[0]%128)
98+
self.DT[7] = 0
99+
return self.DT
100+
else:
101+
self.buf[0] = self.DecToHex(DT[6]%60) # second
102+
self.buf[1] = self.DecToHex(DT[5]%60) # minute
103+
self.buf[2] = self.DecToHex(DT[4]%24) # hour
104+
self.buf[3] = self.DecToHex(DT[2]%32) # date
105+
self.buf[4] = self.DecToHex(DT[3]%8) # week day
106+
self.buf[5] = self.DecToHex(DT[1]%13) # month
107+
self.buf[6] = self.DecToHex(DT[0]%100) # year
108+
self.i2c.writeto_mem(PCF8563_I2C_ADDRESS, PCF8563_REG_SECOND, self.buf)
109+

0 commit comments

Comments
 (0)