Jan Ostman
Published

The Play&Watch

A Game&Watch style gamepad

Full instructions provided1,555
The Play&Watch

Things used in this project

Hardware components

Display ST7735R
×1
ATmega1284P
×1
Buttons
×7
Board
×1

Story

Read more

Code

code_for_the_testsketch_in_the_pictures.

Plain text
code_for_the_testsketch_in_the_pictures.
/***************************************************

  This is an example sketch for the Adafruit 1.8" SPI display.

  This library works with the Adafruit 1.8" TFT Breakout w/SD card

  ----> http://www.adafruit.com/products/358

  as well as Adafruit raw 1.8" TFT display

  ----> http://www.adafruit.com/products/618

 

  Check out the links above for our tutorials and wiring diagrams

  These displays use SPI to communicate, 4 or 5 pins are required to

  interface (RST is optional)

  Adafruit invests time and resources providing this open source code,

  please support Adafruit and open-source hardware by purchasing

  products from Adafruit!



  Written by Limor Fried/Ladyada for Adafruit Industries.

  MIT license, all text above must be included in any redistribution

 ****************************************************/



// For the breakout, you can use any (4 or) 5 pins

//#define sclk 4

//#define mosi 5

//#define cs   6

//#define dc   7

//#define rst  8  // you can also connect this to the Arduino reset



//Use these pins for the shield!

#define sclk 7

#define mosi 5

#define cs   4

#define dc   3

#define rst  2  // you can also connect this to the Arduino reset



#include <Adafruit_GFX.h>    // Core graphics library

#include <Adafruit_ST7735.h> // Hardware-specific library

#include <SPI.h>



#if defined(__SAM3X8E__)

    #undef __FlashStringHelper::F(string_literal)

    #define F(string_literal) string_literal

#endif



// Option 1: use any pins but a little slower

//Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, mosi, sclk, rst);



// Option 2: must use the hardware SPI pins

// (for UNO thats sclk = 13 and sid = 11) and pin 10 must be

// an output. This is much faster - also required if you want

// to use the microSD card (see the image drawing example)

Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst);

float p = 3.1415926;



 

#define Neutral 0

#define Press 1

#define Up 2

#define Down 3

#define Right 4

#define Left 5

 

// Check the joystick position







void setup(void) {

  //Serial.begin(9600);

  //Serial.print("hello!");



  // Our supplier changed the 1.8" display slightly after Jan 10, 2012

  // so that the alignment of the TFT had to be shifted by a few pixels

  // this just means the init code is slightly different. Check the

  // color of the tab to see which init code to try. If the display is

  // cut off or has extra 'random' pixels on the top & left, try the

  // other option!

  // If you are seeing red and green color inversion, use Black Tab



  // If your TFT's plastic wrap has a Black Tab, use the following:

  tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab

  pinMode(0,OUTPUT);

  digitalWrite(0,HIGH);

  tft.setRotation(1);

  // If your TFT's plastic wrap has a Red Tab, use the following:

  //tft.initR(INITR_REDTAB);   // initialize a ST7735R chip, red tab

  // If your TFT's plastic wrap has a Green Tab, use the following:

  //tft.initR(INITR_GREENTAB); // initialize a ST7735R chip, green tab



  //Serial.println("init");



  uint16_t time = millis();

  tft.fillScreen(ST7735_BLACK);

  time = millis() - time;



  //Serial.println(time, DEC);

  delay(500);



  // large block of text

  tft.fillScreen(ST7735_BLACK);

  testdrawtext("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing ante sed nibh tincidunt feugiat. Maecenas enim massa, fringilla sed malesuada et, malesuada sit amet turpis. Sed porttitor neque ut ante pretium vitae malesuada nunc bibendum. Nullam aliquet ultrices massa eu hendrerit. Ut sed nisi lorem. In vestibulum purus a tortor imperdiet posuere. ", ST7735_WHITE);

  delay(1000);



  // tft print function!

  tftPrintTest();

  delay(4000);



  // a single pixel

  tft.drawPixel(tft.width()/2, tft.height()/2, ST7735_GREEN);

  delay(500);



  // line draw test

  testlines(ST7735_YELLOW);

  delay(500);



  // optimized lines

  testfastlines(ST7735_RED, ST7735_BLUE);

  delay(500);



  testdrawrects(ST7735_GREEN);

  delay(500);



  testfillrects(ST7735_YELLOW, ST7735_MAGENTA);

  delay(500);



  tft.fillScreen(ST7735_BLACK);

  testfillcircles(10, ST7735_BLUE);

  testdrawcircles(10, ST7735_WHITE);

  delay(500);



  testroundrects();

  delay(500);



  testtriangles();

  delay(500);



  mediabuttons();

  delay(500);



  //Serial.println("done");

  delay(1000);

}



void loop() {

  tft.invertDisplay(true);

  delay(500);

  tft.invertDisplay(false);

  delay(500);



}



void testlines(uint16_t color) {

  tft.fillScreen(ST7735_BLACK);

  for (int16_t x=0; x < tft.width(); x+=6) {

    tft.drawLine(0, 0, x, tft.height()-1, color);

  }

  for (int16_t y=0; y < tft.height(); y+=6) {

    tft.drawLine(0, 0, tft.width()-1, y, color);

  }



  tft.fillScreen(ST7735_BLACK);

  for (int16_t x=0; x < tft.width(); x+=6) {

    tft.drawLine(tft.width()-1, 0, x, tft.height()-1, color);

  }

  for (int16_t y=0; y < tft.height(); y+=6) {

    tft.drawLine(tft.width()-1, 0, 0, y, color);

  }



  tft.fillScreen(ST7735_BLACK);

  for (int16_t x=0; x < tft.width(); x+=6) {

    tft.drawLine(0, tft.height()-1, x, 0, color);

  }

  for (int16_t y=0; y < tft.height(); y+=6) {

    tft.drawLine(0, tft.height()-1, tft.width()-1, y, color);

  }



  tft.fillScreen(ST7735_BLACK);

  for (int16_t x=0; x < tft.width(); x+=6) {

    tft.drawLine(tft.width()-1, tft.height()-1, x, 0, color);

  }

  for (int16_t y=0; y < tft.height(); y+=6) {

    tft.drawLine(tft.width()-1, tft.height()-1, 0, y, color);

  }

}



