S Goltl
Bewertet in den USA am14. Februar 2025
I had trouble finding a micro python library to use the LCD with my Raspberry Pi Pico so I had CoPilot help me develop this following library. Feel free to use it.import framebufimport timefrom machine import Pin, SPI# Constants for the ST7789 commandsST7789_NOP = 0x00ST7789_SWRESET = 0x01ST7789_RDDID = 0x04ST7789_RDDST = 0x09ST7789_SLPIN = 0x10ST7789_SLPOUT = 0x11ST7789_PTLON = 0x12ST7789_NORON = 0x13ST7789_INVOFF = 0x20ST7789_INVON = 0x21ST7789_DISPOFF = 0x28ST7789_DISPON = 0x29ST7789_CASET = 0x2AST7789_RASET = 0x2BST7789_RAMWR = 0x2CST7789_RAMRD = 0x2EST7789_PTLAR = 0x30ST7789_COLMOD = 0x3AST7789_MADCTL = 0x36ST7789_MADCTL_MY = 0x80ST7789_MADCTL_MX = 0x40ST7789_MADCTL_MV = 0x20ST7789_MADCTL_ML = 0x10ST7789_MADCTL_RGB = 0x00COLOR_MODE_65K = 0x50COLOR_MODE_262K = 0x60COLOR_MODE_12BIT = 0x03COLOR_MODE_16BIT = 0x05COLOR_MODE_18BIT = 0x06COLOR_MODE_16M = 0x07class ST7789:def __init__(self, spi, cs, dc, rst, width=320, height=240):self.spi = spiself.cs = csself.dc = dcself.rst = rstself.width = widthself.height = heightself.buffer = bytearray(self.width * self.height * 2)self.framebuf = framebuf.FrameBuffer(self.buffer, self.width, self.height, framebuf.RGB565)self.cs.init(self.cs.OUT, value=1)self.dc.init(self.dc.OUT, value=0)self.rst.init(self.rst.OUT, value=1)self.reset()self.init_display()def reset(self):self.rst(1)time.sleep_ms(50)self.rst(0)time.sleep_ms(50)self.rst(1)time.sleep_ms(50)def write_cmd(self, cmd):self.cs(0)self.dc(0)self.spi.write(bytearray([cmd]))self.cs(1)def write_data(self, data):self.cs(0)self.dc(1)self.spi.write(bytearray([data]))self.cs(1)def init_display(self):self.write_cmd(ST7789_SWRESET)time.sleep_ms(150)self.write_cmd(ST7789_SLPOUT)time.sleep_ms(500)self.write_cmd(ST7789_COLMOD)self.write_data(COLOR_MODE_16BIT)time.sleep_ms(10)self.write_cmd(ST7789_MADCTL)self.write_data(ST7789_MADCTL_MY | ST7789_MADCTL_MV | ST7789_MADCTL_RGB)self.set_window(0, 0, self.width - 1, self.height - 1)self.write_cmd(ST7789_INVON)time.sleep_ms(10)self.write_cmd(ST7789_NORON)time.sleep_ms(10)self.write_cmd(ST7789_DISPON)time.sleep_ms(500)def show(self):self.set_window(0, 0, self.width - 1, self.height - 1)self.write_cmd(ST7789_RAMWR)self.cs(0)self.dc(1)self.spi.write(self.buffer)self.cs(1)def set_window(self, x0, y0, x1, y1):self.write_cmd(ST7789_CASET)self.write_data(x0 >> 8)self.write_data(x0 & 0xFF)self.write_data(x1 >> 8)self.write_data(x1 & 0xFF)self.write_cmd(ST7789_RASET)self.write_data(y0 >> 8)self.write_data(y0 & 0xFF)self.write_data(y1 >> 8)self.write_data(y1 & 0xFF)self.write_cmd(ST7789_RAMWR)def rotate(self, rotation):self.write_cmd(ST7789_MADCTL)if rotation == 0:self.write_data(ST7789_MADCTL_MX | ST7789_MADCTL_MY | ST7789_MADCTL_RGB)self.width, self.height = 240, 320elif rotation == 1:self.write_data(ST7789_MADCTL_MY | ST7789_MADCTL_MV | ST7789_MADCTL_RGB)self.width, self.height = 320, 240elif rotation == 2:self.write_data(ST7789_MADCTL_RGB)self.width, self.height = 240, 320elif rotation == 3:self.write_data(ST7789_MADCTL_MX | ST7789_MADCTL_MV | ST7789_MADCTL_RGB)self.width, self.height = 320, 240self.framebuf = framebuf.FrameBuffer(self.buffer, self.width, self.height, framebuf.RGB565)self.set_window(0, 0, self.width - 1, self.height - 1)def draw_pixel(self, x, y, color):self.framebuf.pixel(x, y, color)def draw_line(self, x0, y0, x1, y1, color):self.framebuf.line(x0, y0, x1, y1, color)def draw_rect(self, x, y, w, h, color):self.framebuf.rect(x, y, w, h, color)def fill_rect(self, x, y, w, h, color):self.framebuf.fill_rect(x, y, w, h, color)def draw_triangle(self, x0, y0, x1, y1, x2, y2, color):self.draw_line(x0, y0, x1, y1, color)self.draw_line(x1, y1, x2, y2, color)self.draw_line(x2, y2, x0, y0, color)def fill_triangle(self, x0, y0, x1, y1, x2, y2, color):def draw_line(x0, y0, x1, y1):dx = abs(x1 - x0)dy = abs(y1 - y0)sx = 1 if x0 sy = 1 if y0 err = dx - dywhile True:self.framebuf.pixel(x0, y0, color)if x0 == x1 and y0 == y1:breake2 = err * 2if e2 > -dy:err -= dyx0 += sxif e2 err += dxy0 += syif y0 > y1:x0, y0, x1, y1 = x1, y1, x0, y0if y0 > y2:x0, y0, x2, y2 = x2, y2, x0, y0if y1 > y2:x1, y1, x2, y2 = x2, y2, x1, y1if y1 == y2:a = x0b = x0if x1 a = x1elif x1 > b:b = x1if x2 a = x2elif x2 > b:b = x2draw_line(a, y1, b, y1)else:dx01 = x1 - x0dy01 = y1 - y0dx02 = x2 - x0dy02 = y2 - y0dx12 = x2 - x1dy12 = y2 - y1sa = 0sb = 0if y1 == y2:last = y1else:last = y1 - 1for y in range(y0, last + 1):a = x0 + sa // dy01b = x0 + sb // dy02sa += dx01sb += dx02if a > b:a, b = b, adraw_line(a, y, b, y)sa = dx12 * (y - y1)sb = dx02 * (y - y0)for y in range(last + 1, y2 + 1):a = x1 + sa // dy12b = x0 + sb // dy02sa += dx12sb += dx02if a > b:a, b = b, adraw_line(a, y, b, y)def draw_circle(self, x0, y0, r, color):f = 1 - rddF_x = 1ddF_y = -2 * rx = 0y = rself.framebuf.pixel(x0, y0 + r, color)self.framebuf.pixel(x0, y0 - r, color)self.framebuf.pixel(x0 + r, y0, color)self.framebuf.pixel(x0 - r, y0, color)while x if f >= 0:y -= 1ddF_y += 2f += ddF_yx += 1ddF_x += 2f += ddF_xself.framebuf.pixel(x0 + x, y0 + y, color)self.framebuf.pixel(x0 - x, y0 + y, color)self.framebuf.pixel(x0 + x, y0 - y, color)self.framebuf.pixel(x0 - x, y0 - y, color)self.framebuf.pixel(x0 + y, y0 + x, color)self.framebuf.pixel(x0 - y, y0 + x, color)self.framebuf.pixel(x0 + y, y0 - x, color)self.framebuf.pixel(x0 - y, y0 - x, color)def fill_circle(self, x0, y0, r, color):self.draw_line(x0, y0 - r, x0, y0 + r, color)f = 1 - rddF_x = 1ddF_y = -2 * rx = 0y = rwhile x if f >= 0:y -= 1ddF_y += 2f += ddF_yx += 1ddF_x += 2f += ddF_xself.draw_line(x0 + x, y0 - y, x0 + x, y0 + y, color)self.draw_line(x0 - x, y0 - y, x0 - x, y0 + y, color)self.draw_line(x0 + y, y0 - x, x0 + y, y0 + x, color)self.draw_line(x0 - y, y0 - x, x0 - y, y0 + x, color)def draw_image(self, x, y, img_data, img_width, img_height):for j in range(img_height):for i in range(img_width):color = img_data[j * img_width + i]self.draw_pixel(x + i, y + j, color)