nrf5/examples: Removing copy of ssd1306 driver, creating a new class that overrides the needed function for i2c. Also adding some example usage in the comment in top of the file for both SPI and I2C variant.
This commit is contained in:
parent
227eeb1408
commit
dbc184816a
|
@ -1,177 +0,0 @@
|
|||
# MicroPython SSD1306 OLED driver, I2C and SPI interfaces
|
||||
|
||||
# Example usage for I2C on pca10040 / pca10056
|
||||
#
|
||||
# from machine import Pin, I2C
|
||||
# from ssd1306 import SSD1306_I2C
|
||||
# self.scl = Pin("A3", mode=Pin.OUT, pull=Pin.PULL_UP)
|
||||
# self.sda = Pin("A4", mode=Pin.OUT, pull=Pin.PULL_UP)
|
||||
# self.i2c = I2C(0, self.scl, self.sda)
|
||||
# self.ssd = SSD1306_I2C(128, 64, self.i2c)
|
||||
|
||||
import time
|
||||
import framebuf
|
||||
from machine import SPI, Pin
|
||||
|
||||
# register definitions
|
||||
SET_CONTRAST = const(0x81)
|
||||
SET_ENTIRE_ON = const(0xa4)
|
||||
SET_NORM_INV = const(0xa6)
|
||||
SET_DISP = const(0xae)
|
||||
SET_MEM_ADDR = const(0x20)
|
||||
SET_COL_ADDR = const(0x21)
|
||||
SET_PAGE_ADDR = const(0x22)
|
||||
SET_DISP_START_LINE = const(0x40)
|
||||
SET_SEG_REMAP = const(0xa0)
|
||||
SET_MUX_RATIO = const(0xa8)
|
||||
SET_COM_OUT_DIR = const(0xc0)
|
||||
SET_DISP_OFFSET = const(0xd3)
|
||||
SET_COM_PIN_CFG = const(0xda)
|
||||
SET_DISP_CLK_DIV = const(0xd5)
|
||||
SET_PRECHARGE = const(0xd9)
|
||||
SET_VCOM_DESEL = const(0xdb)
|
||||
SET_CHARGE_PUMP = const(0x8d)
|
||||
|
||||
|
||||
class SSD1306:
|
||||
def __init__(self, width, height, external_vcc):
|
||||
self.width = width
|
||||
self.height = height
|
||||
self.external_vcc = external_vcc
|
||||
self.pages = self.height // 8
|
||||
self.buffer = bytearray(self.pages * self.width)
|
||||
self.framebuf = framebuf.FrameBuffer1(self.buffer, self.width, self.height)
|
||||
self.poweron()
|
||||
self.init_display()
|
||||
|
||||
def init_display(self):
|
||||
for cmd in (
|
||||
SET_DISP | 0x00, # off
|
||||
# address setting
|
||||
SET_MEM_ADDR, 0x00, # horizontal
|
||||
# resolution and layout
|
||||
SET_DISP_START_LINE | 0x00,
|
||||
SET_SEG_REMAP | 0x01, # column addr 127 mapped to SEG0
|
||||
SET_MUX_RATIO, self.height - 1,
|
||||
SET_COM_OUT_DIR | 0x08, # scan from COM[N] to COM0
|
||||
SET_DISP_OFFSET, 0x00,
|
||||
SET_COM_PIN_CFG, 0x02 if self.height == 32 else 0x12,
|
||||
# timing and driving scheme
|
||||
SET_DISP_CLK_DIV, 0x80,
|
||||
SET_PRECHARGE, 0x22 if self.external_vcc else 0xf1,
|
||||
SET_VCOM_DESEL, 0x30, # 0.83*Vcc
|
||||
# display
|
||||
SET_CONTRAST, 0xff, # maximum
|
||||
SET_ENTIRE_ON, # output follows RAM contents
|
||||
SET_NORM_INV, # not inverted
|
||||
# charge pump
|
||||
SET_CHARGE_PUMP, 0x10 if self.external_vcc else 0x14,
|
||||
SET_DISP | 0x01): # on
|
||||
self.write_cmd(cmd)
|
||||
self.fill(0)
|
||||
self.show()
|
||||
|
||||
def poweroff(self):
|
||||
self.write_cmd(SET_DISP | 0x00)
|
||||
|
||||
def contrast(self, contrast):
|
||||
self.write_cmd(SET_CONTRAST)
|
||||
self.write_cmd(contrast)
|
||||
|
||||
def invert(self, invert):
|
||||
self.write_cmd(SET_NORM_INV | (invert & 1))
|
||||
|
||||
def show(self):
|
||||
x0 = 0
|
||||
x1 = self.width - 1
|
||||
if self.width == 64:
|
||||
# displays with width of 64 pixels are shifted by 32
|
||||
x0 += 32
|
||||
x1 += 32
|
||||
self.write_cmd(SET_COL_ADDR)
|
||||
self.write_cmd(x0)
|
||||
self.write_cmd(x1)
|
||||
self.write_cmd(SET_PAGE_ADDR)
|
||||
self.write_cmd(0)
|
||||
self.write_cmd(self.pages - 1)
|
||||
self.write_data(self.buffer)
|
||||
|
||||
def fill(self, col):
|
||||
self.framebuf.fill(col)
|
||||
|
||||
def pixel(self, x, y, col):
|
||||
self.framebuf.pixel(x, y, col)
|
||||
|
||||
def scroll(self, dx, dy):
|
||||
self.framebuf.scroll(dx, dy)
|
||||
|
||||
def text(self, string, x, y, col=1):
|
||||
self.framebuf.text(string, x, y, col)
|
||||
|
||||
|
||||
class SSD1306_I2C(SSD1306):
|
||||
def __init__(self, width, height, i2c, addr=0x3c, external_vcc=False):
|
||||
self.i2c = i2c
|
||||
self.addr = addr
|
||||
self.temp = bytearray(2)
|
||||
super().__init__(width, height, external_vcc)
|
||||
|
||||
def write_cmd(self, cmd):
|
||||
self.temp[0] = 0x80 # Co=1, D/C#=0
|
||||
self.temp[1] = cmd
|
||||
self.i2c.writeto(self.addr, self.temp)
|
||||
|
||||
def write_data(self, buf):
|
||||
buffer = bytearray([0x40]) + buf # Co=0, D/C#=1
|
||||
self.i2c.writeto(self.addr, buffer)
|
||||
|
||||
def poweron(self):
|
||||
pass
|
||||
|
||||
class SSD1306_SPI(SSD1306):
|
||||
def __init__(self, width, height, external_vcc=False):
|
||||
self.rate = 10 * 1024 * 1024
|
||||
self.spi = SPI(0, baudrate=4000000)
|
||||
|
||||
# self.dc = Pin("A11", mode=Pin.OUT, pull=Pin.PULL_UP)
|
||||
# self.dc.low()
|
||||
#
|
||||
# self.res = Pin("A12", mode=Pin.OUT, pull=Pin.PULL_UP)
|
||||
# self.res.low()
|
||||
#
|
||||
# self.cs = Pin("A13", mode=Pin.OUT, pull=Pin.PULL_UP)
|
||||
# self.cs.high()
|
||||
|
||||
self.dc = Pin("B1", mode=Pin.OUT, pull=Pin.PULL_UP)
|
||||
self.dc.low()
|
||||
|
||||
self.res = Pin("B2", mode=Pin.OUT, pull=Pin.PULL_UP)
|
||||
self.res.low()
|
||||
|
||||
self.cs = Pin("B3", mode=Pin.OUT, pull=Pin.PULL_UP)
|
||||
self.cs.high()
|
||||
|
||||
super().__init__(width, height, external_vcc)
|
||||
|
||||
def write_cmd(self, cmd):
|
||||
self.spi.init(baudrate=self.rate, polarity=0, phase=0)
|
||||
self.cs.high()
|
||||
self.dc.low()
|
||||
self.cs.low()
|
||||
self.spi.write(bytearray([cmd]))
|
||||
self.cs.high()
|
||||
|
||||
def write_data(self, buf):
|
||||
self.spi.init(baudrate=self.rate, polarity=0, phase=0)
|
||||
self.cs.high()
|
||||
self.dc.high()
|
||||
self.cs.low()
|
||||
self.spi.write(buf)
|
||||
self.cs.high()
|
||||
|
||||
def poweron(self):
|
||||
self.res.high()
|
||||
time.sleep_ms(1)
|
||||
self.res.low()
|
||||
time.sleep_ms(10)
|
||||
self.res.high()
|
|
@ -0,0 +1,27 @@
|
|||
# NOTE: Modified version to align with implemented I2C API in nrf5 port.
|
||||
#
|
||||
# Examples usage of SSD1306_SPI on pca10040
|
||||
#
|
||||
# from machine import Pin, SPI
|
||||
# from ssd1306 import SSD1306_SPI
|
||||
# spi = SPI(0, baudrate=40000000)
|
||||
# dc = Pin.board.PA11
|
||||
# res = Pin.board.PA12
|
||||
# cs = Pin.board.PA13
|
||||
# disp = SSD1306_SPI(128, 64, spi, dc, res, cs)
|
||||
#
|
||||
#
|
||||
# Example usage of SSD1306_I2C on pca10040
|
||||
#
|
||||
# from machine import Pin, I2C
|
||||
# from ssd1306 import SSD1306_I2C
|
||||
# i2c = I2C(0, Pin.board.PA3, Pin.board.PA4)
|
||||
# disp = SSD1306_I2C_Mod(128, 64, i2c)
|
||||
|
||||
from ssd1306 import SSD1306_I2C
|
||||
|
||||
class SSD1306_I2C_Mod(SSD1306_I2C):
|
||||
|
||||
def write_data(self, buf):
|
||||
buffer = bytearray([0x40]) + buf # Co=0, D/C#=1
|
||||
self.i2c.writeto(self.addr, buffer)
|
Loading…
Reference in New Issue