52
52
53
53
from micropython import const
54
54
from adafruit_bus_device import i2c_device , spi_device
55
+
55
56
try :
56
57
import framebuf
57
58
except ImportError :
60
61
__version__ = "0.0.0-auto.0"
61
62
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_SSD1305.git"
62
63
63
- #pylint: disable-msg=bad-whitespace
64
+ # pylint: disable-msg=bad-whitespace
64
65
# register definitions
65
- SET_CONTRAST = const (0x81 )
66
- SET_ENTIRE_ON = const (0xa4 )
67
- SET_NORM_INV = const (0xa6 )
68
- SET_DISP = const (0xae )
69
- SET_MEM_ADDR = const (0x20 )
70
- SET_COL_ADDR = const (0x21 )
71
- SET_PAGE_ADDR = const (0x22 )
66
+ SET_CONTRAST = const (0x81 )
67
+ SET_ENTIRE_ON = const (0xA4 )
68
+ SET_NORM_INV = const (0xA6 )
69
+ SET_DISP = const (0xAE )
70
+ SET_MEM_ADDR = const (0x20 )
71
+ SET_COL_ADDR = const (0x21 )
72
+ SET_PAGE_ADDR = const (0x22 )
72
73
SET_DISP_START_LINE = const (0x40 )
73
- SET_LUT = const (0x91 )
74
- SET_SEG_REMAP = const (0xa0 )
75
- SET_MUX_RATIO = const (0xa8 )
76
- SET_MASTER_CONFIG = const (0xad )
77
- SET_COM_OUT_DIR = const (0xc0 )
78
- SET_COMSCAN_DEC = const (0xc8 )
79
- SET_DISP_OFFSET = const (0xd3 )
80
- SET_COM_PIN_CFG = const (0xda )
81
- SET_DISP_CLK_DIV = const (0xd5 )
82
- SET_AREA_COLOR = const (0xd8 )
83
- SET_PRECHARGE = const (0xd9 )
84
- SET_VCOM_DESEL = const (0xdb )
85
- SET_CHARGE_PUMP = const (0x8d )
86
- #pylint: enable-msg=bad-whitespace
74
+ SET_LUT = const (0x91 )
75
+ SET_SEG_REMAP = const (0xA0 )
76
+ SET_MUX_RATIO = const (0xA8 )
77
+ SET_MASTER_CONFIG = const (0xAD )
78
+ SET_COM_OUT_DIR = const (0xC0 )
79
+ SET_COMSCAN_DEC = const (0xC8 )
80
+ SET_DISP_OFFSET = const (0xD3 )
81
+ SET_COM_PIN_CFG = const (0xDA )
82
+ SET_DISP_CLK_DIV = const (0xD5 )
83
+ SET_AREA_COLOR = const (0xD8 )
84
+ SET_PRECHARGE = const (0xD9 )
85
+ SET_VCOM_DESEL = const (0xDB )
86
+ SET_CHARGE_PUMP = const (0x8D )
87
+ # pylint: enable-msg=bad-whitespace
87
88
88
89
89
90
class _SSD1305 (framebuf .FrameBuffer ):
90
91
"""Base class for SSD1305 display driver"""
91
- #pylint: disable-msg=too-many-arguments
92
+
93
+ # pylint: disable-msg=too-many-arguments
92
94
def __init__ (self , buffer , width , height , * , external_vcc , reset ):
93
95
super ().__init__ (buffer , width , height )
94
96
self .width = width
@@ -101,7 +103,7 @@ def __init__(self, buffer, width, height, *, external_vcc, reset):
101
103
self .pages = self .height // 8
102
104
self ._column_offset = 0
103
105
if self .height == 32 :
104
- self ._column_offset = 4 # hardcoded for now...
106
+ self ._column_offset = 4 # hardcoded for now...
105
107
# Note the subclass must initialize self.framebuf to a framebuffer.
106
108
# This is necessary because the underlying data buffer is different
107
109
# between I2C and SPI implementations (I2C needs an extra byte).
@@ -111,26 +113,43 @@ def __init__(self, buffer, width, height, *, external_vcc, reset):
111
113
def init_display (self ):
112
114
"""Base class to initialize display"""
113
115
for cmd in (
114
- SET_DISP | 0x00 , # off
115
- # timing and driving scheme
116
- SET_DISP_CLK_DIV , 0x80 , #SET_DISP_CLK_DIV
117
- SET_SEG_REMAP | 0x01 , # column addr 127 mapped to SEG0 SET_SEG_REMAP
118
- SET_MUX_RATIO , self .height - 1 , #SET_MUX_RATIO
119
- SET_DISP_OFFSET , 0x00 , #SET_DISP_OFFSET
120
- SET_MASTER_CONFIG , 0x8e , #Set Master Configuration
121
- SET_AREA_COLOR , 0x05 , #Set Area Color Mode On/Off & Low Power Display Mode
122
- SET_MEM_ADDR , 0x00 , # horizontal SET_MEM_ADDR ADD
123
- SET_DISP_START_LINE | 0x00 , 0x2E , #SET_DISP_START_LINE ADD
124
- SET_COMSCAN_DEC , #Set COM Output Scan Direction 64 to 1
125
- SET_COM_PIN_CFG , 0x12 , #SET_COM_PIN_CFG
126
- SET_LUT , 0x3f , 0x3f , 0x3f , 0x3f ,#Current drive pulse width of BANK0, Color A, B, C
127
- SET_CONTRAST , 0xff , # maximum SET_CONTRAST to maximum
128
- SET_PRECHARGE , 0xd2 , #SET_PRECHARGE orig: 0xd9, 0x22 if self.external_vcc else 0xf1,
129
- SET_VCOM_DESEL , 0x34 , #SET_VCOM_DESEL 0xdb, 0x30, $ 0.83* Vcc
130
- SET_NORM_INV , # not inverted SET_NORM_INV
131
- SET_ENTIRE_ON , # output follows RAM contents SET_ENTIRE_ON
132
- SET_CHARGE_PUMP , 0x10 if self .external_vcc else 0x14 , #SET_CHARGE_PUMP
133
- SET_DISP | 0x01 ): #//--turn on oled panel
116
+ SET_DISP | 0x00 , # off
117
+ # timing and driving scheme
118
+ SET_DISP_CLK_DIV ,
119
+ 0x80 , # SET_DISP_CLK_DIV
120
+ SET_SEG_REMAP | 0x01 , # column addr 127 mapped to SEG0 SET_SEG_REMAP
121
+ SET_MUX_RATIO ,
122
+ self .height - 1 , # SET_MUX_RATIO
123
+ SET_DISP_OFFSET ,
124
+ 0x00 , # SET_DISP_OFFSET
125
+ SET_MASTER_CONFIG ,
126
+ 0x8E , # Set Master Configuration
127
+ SET_AREA_COLOR ,
128
+ 0x05 , # Set Area Color Mode On/Off & Low Power Display Mode
129
+ SET_MEM_ADDR ,
130
+ 0x00 , # horizontal SET_MEM_ADDR ADD
131
+ SET_DISP_START_LINE | 0x00 ,
132
+ 0x2E , # SET_DISP_START_LINE ADD
133
+ SET_COMSCAN_DEC , # Set COM Output Scan Direction 64 to 1
134
+ SET_COM_PIN_CFG ,
135
+ 0x12 , # SET_COM_PIN_CFG
136
+ SET_LUT ,
137
+ 0x3F ,
138
+ 0x3F ,
139
+ 0x3F ,
140
+ 0x3F , # Current drive pulse width of BANK0, Color A, B, C
141
+ SET_CONTRAST ,
142
+ 0xFF , # maximum SET_CONTRAST to maximum
143
+ SET_PRECHARGE ,
144
+ 0xD2 , # SET_PRECHARGE orig: 0xd9, 0x22 if self.external_vcc else 0xf1,
145
+ SET_VCOM_DESEL ,
146
+ 0x34 , # SET_VCOM_DESEL 0xdb, 0x30, $ 0.83* Vcc
147
+ SET_NORM_INV , # not inverted SET_NORM_INV
148
+ SET_ENTIRE_ON , # output follows RAM contents SET_ENTIRE_ON
149
+ SET_CHARGE_PUMP ,
150
+ 0x10 if self .external_vcc else 0x14 , # SET_CHARGE_PUMP
151
+ SET_DISP | 0x01 ,
152
+ ): # //--turn on oled panel
134
153
self .write_cmd (cmd )
135
154
self .fill (0 )
136
155
self .show ()
@@ -183,6 +202,7 @@ def show(self):
183
202
self .write_cmd (self .pages - 1 )
184
203
self .write_framebuf ()
185
204
205
+
186
206
class SSD1305_I2C (_SSD1305 ):
187
207
"""
188
208
I2C class for SSD1305
@@ -195,7 +215,9 @@ class SSD1305_I2C(_SSD1305):
195
215
:param reset: if needed, DigitalInOut designating reset pin
196
216
"""
197
217
198
- def __init__ (self , width , height , i2c , * , addr = 0x3c , external_vcc = False , reset = None ):
218
+ def __init__ (
219
+ self , width , height , i2c , * , addr = 0x3C , external_vcc = False , reset = None
220
+ ):
199
221
self .i2c_device = i2c_device .I2CDevice (i2c , addr )
200
222
self .addr = addr
201
223
self .temp = bytearray (2 )
@@ -206,12 +228,17 @@ def __init__(self, width, height, i2c, *, addr=0x3c, external_vcc=False, reset=N
206
228
# buffer).
207
229
self .buffer = bytearray (((height // 8 ) * width ) + 1 )
208
230
self .buffer [0 ] = 0x40 # Set first byte of data buffer to Co=0, D/C=1
209
- super ().__init__ (memoryview (self .buffer )[1 :], width , height ,
210
- external_vcc = external_vcc , reset = reset )
231
+ super ().__init__ (
232
+ memoryview (self .buffer )[1 :],
233
+ width ,
234
+ height ,
235
+ external_vcc = external_vcc ,
236
+ reset = reset ,
237
+ )
211
238
212
239
def write_cmd (self , cmd ):
213
240
"""Send a command to the SPI device"""
214
- self .temp [0 ] = 0x80 # Co=1, D/C#=0
241
+ self .temp [0 ] = 0x80 # Co=1, D/C#=0
215
242
self .temp [1 ] = cmd
216
243
with self .i2c_device :
217
244
self .i2c_device .write (self .temp )
@@ -222,7 +249,8 @@ def write_framebuf(self):
222
249
with self .i2c_device :
223
250
self .i2c_device .write (self .buffer )
224
251
225
- #pylint: disable-msg=too-many-arguments
252
+
253
+ # pylint: disable-msg=too-many-arguments
226
254
class SSD1305_SPI (_SSD1305 ):
227
255
"""
228
256
SPI class for SSD1305
@@ -234,18 +262,37 @@ class SSD1305_SPI(_SSD1305):
234
262
:param reset: the reset pin to use,
235
263
:param cs: the chip-select pin to use (sometimes labeled "SS").
236
264
"""
265
+
237
266
# pylint: disable=no-member
238
267
# Disable should be reconsidered when refactor can be tested.
239
- def __init__ (self , width , height , spi , dc , reset , cs , * ,
240
- external_vcc = False , baudrate = 8000000 , polarity = 0 , phase = 0 ):
268
+ def __init__ (
269
+ self ,
270
+ width ,
271
+ height ,
272
+ spi ,
273
+ dc ,
274
+ reset ,
275
+ cs ,
276
+ * ,
277
+ external_vcc = False ,
278
+ baudrate = 8000000 ,
279
+ polarity = 0 ,
280
+ phase = 0
281
+ ):
241
282
self .rate = 10 * 1024 * 1024
242
283
dc .switch_to_output (value = 0 )
243
- self .spi_device = spi_device .SPIDevice (spi , cs , baudrate = baudrate ,
244
- polarity = polarity , phase = phase )
284
+ self .spi_device = spi_device .SPIDevice (
285
+ spi , cs , baudrate = baudrate , polarity = polarity , phase = phase
286
+ )
245
287
self .dc_pin = dc
246
288
self .buffer = bytearray ((height // 8 ) * width )
247
- super ().__init__ (memoryview (self .buffer ), width , height ,
248
- external_vcc = external_vcc , reset = reset )
289
+ super ().__init__ (
290
+ memoryview (self .buffer ),
291
+ width ,
292
+ height ,
293
+ external_vcc = external_vcc ,
294
+ reset = reset ,
295
+ )
249
296
250
297
def write_cmd (self , cmd ):
251
298
"""Send a command to the SPI device"""
0 commit comments