108 lines
2.8 KiB
Python
108 lines
2.8 KiB
Python
"""
|
|
Example for 128X64OLED Module
|
|
Available from multiple vendors, e.g. DIYMall
|
|
|
|
This example loads the I2CDriver logo onto the display,
|
|
and flashes it four times.
|
|
|
|
"""
|
|
|
|
import sys
|
|
import time
|
|
|
|
from PIL import Image, ImageChops
|
|
|
|
from i2cdriver import I2CDriver
|
|
|
|
SETCONTRAST = 0x81
|
|
DISPLAYALLON_RESUME = 0xA4
|
|
DISPLAYALLON = 0xA5
|
|
NORMALDISPLAY = 0xA6
|
|
INVERTDISPLAY = 0xA7
|
|
DISPLAYOFF = 0xAE
|
|
DISPLAYON = 0xAF
|
|
SETDISPLAYOFFSET = 0xD3
|
|
SETCOMPINS = 0xDA
|
|
SETVCOMDETECT = 0xDB
|
|
SETDISPLAYCLOCKDIV = 0xD5
|
|
SETPRECHARGE = 0xD9
|
|
SETMULTIPLEX = 0xA8
|
|
SETLOWCOLUMN = 0x00
|
|
SETHIGHCOLUMN = 0x10
|
|
SETSTARTLINE = 0x40
|
|
MEMORYMODE = 0x20
|
|
COLUMNADDR = 0x21
|
|
PAGEADDR = 0x22
|
|
COMSCANINC = 0xC0
|
|
COMSCANDEC = 0xC8
|
|
SEGREMAP = 0xA0
|
|
CHARGEPUMP = 0x8D
|
|
|
|
class OLED:
|
|
def __init__(self, i2, a = 0x3c):
|
|
self.i2 = i2
|
|
self.a = a
|
|
|
|
self.command(DISPLAYOFF)
|
|
self.command(SETDISPLAYCLOCKDIV, 0x80) # the suggested ratio 0x80
|
|
|
|
self.command(SETMULTIPLEX, 0x3f)
|
|
|
|
self.command(SETDISPLAYOFFSET, 0)
|
|
self.command(SETSTARTLINE | 0x0)
|
|
self.command(CHARGEPUMP, 0x14)
|
|
self.command(MEMORYMODE, 0)
|
|
self.command(SEGREMAP | 0x1)
|
|
self.command(COMSCANDEC)
|
|
|
|
self.command(SETCOMPINS, 0x12)
|
|
self.command(SETCONTRAST, 0xcf)
|
|
|
|
self.command(SETVCOMDETECT, 0x40)
|
|
self.command(DISPLAYALLON_RESUME)
|
|
self.command(NORMALDISPLAY)
|
|
|
|
self.im = Image.new("1", (128,64), 1)
|
|
self.cls()
|
|
|
|
def command(self, *c):
|
|
assert(self.i2.start(self.a, 0))
|
|
assert(self.i2.write((0,) + c))
|
|
self.i2.stop()
|
|
|
|
def image(self, im):
|
|
for p in range(8):
|
|
pr = self.im.crop((0,8*p,128,8*p+8)).transpose(Image.ROTATE_270)
|
|
bb = im.crop((0,8*p,128,8*p+8)).transpose(Image.ROTATE_270)
|
|
diff = ImageChops.difference(pr, bb)
|
|
di = diff.getbbox()
|
|
if di is not None:
|
|
(x0, y0, x1, y1) = di
|
|
self.command(COLUMNADDR)
|
|
self.command(y0)
|
|
self.command(y1 - 1)
|
|
self.command(PAGEADDR)
|
|
self.command(p)
|
|
self.command(p + 1)
|
|
self.i2.start(self.a, 0)
|
|
self.i2.write([0x40])
|
|
self.i2.write(bb.tobytes()[y0:y1])
|
|
self.i2.stop()
|
|
self.im = im
|
|
self.command(DISPLAYON)
|
|
|
|
def cls(self):
|
|
self.image(Image.new("1", (128,64), 0))
|
|
|
|
if __name__ == '__main__':
|
|
i2 = I2CDriver(sys.argv[1])
|
|
d = OLED(i2)
|
|
|
|
d.image(Image.open("logo.png").convert("1"))
|
|
|
|
for i in range(4):
|
|
d.command(INVERTDISPLAY)
|
|
time.sleep(.5)
|
|
d.command(NORMALDISPLAY)
|
|
time.sleep(.5)
|