kopia lustrzana https://github.com/peterhinch/micropython-nano-gui
ST7789 TTGO first release.
rodzic
d1373248ae
commit
0539c3a8f6
18
DRIVERS.md
18
DRIVERS.md
|
@ -390,8 +390,8 @@ below. An example file for the Pi Pico is in `color_setup/ssd7789.py`.
|
||||||
|
|
||||||
#### ST7789 Constructor args:
|
#### ST7789 Constructor args:
|
||||||
* `spi` An initialised SPI bus instance. The chip supports clock rates of upto
|
* `spi` An initialised SPI bus instance. The chip supports clock rates of upto
|
||||||
62.5MHz (datasheet table 6). I have tested 60MHz. High speeds may be sensitive
|
62.5MHz (datasheet table 6). I have tested 60MHz. High speeds are sensitive to
|
||||||
to electrical issues such as lead lengths, PCB layout and grounding.
|
electrical issues such as lead lengths, PCB layout and grounding.
|
||||||
* `cs` An initialised output pin. Initial value should be 1.
|
* `cs` An initialised output pin. Initial value should be 1.
|
||||||
* `dc` An initialised output pin. Initial value should be 0.
|
* `dc` An initialised output pin. Initial value should be 0.
|
||||||
* `rst` An initialised output pin. Initial value should be 1.
|
* `rst` An initialised output pin. Initial value should be 1.
|
||||||
|
@ -424,11 +424,12 @@ def spi_init(spi):
|
||||||
```
|
```
|
||||||
#### Display mode
|
#### Display mode
|
||||||
|
|
||||||
This is povided in the hope of supporting other displays which may not be
|
This is provided mainly to support asymmetrical displays. It also enables the
|
||||||
symmetrical. It also enables the Adafruit display image to be rotated.
|
Adafruit display image to be rotated.
|
||||||
|
|
||||||
The driver exports the following constants:
|
The driver exports the following constants:
|
||||||
```python
|
```python
|
||||||
|
LANDSCAPE = 0 # Normal display
|
||||||
PORTRAIT = 0x20 # Rotate 90°
|
PORTRAIT = 0x20 # Rotate 90°
|
||||||
REFLECT = 0x40 # Swap pixels left-right
|
REFLECT = 0x40 # Swap pixels left-right
|
||||||
USD = 0x80 # Upside down: swap pixels top-bottom
|
USD = 0x80 # Upside down: swap pixels top-bottom
|
||||||
|
@ -474,6 +475,9 @@ option may be to overclock.
|
||||||
|
|
||||||
### 3.3.1 TTGO T Display
|
### 3.3.1 TTGO T Display
|
||||||
|
|
||||||
|
Thanks to [Ihor Nehrutsa](https://github.com/IhorNehrutsa) who wrote much of
|
||||||
|
the setup file for this device.
|
||||||
|
|
||||||
This is an ESP32 based device with an integrated 1.14" 135x240 pixel display
|
This is an ESP32 based device with an integrated 1.14" 135x240 pixel display
|
||||||
based on ST7789.
|
based on ST7789.
|
||||||
|
|
||||||
|
@ -481,6 +485,12 @@ It is supported by `color_setup_ttgo.py` in `drivers/st7789`. Copy to
|
||||||
`/pyboard/color_setup.py` on the device. It produces a landscape mode display
|
`/pyboard/color_setup.py` on the device. It produces a landscape mode display
|
||||||
with the top left hand corner adjacent to pin 36.
|
with the top left hand corner adjacent to pin 36.
|
||||||
|
|
||||||
|
Commented-out code offers portrait mode with variants for upside-down and
|
||||||
|
reflected display modes. These differ from those for the Adafruit display. This
|
||||||
|
is because the display hardware is designed in portrait mode. The color setup
|
||||||
|
file transposes the `PORTRAIT` and `LANDSCAPE` constants with consequent
|
||||||
|
changes to the effect of the `USD` and `REFLECT` constants.
|
||||||
|
|
||||||
###### [Contents](./DRIVERS.md#contents)
|
###### [Contents](./DRIVERS.md#contents)
|
||||||
|
|
||||||
# 4. Drivers for sharp displays
|
# 4. Drivers for sharp displays
|
||||||
|
|
|
@ -33,7 +33,7 @@ pcs = Pin(14, Pin.OUT, value=1)
|
||||||
prst = Pin(15, Pin.OUT, value=1)
|
prst = Pin(15, Pin.OUT, value=1)
|
||||||
|
|
||||||
gc.collect() # Precaution before instantiating framebuf
|
gc.collect() # Precaution before instantiating framebuf
|
||||||
# Conservative low baudrate. Can go to 62.5MHz.
|
# Conservative low baudrate. Can go to 62.5MHz. Depending on wiring.
|
||||||
spi = SPI(1, 30_000_000, sck=Pin(10), mosi=Pin(11), miso=Pin(8))
|
spi = SPI(1, 30_000_000, sck=Pin(10), mosi=Pin(11), miso=Pin(8))
|
||||||
ssd = SSD(spi, dc=pdc, cs=pcs, rst=prst) #, disp_mode=PORTRAIT | USD)
|
ssd = SSD(spi, dc=pdc, cs=pcs, rst=prst) #, disp_mode=PORTRAIT | USD)
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
# Notes: Peter Hinch April 2021
|
# Notes: Peter Hinch April 2021
|
||||||
# UNDER DEVELOPMENT. This file and the ST7789 driver may change.
|
# UNDER DEVELOPMENT. This file and the ST7789 driver may change.
|
||||||
# These settings produce a landscape mode display with top left
|
# These settings produce a landscape mode display with top left
|
||||||
# adjactent to pin 36.
|
# adjacent to pin 36.
|
||||||
|
|
||||||
# Supports:
|
# Supports:
|
||||||
# TTGO T-Display 1.14" 135*240(Pixel) based on ST7789V
|
# TTGO T-Display 1.14" 135*240(Pixel) based on ST7789V
|
||||||
|
@ -46,7 +46,7 @@ BUTTON2 = 0 # left of the USB connector
|
||||||
from machine import Pin, SPI, ADC
|
from machine import Pin, SPI, ADC
|
||||||
import gc
|
import gc
|
||||||
|
|
||||||
from drivers.st7789.st7789_4bit import ST7789 as SSD, PORTRAIT, USD, REFLECT
|
from drivers.st7789.st7789_4bit import ST7789 as SSD, PORTRAIT, USD, REFLECT, LANDSCAPE
|
||||||
|
|
||||||
pdc = Pin(TFT_DC, Pin.OUT, value=0) # Arbitrary pins
|
pdc = Pin(TFT_DC, Pin.OUT, value=0) # Arbitrary pins
|
||||||
pcs = Pin(TFT_CS, Pin.OUT, value=1)
|
pcs = Pin(TFT_CS, Pin.OUT, value=1)
|
||||||
|
@ -56,8 +56,29 @@ pbl = Pin(TFT_BL, Pin.OUT, value=1)
|
||||||
gc.collect() # Precaution before instantiating framebuf
|
gc.collect() # Precaution before instantiating framebuf
|
||||||
# Conservative low baudrate. Can go to 62.5MHz.
|
# Conservative low baudrate. Can go to 62.5MHz.
|
||||||
spi = SPI(1, 30_000_000, sck=Pin(TFT_SCLK), mosi=Pin(TFT_MOSI))
|
spi = SPI(1, 30_000_000, sck=Pin(TFT_SCLK), mosi=Pin(TFT_MOSI))
|
||||||
|
# Tweaks for TTGO
|
||||||
|
OFFSET = (52, 40)
|
||||||
|
PORTRAIT, LANDSCAPE = LANDSCAPE, PORTRAIT # Hardware is portrait mode
|
||||||
|
# Landscape configs.
|
||||||
|
# Right way up landscape: defined as top left adjacent to pin 36
|
||||||
|
# Normal display
|
||||||
|
ssd = SSD(spi, height=135, width=240, dc=pdc, cs=pcs, rst=prst, disp_mode=LANDSCAPE | REFLECT, offset=OFFSET)
|
||||||
|
# Reflected (mirror image)
|
||||||
|
# ssd = SSD(spi, height=135, width=240, dc=pdc, cs=pcs, rst=prst, disp_mode=LANDSCAPE | USD | REFLECT, offset=OFFSET)
|
||||||
|
# Upside down (USD) landscape top left close to pin 12
|
||||||
|
# ssd = SSD(spi, height=135, width=240, dc=pdc, cs=pcs, rst=prst, disp_mode=LANDSCAPE | USD, offset=OFFSET)
|
||||||
|
# USD Reflected (mirror image)
|
||||||
|
# ssd = SSD(spi, height=135, width=240, dc=pdc, cs=pcs, rst=prst, disp_mode=LANDSCAPE, offset=OFFSET)
|
||||||
|
|
||||||
ssd = SSD(spi, height=135, width=240, dc=pdc, cs=pcs, rst=prst, disp_mode=PORTRAIT | REFLECT, offset=(40, 52))
|
# Portrait configs.
|
||||||
|
# Normal portrait display
|
||||||
|
# ssd = SSD(spi, height=240, width=135, dc=pdc, cs=pcs, rst=prst, disp_mode=PORTRAIT, offset=OFFSET)
|
||||||
|
# Normal Reflected
|
||||||
|
# ssd = SSD(spi, height=240, width=135, dc=pdc, cs=pcs, rst=prst, disp_mode=PORTRAIT | REFLECT, offset=OFFSET)
|
||||||
|
# USD
|
||||||
|
# ssd = SSD(spi, height=240, width=135, dc=pdc, cs=pcs, rst=prst, disp_mode=PORTRAIT | USD | REFLECT, offset=OFFSET)
|
||||||
|
# USD Reflected
|
||||||
|
# ssd = SSD(spi, height=240, width=135, dc=pdc, cs=pcs, rst=prst, disp_mode=PORTRAIT | USD, offset=OFFSET)
|
||||||
|
|
||||||
# optional
|
# optional
|
||||||
# b1 = Pin(BUTTON1, Pin.IN)
|
# b1 = Pin(BUTTON1, Pin.IN)
|
||||||
|
|
|
@ -67,7 +67,8 @@ class ST7789(framebuf.FrameBuffer):
|
||||||
self._lock = asyncio.Lock()
|
self._lock = asyncio.Lock()
|
||||||
mode = framebuf.GS4_HMSB # Use 4bit greyscale.
|
mode = framebuf.GS4_HMSB # Use 4bit greyscale.
|
||||||
gc.collect()
|
gc.collect()
|
||||||
buf = bytearray(height * width // 2)
|
#buf = bytearray(height * width // 2)
|
||||||
|
buf = bytearray(height * -(-width // 2)) # Ceiling division for odd widths
|
||||||
self._mvb = memoryview(buf)
|
self._mvb = memoryview(buf)
|
||||||
super().__init__(buf, width, height, mode)
|
super().__init__(buf, width, height, mode)
|
||||||
self._linebuf = bytearray(self.width * 2) # 16 bit color out
|
self._linebuf = bytearray(self.width * 2) # 16 bit color out
|
||||||
|
@ -130,28 +131,41 @@ class ST7789(framebuf.FrameBuffer):
|
||||||
wcd(b'\x36', int.to_bytes(disp_mode, 1, 'little'))
|
wcd(b'\x36', int.to_bytes(disp_mode, 1, 'little'))
|
||||||
cmd(b'\x29') # DISPON. Adafruit then delay 500ms.
|
cmd(b'\x29') # DISPON. Adafruit then delay 500ms.
|
||||||
|
|
||||||
# Define the mapping between RAM and the display
|
# Define the mapping between RAM and the display.
|
||||||
# May need modifying for non-Adafruit hardware which may use a different
|
# Datasheet section 8.12 p124.
|
||||||
# mapping between chip RAM and LCD. Datasheet section 8.12 p124.
|
|
||||||
def set_window(self, mode):
|
def set_window(self, mode):
|
||||||
rht = 320
|
rht = 320
|
||||||
rwd = 240 # RAM ht and width
|
rwd = 240 # RAM ht and width
|
||||||
wht = self.height
|
wht = self.height # Window (framebuf) dimensions.
|
||||||
wwd = self.width # Window dimensions
|
wwd = self.width # In portrait mode wht > wwd
|
||||||
# Determine x and y start and end. Defaults for LANDSCAPE and PORTRAIT
|
if mode & PORTRAIT:
|
||||||
xoff = self._offset[0]
|
xoff = self._offset[1] # x and y transposed
|
||||||
xs = xoff
|
yoff = self._offset[0]
|
||||||
xe = wwd + xoff - 1
|
xs = xoff
|
||||||
yoff = self._offset[1]
|
xe = wwd + xoff - 1
|
||||||
ys = yoff # y start
|
ys = yoff # y start
|
||||||
ye = wht + yoff - 1 # y end
|
ye = wht + yoff - 1 # y end
|
||||||
if mode & REFLECT:
|
if mode & REFLECT:
|
||||||
ys = rwd - wht - yoff
|
ys = rwd - wht - yoff
|
||||||
ye = rwd - yoff - 1
|
ye = rwd - yoff - 1
|
||||||
if mode & USD:
|
if mode & USD:
|
||||||
xs = rht - wwd - xoff
|
xs = rht - wwd - xoff
|
||||||
xe = rht - xoff - 1
|
xe = rht - xoff - 1
|
||||||
# Col address set. Add in any offset.
|
else: # LANDSCAPE
|
||||||
|
xoff = self._offset[0]
|
||||||
|
yoff = self._offset[1]
|
||||||
|
xs = xoff
|
||||||
|
xe = wwd + xoff - 1
|
||||||
|
ys = yoff # y start
|
||||||
|
ye = wht + yoff - 1 # y end
|
||||||
|
if mode & USD:
|
||||||
|
ys = rht - wht - yoff
|
||||||
|
ye = rht - yoff - 1
|
||||||
|
if mode & REFLECT:
|
||||||
|
xs = rwd - wwd - xoff
|
||||||
|
xe = rwd - xoff - 1
|
||||||
|
|
||||||
|
# Col address set.
|
||||||
self._wcd(b'\x2a', int.to_bytes(xs, 2, 'big') + int.to_bytes(xe, 2, 'big'))
|
self._wcd(b'\x2a', int.to_bytes(xs, 2, 'big') + int.to_bytes(xe, 2, 'big'))
|
||||||
# Row address set
|
# Row address set
|
||||||
self._wcd(b'\x2b', int.to_bytes(ys, 2, 'big') + int.to_bytes(ye, 2, 'big'))
|
self._wcd(b'\x2b', int.to_bytes(ys, 2, 'big') + int.to_bytes(ye, 2, 'big'))
|
||||||
|
@ -160,7 +174,8 @@ class ST7789(framebuf.FrameBuffer):
|
||||||
def show(self): # Blocks for 83ms @60MHz SPI
|
def show(self): # Blocks for 83ms @60MHz SPI
|
||||||
#ts = ticks_us()
|
#ts = ticks_us()
|
||||||
clut = ST7789.lut
|
clut = ST7789.lut
|
||||||
wd = self.width // 2
|
#wd = self.width // 2
|
||||||
|
wd = -(-self.width // 2) # Ceiling division for odd number widths
|
||||||
end = self.height * wd
|
end = self.height * wd
|
||||||
lb = self._linebuf
|
lb = self._linebuf
|
||||||
buf = self._mvb
|
buf = self._mvb
|
||||||
|
@ -183,7 +198,8 @@ class ST7789(framebuf.FrameBuffer):
|
||||||
if mod:
|
if mod:
|
||||||
raise ValueError('Invalid do_refresh arg.')
|
raise ValueError('Invalid do_refresh arg.')
|
||||||
clut = ST7789.lut
|
clut = ST7789.lut
|
||||||
wd = self.width // 2
|
#wd = self.width // 2
|
||||||
|
wd = -(-self.width // 2)
|
||||||
lb = self._linebuf
|
lb = self._linebuf
|
||||||
buf = self._mvb
|
buf = self._mvb
|
||||||
line = 0
|
line = 0
|
||||||
|
|
Ładowanie…
Reference in New Issue