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