From 7890003b888c866266f497767b834a6b83d5bd8c Mon Sep 17 00:00:00 2001 From: rdagger Date: Mon, 25 Mar 2024 15:39:46 -0700 Subject: [PATCH] Add animated sprite demo. --- demo_animated_sprite.py | 51 ++++++++++++++++++++++++++++++++++++++++ images/Cat221x1232.raw | Bin 0 -> 544544 bytes 2 files changed, 51 insertions(+) create mode 100644 demo_animated_sprite.py create mode 100644 images/Cat221x1232.raw diff --git a/demo_animated_sprite.py b/demo_animated_sprite.py new file mode 100644 index 0000000..ce4d4c9 --- /dev/null +++ b/demo_animated_sprite.py @@ -0,0 +1,51 @@ +"""ILI9341 demo (animated sprite). + + Note: This demo requires a board with additional PSRAM. +""" +from ili9341 import Display +from machine import Pin, SPI # type: ignore +from micropython import const # type: ignore +from utime import sleep_us, ticks_us, ticks_diff # type: ignore + +SPRITE_WIDTH = const(221) +SPRITE_HEIGHT = const(154) +SPRITE_COUNT = const(8) +SIZE = const(68068) # width (221) x height (154) x bytes of color (2) + + +def test(): + """Animated sprite.""" + try: + # Baud rate of 40000000 seems about the max + spi = SPI(1, baudrate=40000000, sck=Pin(14), mosi=Pin(13)) + + display = Display(spi, dc=Pin(4), cs=Pin(16), rst=Pin(17)) + display.clear() + + # Load sprite + cat = display.load_sprite('images/Cat221x1232.raw', + SPRITE_WIDTH, SPRITE_HEIGHT * 8) + # Use memoryview to improve memory usage + mv_cat = memoryview(cat) + + x = (display.width - SPRITE_WIDTH) // 2 + y = (display.height - SPRITE_HEIGHT) // 2 + index = 0 # Sprite frame index + + while True: + timer = ticks_us() + offset = SIZE * index + display.draw_sprite(mv_cat[offset: offset + SIZE], x, y, + SPRITE_WIDTH, SPRITE_HEIGHT) + index = (index + 1) % 8 # Set current index + + # Attempt to set framerate to 30 FPS + timer_dif = 33333 - ticks_diff(ticks_us(), timer) + if timer_dif > 0: + sleep_us(timer_dif) + + except KeyboardInterrupt: + display.cleanup() + + +test() diff --git a/images/Cat221x1232.raw b/images/Cat221x1232.raw new file mode 100644 index 0000000000000000000000000000000000000000..83c46d934aed82e8628fe233a74aece2b6e46f4d GIT binary patch literal 544544 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 z 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 DFZv=A literal 0 HcmV?d00001