Skip to content

Added driver and setup-example for ST7567s displays #57

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Sep 2, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 97 additions & 0 deletions drivers/st7567s/st7567s.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
from micropython import const
from gui.drivers.boolpalette import BoolPalette
from time import sleep_ms
import framebuf

# LCD Commands definition
_CMD_DISPLAY_ON = const(0xAF)
_CMD_DISPLAY_OFF = const(0xAE)
_CMD_SET_START_LINE = const(0x40)
_CMD_SET_PAGE = const(0xB0)
_CMD_COLUMN_UPPER = const(0x10)
_CMD_COLUMN_LOWER = const(0x00)
_CMD_SET_ADC_NORMAL = const(0xA0)
_CMD_SET_ADC_REVERSE = const(0xA1)
_CMD_SET_COL_NORMAL = const(0xC0)
_CMD_SET_COL_REVERSE = const(0xC8)
_CMD_SET_DISPLAY_NORMAL = const(0xA6)
_CMD_SET_DISPLAY_REVERSE = const(0xA7)
_CMD_SET_ALLPX_ON = const(0xA5)
_CMD_SET_ALLPX_NORMAL = const(0xA4)
_CMD_SET_BIAS_9 = const(0xA2)
_CMD_SET_BIAS_7 = const(0xA3)
_CMD_DISPLAY_RESET = const(0xE2)
_CMD_NOP = const(0xE3)
_CMD_TEST = const(0xF0) # Exit this mode with _CMD_NOP
_CMD_SET_POWER = const(0x28)
_CMD_SET_RESISTOR_RATIO = const(0x20)
_CMD_SET_VOLUME = const(0x81)

# Display parameters
_DISPLAY_W = const(128)
_DISPLAY_H = const(64)
_DISPLAY_CONTRAST = const(0x1B)
_DISPLAY_RESISTOR_RATIO = const(5)
_DISPLAY_POWER_MODE = 7


class ST7567(framebuf.FrameBuffer):
@staticmethod
def rgb(r, g, b):
return min((r + g + b) >> 7, 3) # Greyscale in range 0 <= gs <= 3

def __init__(self, width, height, i2c, addr=0x3F, external_vcc=False):
self.i2c = i2c
self.addr = addr
self.temp = bytearray(2)
self.write_list = [b"\x40", None] # Co=0, D/C#=1
self.width = width
self.height = height
self.external_vcc = external_vcc
self.pages = self.height // 8
self.buffer = bytearray(self.pages * self.width)
mode = framebuf.MONO_VLSB
self.palette = BoolPalette(mode) # Ensure color compatibility
super().__init__(self.buffer, self.width, self.height, framebuf.MONO_VLSB)
self.display_init()

def display_init(self):
self.write_cmd(_CMD_DISPLAY_RESET)
sleep_ms(1)
for cmd in (
_CMD_DISPLAY_OFF, # Display off
_CMD_SET_BIAS_9, # Display drive voltage 1/9 bias
_CMD_SET_ADC_NORMAL, # Normal SEG
_CMD_SET_COL_REVERSE, # Commmon mode reverse direction
_CMD_SET_RESISTOR_RATIO + _DISPLAY_RESISTOR_RATIO, # V5 R ratio
_CMD_SET_VOLUME, # Contrast
_DISPLAY_CONTRAST, # Contrast value
_CMD_SET_POWER + _DISPLAY_POWER_MODE):
self.write_cmd(cmd)

self.show()
self.write_cmd(_CMD_DISPLAY_ON)

def set_contrast(self, value):
if (0x1 <= value <= 0x3f):
for cmd in (_CMD_SET_VOLUME, value):
self.write_cmd(cmd)

def show(self):
for i in range(8):
for cmd in (
_CMD_SET_START_LINE,
_CMD_SET_PAGE + i,
_CMD_COLUMN_UPPER,
_CMD_COLUMN_LOWER):
self.write_cmd(cmd)
self.write_data(self.buffer[i * 128:(i + 1) * 128])

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):
self.write_list[1] = buf
self.i2c.writevto(self.addr, self.write_list)
13 changes: 13 additions & 0 deletions setup_examples/st7567_i2c_esp32.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from machine import Pin, SoftI2C
import gc

# *** Choose your color display driver here ***
from drivers.st7567s.st7567s import ST7567 as SSD

# ESP32 Pin assignment
i2c = SoftI2C(scl=Pin(33), sda=Pin(32), freq=100000)

lcd_width = 128
lcd_height = 64
gc.collect() # Precaution before instantiating framebuf
ssd = SSD(lcd_width, lcd_height, i2c)