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