OLED 128x64 module from DIYMall
This commit is contained in:
parent
32e04b7d34
commit
73cc408de7
Binary file not shown.
After Width: | Height: | Size: 342 B |
|
@ -0,0 +1,107 @@
|
|||
"""
|
||||
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)
|
Loading…
Reference in New Issue