void testdrawtext(char *text, uint16_t color) {

  tft.setCursor(0, 0);

  tft.setTextColor(color);

  tft.setTextWrap(true);

  tft.print(text);

}



void testfastlines(uint16_t color1, uint16_t color2) {

  tft.fillScreen(ST7735_BLACK);

  for (int16_t y=0; y < tft.height(); y+=5) {

    tft.drawFastHLine(0, y, tft.width(), color1);

  }

  for (int16_t x=0; x < tft.width(); x+=5) {

    tft.drawFastVLine(x, 0, tft.height(), color2);

  }

}



void testdrawrects(uint16_t color) {

  tft.fillScreen(ST7735_BLACK);

  for (int16_t x=0; x < tft.width(); x+=6) {

    tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color);

  }

}



void testfillrects(uint16_t color1, uint16_t color2) {

  tft.fillScreen(ST7735_BLACK);

  for (int16_t x=tft.width()-1; x > 6; x-=6) {

    tft.fillRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color1);

    tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color2);

  }

}



void testfillcircles(uint8_t radius, uint16_t color) {

  for (int16_t x=radius; x < tft.width(); x+=radius*2) {

    for (int16_t y=radius; y < tft.height(); y+=radius*2) {

      tft.fillCircle(x, y, radius, color);

    }

  }

}



void testdrawcircles(uint8_t radius, uint16_t color) {

  for (int16_t x=0; x < tft.width()+radius; x+=radius*2) {

    for (int16_t y=0; y < tft.height()+radius; y+=radius*2) {

      tft.drawCircle(x, y, radius, color);

    }

  }

}



void testtriangles() {

  tft.fillScreen(ST7735_BLACK);

  int color = 0xF800;

  int t;

  int w = 63;

  int x = 159;

  int y = 0;

  int z = 127;

  for(t = 0 ; t <= 15; t+=1) {

    tft.drawTriangle(w, y, y, x, z, x, color);

    x-=4;

    y+=4;

    z-=4;

    color+=100;

  }

}



void testroundrects() {

  tft.fillScreen(ST7735_BLACK);

  int color = 100;

  int i;

  int t;

  for(t = 0 ; t <= 4; t+=1) {

    int x = 0;

    int y = 0;

    int w = 127;

    int h = 159;

    for(i = 0 ; i <= 24; i+=1) {

      tft.drawRoundRect(x, y, w, h, 5, color);

      x+=2;

      y+=3;

      w-=4;

      h-=6;

      color+=1100;

    }

    color+=100;

  }

}



void tftPrintTest() {

  tft.setTextWrap(false);

  tft.fillScreen(ST7735_BLACK);

  tft.setCursor(0, 30);

  tft.setTextColor(ST7735_RED);

  tft.setTextSize(1);

  tft.println("Hello World!");

  tft.setTextColor(ST7735_YELLOW);

  tft.setTextSize(2);

  tft.println("Hello World!");

  tft.setTextColor(ST7735_GREEN);

  tft.setTextSize(3);

  tft.println("Hello World!");

  tft.setTextColor(ST7735_BLUE);

  tft.setTextSize(4);

  tft.print(1234.567);

  delay(1500);

  tft.setCursor(0, 0);

  tft.fillScreen(ST7735_BLACK);

  tft.setTextColor(ST7735_WHITE);

  tft.setTextSize(0);

  tft.println("Hello World!");

  tft.setTextSize(1);

  tft.setTextColor(ST7735_GREEN);

  tft.print(p, 6);

  tft.println(" Want pi?");

  tft.println(" ");

  tft.print(8675309, HEX); // print 8,675,309 out in HEX!

  tft.println(" Print HEX!");

  tft.println(" ");

  tft.setTextColor(ST7735_WHITE);

  tft.println("Sketch has been");

  tft.println("running for: ");

  tft.setTextColor(ST7735_MAGENTA);

  tft.print(millis() / 1000);

  tft.setTextColor(ST7735_WHITE);

  tft.print(" seconds.");

}



void mediabuttons() {

  // play

  tft.fillScreen(ST7735_BLACK);

  tft.fillRoundRect(25, 10, 78, 60, 8, ST7735_WHITE);

  tft.fillTriangle(42, 20, 42, 60, 90, 40, ST7735_RED);

  delay(500);

  // pause

  tft.fillRoundRect(25, 90, 78, 60, 8, ST7735_WHITE);

  tft.fillRoundRect(39, 98, 20, 45, 5, ST7735_GREEN);

  tft.fillRoundRect(69, 98, 20, 45, 5, ST7735_GREEN);

  delay(500);

  // play color

  tft.fillTriangle(42, 20, 42, 60, 90, 40, ST7735_BLUE);

  delay(50);

  // pause color

  tft.fillRoundRect(39, 98, 20, 45, 5, ST7735_RED);

  tft.fillRoundRect(69, 98, 20, 45, 5, ST7735_RED);

  // play color

  tft.fillTriangle(42, 20, 42, 60, 90, 40, ST7735_GREEN);

}

Credits

Jan Ostman
34 projects • 169 followers
I'm an embeddeds wizard that can turn any pile of electronic junk to something really great. Mc Gyver style.

Comments