-
-
Notifications
You must be signed in to change notification settings - Fork 53
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added TinyPico display shield example
- Loading branch information
Laurence Bank
authored and
Laurence Bank
committed
Jul 7, 2021
1 parent
cb62d16
commit fe83bbb
Showing
3 changed files
with
27,816 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,137 @@ | ||
// | ||
// Example sketch to play animated GIF images on | ||
// The TinyPico + IPS Display Shield | ||
// | ||
// written by Larry Bank ([email protected]) | ||
// | ||
#include <bb_spi_lcd.h> | ||
#include <AnimatedGIF.h> | ||
#include "homer_small_car.h" | ||
|
||
// These pin numbers are for the TinyPico board | ||
#ifdef ARDUINO_TINYPICO | ||
#define LED_PIN 14 | ||
#define CS_PIN 5 | ||
#define DC_PIN 15 | ||
#define MOSI_PIN 23 | ||
#define SCK_PIN 18 | ||
#define MISO_PIN -1 | ||
#else | ||
// For the TinyS2, use these pins | ||
#define LED_PIN 5 | ||
#define CS_PIN 14 | ||
#define DC_PIN 6 | ||
#define MOSI_PIN 35 | ||
#define MISO_PIN 36 | ||
#define SCK_PIN 37 | ||
#endif | ||
#define RESET_PIN -1 | ||
|
||
// ST7735 width | ||
#define DISPLAY_WIDTH 160 | ||
AnimatedGIF gif; | ||
SPILCD lcd; | ||
|
||
// Draw a line of image directly on the LCD | ||
void GIFDraw(GIFDRAW *pDraw) | ||
{ | ||
uint8_t *s; | ||
uint16_t *d, *usPalette, usTemp[320]; | ||
int x, y, iWidth; | ||
|
||
usPalette = pDraw->pPalette; | ||
y = pDraw->iY + pDraw->y; // current line | ||
iWidth = pDraw->iWidth; | ||
if (iWidth > DISPLAY_WIDTH) | ||
iWidth = DISPLAY_WIDTH; | ||
s = pDraw->pPixels; | ||
if (pDraw->ucDisposalMethod == 2) // restore to background color | ||
{ | ||
for (x=0; x<iWidth; x++) | ||
{ | ||
if (s[x] == pDraw->ucTransparent) | ||
s[x] = pDraw->ucBackground; | ||
} | ||
pDraw->ucHasTransparency = 0; | ||
} | ||
// Apply the new pixels to the main image | ||
if (pDraw->ucHasTransparency) // if transparency used | ||
{ | ||
uint8_t *pEnd, c, ucTransparent = pDraw->ucTransparent; | ||
int x, iCount; | ||
pEnd = s + iWidth; | ||
x = 0; | ||
iCount = 0; // count non-transparent pixels | ||
while(x < iWidth) | ||
{ | ||
c = ucTransparent-1; | ||
d = usTemp; | ||
while (c != ucTransparent && s < pEnd) | ||
{ | ||
c = *s++; | ||
if (c == ucTransparent) // done, stop | ||
{ | ||
s--; // back up to treat it like transparent | ||
} | ||
else // opaque | ||
{ | ||
*d++ = usPalette[c]; | ||
iCount++; | ||
} | ||
} // while looking for opaque pixels | ||
if (iCount) // any opaque pixels? | ||
{ | ||
spilcdSetPosition(&lcd, pDraw->iX+x, y, iCount, 1, DRAW_TO_LCD); | ||
spilcdWriteDataBlock(&lcd, (uint8_t *)usTemp, iCount*2, DRAW_TO_LCD); | ||
x += iCount; | ||
iCount = 0; | ||
} | ||
// no, look for a run of transparent pixels | ||
c = ucTransparent; | ||
while (c == ucTransparent && s < pEnd) | ||
{ | ||
c = *s++; | ||
if (c == ucTransparent) | ||
iCount++; | ||
else | ||
s--; | ||
} | ||
if (iCount) | ||
{ | ||
x += iCount; // skip these | ||
iCount = 0; | ||
} | ||
} | ||
} | ||
else | ||
{ | ||
s = pDraw->pPixels; | ||
// Translate the 8-bit pixels through the RGB565 palette (already byte reversed) | ||
for (x=0; x<iWidth; x++) | ||
usTemp[x] = usPalette[*s++]; | ||
spilcdSetPosition(&lcd, pDraw->iX, y, iWidth, 1, DRAW_TO_LCD); | ||
spilcdWriteDataBlock(&lcd, (uint8_t *)usTemp, iWidth*2, DRAW_TO_LCD); | ||
} | ||
} /* GIFDraw() */ | ||
|
||
void setup() { | ||
Serial.begin(115200); | ||
while (!Serial); | ||
Serial.println("Starting..."); | ||
spilcdInit(&lcd, LCD_ST7735S_B, FLAGS_INVERT | FLAGS_SWAP_RB, 20000000, CS_PIN, DC_PIN, RESET_PIN, LED_PIN, MISO_PIN, MOSI_PIN, SCK_PIN); | ||
spilcdSetOrientation(&lcd, LCD_ORIENTATION_90); | ||
spilcdFill(&lcd, 0, DRAW_TO_LCD); | ||
|
||
gif.begin(BIG_ENDIAN_PIXELS); | ||
} | ||
|
||
void loop() { | ||
if (gif.open((uint8_t *)homer_car_small, sizeof(homer_car_small), GIFDraw)) | ||
{ | ||
Serial.printf("Successfully opened GIF; Canvas size = %d x %d\n", gif.getCanvasWidth(), gif.getCanvasHeight()); | ||
while (gif.playFrame(true, NULL)) | ||
{ | ||
} | ||
gif.close(); | ||
} | ||
} |
Oops, something went wrong.