Files

96 lines
3.4 KiB
Python

"""
ST7789/FrameBuffer
MicroPython library for the ST7789(TFT-SPI)
=======================================================
@dahanzimin From the Mixly Team
"""
import time
import uframebuf
from machine import Pin
from camera import Image, IMG
class ST7789(uframebuf.FrameBuffer_Uincode):
def __init__(self, spi, width, height, dc_pin=None, backlight=None, reset=None, font_address=0x700000):
self.spi = spi
self.dc = Pin(dc_pin, Pin.OUT, value=1)
self._buffer = bytearray(width * height * 2)
super().__init__(self._buffer, width, height, uframebuf.RGB565)
if reset: reset(1, 100)
self.font(font_address)
self._init()
# self.show()
self._oneclight = True
self._backlight = backlight
def display(self, data=None, x=None, y=None, scale_width=None, scale_height=None, rotation=0, sync=True):
if type(data) is str:
data = Image.open(data, scale_width, scale_height, self.width, self.height, rotation=rotation)
if sync: self.fill(0x0, sync=False)
self.blit_rgb565(data.image, data.width, data.height, x, y)
if sync: self.show()
def screenshot(self, x=0, y=0, w=None, h=None):
if (w is None and h is None):
return IMG(memoryview(self._buffer), self.width, self.height)
else:
return IMG(memoryview(self.crop_rgb565(x,y,w,h)), w, h)
def _write(self, cmd, dat=None):
self.dc.off()
self.spi.write(bytearray([cmd]))
if dat is not None:
self.dc.on()
self.spi.write(dat)
def _init(self):
"""Display initialization configuration"""
for cmd, data, delay in [
(0x11, None, 120000),
(0x36, b'\x00', 50),
(0x3A, b'\x05', 50),
(0xB2, b'\x1F\x1F\x00\x33\x33', 10),
(0xB7, b'\x00', 10),
(0xBB, b'\x36', 10),
(0xC0, b'\x2C', 10),
(0xC2, b'\x01', 10),
(0xC3, b'\x13', 10),
(0xC4, b'\x20', 10),
(0xC6, b'\x13', 10),
(0xD0, b'\xA4\xA1', 10),
(0xD6, b'\xA1', 10),
(0xE0, b'\xF0\x08\x0E\x09\x08\x04\x2F\x33\x45\x36\x13\x12\x2A\x2D', 10),
(0xE1, b'\xF0\x0E\x12\x0C\x0A\x15\x2E\x32\x44\x39\x17\x18\x2B\x2F', 10),
(0xE4, b'\x1D\x00\x00', 10),
(0x21, None, 10),
(0x29, None, 10),
]:
self._write(cmd, data)
if delay:
time.sleep_us(delay)
def get_brightness(self):
return self._backlight() / 100
def set_brightness(self, brightness):
if not 0.0 <= brightness <= 1.0:
raise ValueError(
"Brightness must be a decimal number in the range: 0.0~1.0")
self._backlight(int(brightness * 100))
def color(self, red, green=None, blue=None):
""" Convert red, green and blue values (0-255) into a 16-bit 565 encoding."""
if green is None or blue is None:
return red
else:
return (red & 0xf8) << 8 | (green & 0xfc) << 3 | blue >> 3
def show(self):
"""Refresh the display and show the changes."""
if self._oneclight:
self.set_brightness(0.6)
self._oneclight = False
self._write(0x2A, b'\x00\x00\x00\xef')
self._write(0x2B, b'\x00\x00\x00\xef')
self._write(0x2C, self._buffer)