“Race Collision” is a one player game in which a truck has to avoid “particles” that appear on the road. By the use of the joystick, the player can guide themselves through the menu system to start the game. The truck is the main element of the game and it can be moved from side to side with the joystick. The road curves randomly from time to time and the player has to be careful to keep the truck within the road boundaries. Particles appear on the screen at random positions and 4 collisions lead to the end of the game.

Dependencies:   ELEC2645_JoystickLCD_LPC1768_2021

Committer:
alex_20
Date:
Sun Mar 21 17:03:59 2021 +0000
Revision:
4:def20a1665d1
Parent:
3:cbe2dcca5058
Child:
5:7930d289e7fc
before curve switched to one case

Who changed what in which revision?

UserRevisionLine numberNew contents of line
eencae 0:be41a15e7a86 1 #ifndef N5110_H
eencae 0:be41a15e7a86 2 #define N5110_H
eencae 0:be41a15e7a86 3
alex_20 3:cbe2dcca5058 4 #include <vector>
alex_20 4:def20a1665d1 5 #include <cmath>
alex_20 3:cbe2dcca5058 6 #include "Utils.h"
alex_20 4:def20a1665d1 7 #include "Vector.h"
eencae 0:be41a15e7a86 8 #include "mbed.h"
eencae 0:be41a15e7a86 9
eencae 0:be41a15e7a86 10 // number of pixels on display
eencae 0:be41a15e7a86 11 #define WIDTH 84
eencae 0:be41a15e7a86 12 #define HEIGHT 48
eencae 0:be41a15e7a86 13 #define BANKS 6
eencae 0:be41a15e7a86 14
eencae 0:be41a15e7a86 15 /// Fill types for 2D shapes
eencae 0:be41a15e7a86 16 enum FillType {
alex_20 4:def20a1665d1 17 FILL_TRANSPARENT, ///< Transparent with outline
alex_20 4:def20a1665d1 18 FILL_BLACK, ///< Filled black
alex_20 4:def20a1665d1 19 FILL_WHITE, ///< Filled white (no outline)
eencae 0:be41a15e7a86 20 };
eencae 0:be41a15e7a86 21
alex_20 3:cbe2dcca5058 22 const static int TYPE_SOLID = 0;
alex_20 3:cbe2dcca5058 23 const static int TYPE_DOTTED = 1;
alex_20 3:cbe2dcca5058 24
eencae 0:be41a15e7a86 25 /** N5110 Class
eencae 0:be41a15e7a86 26 @brief Library for interfacing with Nokia 5110 LCD display (https://www.sparkfun.com/products/10168) using the hardware SPI on the mbed.
eencae 0:be41a15e7a86 27 @brief The display is powered from a GPIO pin meaning it can be controlled via software. The LED backlight is also software-controllable (via PWM pin).
eencae 0:be41a15e7a86 28 @brief Can print characters and strings to the display using the included 5x7 font.
eencae 0:be41a15e7a86 29 @brief The library also implements a screen buffer so that individual pixels on the display (84 x 48) can be set, cleared and read.
eencae 0:be41a15e7a86 30 @brief The library can print primitive shapes (lines, circles, rectangles)
eencae 0:be41a15e7a86 31 @brief Acknowledgements to Chris Yan's Nokia_5110 Library.
eencae 0:be41a15e7a86 32
eencae 0:be41a15e7a86 33 @brief Revision 1.3
eencae 0:be41a15e7a86 34
eencae 0:be41a15e7a86 35 @author Craig A. Evans
eencae 0:be41a15e7a86 36 @date 7th February 2017
eencae 0:be41a15e7a86 37
eencae 0:be41a15e7a86 38 @code
eencae 0:be41a15e7a86 39
eencae 0:be41a15e7a86 40 #include "mbed.h"
eencae 0:be41a15e7a86 41 #include "N5110.h"
eencae 0:be41a15e7a86 42
eencae 0:be41a15e7a86 43 // rows,cols
eencae 0:be41a15e7a86 44 int sprite[8][5] = {
eencae 0:be41a15e7a86 45 { 0,0,1,0,0 },
eencae 0:be41a15e7a86 46 { 0,1,1,1,0 },
eencae 0:be41a15e7a86 47 { 0,0,1,0,0 },
eencae 0:be41a15e7a86 48 { 0,1,1,1,0 },
eencae 0:be41a15e7a86 49 { 1,1,1,1,1 },
eencae 0:be41a15e7a86 50 { 1,1,1,1,1 },
eencae 0:be41a15e7a86 51 { 1,1,0,1,1 },
eencae 0:be41a15e7a86 52 { 1,1,0,1,1 },
eencae 0:be41a15e7a86 53 };
eencae 0:be41a15e7a86 54
eencae 0:be41a15e7a86 55 // VCC,SCE,RST,D/C,MOSI,SCLK,LED
eencae 0:be41a15e7a86 56 //N5110 lcd(p7,p8,p9,p10,p11,p13,p21); // LPC1768 - pwr from GPIO
eencae 0:be41a15e7a86 57 N5110 lcd(p8,p9,p10,p11,p13,p21); // LPC1768 - powered from +3V3 - JP1 in 2/3 position
eencae 0:be41a15e7a86 58 //N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11); // K64F - pwr from 3V3
eencae 0:be41a15e7a86 59
eencae 0:be41a15e7a86 60 int main()
eencae 0:be41a15e7a86 61 {
eencae 0:be41a15e7a86 62 // first need to initialise display
eencae 0:be41a15e7a86 63 lcd.init();
eencae 0:be41a15e7a86 64
eencae 0:be41a15e7a86 65 // change set contrast in range 0.0 to 1.0
eencae 0:be41a15e7a86 66 // 0.4 appears to be a good starting point
eencae 0:be41a15e7a86 67 lcd.setContrast(0.4);
eencae 0:be41a15e7a86 68
eencae 0:be41a15e7a86 69 while(1) {
eencae 0:be41a15e7a86 70
eencae 0:be41a15e7a86 71 // these are default settings so not strictly needed
eencae 0:be41a15e7a86 72 lcd.normalMode(); // normal colour mode
eencae 0:be41a15e7a86 73
eencae 0:be41a15e7a86 74 lcd.clear();
eencae 0:be41a15e7a86 75 // x origin, y origin, rows, cols, sprite
eencae 0:be41a15e7a86 76 lcd.drawSprite(20,6,8,5,(int *)sprite);
eencae 0:be41a15e7a86 77 lcd.refresh();
eencae 0:be41a15e7a86 78 wait(5.0);
eencae 0:be41a15e7a86 79
eencae 0:be41a15e7a86 80 lcd.clear(); // clear buffer at start of every loop
eencae 0:be41a15e7a86 81 // can directly print strings at specified co-ordinates (must be less than 84 pixels to fit on display)
eencae 0:be41a15e7a86 82 lcd.printString("Hello, World!",0,0);
eencae 0:be41a15e7a86 83
eencae 0:be41a15e7a86 84 char buffer[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14)
eencae 0:be41a15e7a86 85 // so can display a string of a maximum 14 characters in length
eencae 0:be41a15e7a86 86 // or create formatted strings - ensure they aren't more than 14 characters long
eencae 0:be41a15e7a86 87 int temperature = 27;
eencae 0:be41a15e7a86 88 int length = sprintf(buffer,"T = %2d C",temperature); // print formatted data to buffer
eencae 0:be41a15e7a86 89 // it is important the format specifier ensures the length will fit in the buffer
eencae 0:be41a15e7a86 90 if (length <= 14) // if string will fit on display (assuming printing at x=0)
eencae 0:be41a15e7a86 91 lcd.printString(buffer,0,1); // display on screen
eencae 0:be41a15e7a86 92
eencae 0:be41a15e7a86 93 float pressure = 1012.3; // same idea with floats
eencae 0:be41a15e7a86 94 length = sprintf(buffer,"P = %.2f mb",pressure);
eencae 0:be41a15e7a86 95 if (length <= 14)
eencae 0:be41a15e7a86 96 lcd.printString(buffer,0,2);
eencae 0:be41a15e7a86 97
eencae 0:be41a15e7a86 98 // can also print individual characters at specified place
eencae 0:be41a15e7a86 99 lcd.printChar('X',5,3);
eencae 0:be41a15e7a86 100
eencae 0:be41a15e7a86 101 // draw a line across the display at y = 40 pixels (origin top-left)
eencae 0:be41a15e7a86 102 for (int i = 0; i < WIDTH; i++) {
eencae 0:be41a15e7a86 103 lcd.setPixel(i,40,true);
eencae 0:be41a15e7a86 104 }
eencae 0:be41a15e7a86 105 // need to refresh display after setting pixels or writing strings
eencae 0:be41a15e7a86 106 lcd.refresh();
eencae 0:be41a15e7a86 107 wait(5.0);
eencae 0:be41a15e7a86 108
eencae 0:be41a15e7a86 109 // can check status of pixel using getPixel(x,y);
eencae 0:be41a15e7a86 110 lcd.clear(); // clear buffer
eencae 0:be41a15e7a86 111 lcd.setPixel(2,2,true); // set random pixel in buffer
eencae 0:be41a15e7a86 112 lcd.refresh();
eencae 0:be41a15e7a86 113 wait(1.0);
eencae 0:be41a15e7a86 114
eencae 0:be41a15e7a86 115 int pixel_to_test = lcd.getPixel(2,2);
eencae 0:be41a15e7a86 116
eencae 0:be41a15e7a86 117 if ( pixel_to_test ) {
eencae 0:be41a15e7a86 118 lcd.printString("2,2 is set",0,4);
eencae 0:be41a15e7a86 119 }
eencae 0:be41a15e7a86 120
eencae 0:be41a15e7a86 121 // this one shouldn't be set
eencae 0:be41a15e7a86 122 lcd.setPixel(3,3,false); // clear random pixel in buffer
eencae 0:be41a15e7a86 123 lcd.refresh();
eencae 0:be41a15e7a86 124 pixel_to_test = lcd.getPixel(3,3);
eencae 0:be41a15e7a86 125
eencae 0:be41a15e7a86 126 if ( pixel_to_test == 0 ) {
eencae 0:be41a15e7a86 127 lcd.printString("3,3 is clear",0,5);
eencae 0:be41a15e7a86 128 }
eencae 0:be41a15e7a86 129
eencae 0:be41a15e7a86 130 lcd.refresh();
eencae 0:be41a15e7a86 131 wait(4.0);
eencae 0:be41a15e7a86 132
eencae 0:be41a15e7a86 133 lcd.clear(); // clear buffer
eencae 0:be41a15e7a86 134 lcd.inverseMode(); // invert colours
eencae 0:be41a15e7a86 135 lcd.setBrightness(1.0); // put LED backlight on full
eencae 0:be41a15e7a86 136
eencae 0:be41a15e7a86 137 float array[84];
eencae 0:be41a15e7a86 138
eencae 0:be41a15e7a86 139 for (int i = 0; i < 84; i++) {
eencae 0:be41a15e7a86 140 array[i] = 0.5 + 0.5*sin(i*2*3.14/84);
eencae 0:be41a15e7a86 141 }
eencae 0:be41a15e7a86 142
eencae 0:be41a15e7a86 143 // can also plot graphs - 84 elements only
eencae 0:be41a15e7a86 144 // values must be in range 0.0 - 1.0
eencae 0:be41a15e7a86 145 lcd.plotArray(array);
eencae 0:be41a15e7a86 146 lcd.refresh();
eencae 0:be41a15e7a86 147 wait(5.0);
eencae 0:be41a15e7a86 148
eencae 0:be41a15e7a86 149 lcd.clear();
eencae 0:be41a15e7a86 150 lcd.normalMode(); // normal colour mode back
eencae 0:be41a15e7a86 151 lcd.setBrightness(0.5); // put LED backlight on 50%
eencae 0:be41a15e7a86 152
eencae 0:be41a15e7a86 153 // example of drawing lines
eencae 0:be41a15e7a86 154 for (int x = 0; x < WIDTH ; x+=10) {
eencae 0:be41a15e7a86 155 // x0,y0,x1,y1,type 0-white,1-black,2-dotted
eencae 0:be41a15e7a86 156 lcd.drawLine(0,0,x,HEIGHT,2);
eencae 0:be41a15e7a86 157 }
eencae 0:be41a15e7a86 158 lcd.refresh(); // refresh after drawing shapes
eencae 0:be41a15e7a86 159 wait(5.0);
eencae 0:be41a15e7a86 160
eencae 0:be41a15e7a86 161
eencae 0:be41a15e7a86 162 lcd.clear();
eencae 0:be41a15e7a86 163 // example of how to draw circles
eencae 0:be41a15e7a86 164 lcd.drawCircle(WIDTH/2,HEIGHT/2,20,FILL_BLACK); // x,y,radius,black fill
eencae 0:be41a15e7a86 165 lcd.drawCircle(WIDTH/2,HEIGHT/2,10,FILL_WHITE); // x,y,radius,white fill
eencae 0:be41a15e7a86 166 lcd.drawCircle(WIDTH/2,HEIGHT/2,30,FILL_TRANSPARENT); // x,y,radius,transparent with outline
eencae 0:be41a15e7a86 167 lcd.refresh(); // refresh after drawing shapes
eencae 0:be41a15e7a86 168 wait(5.0);
eencae 0:be41a15e7a86 169
eencae 0:be41a15e7a86 170 lcd.clear();
eencae 0:be41a15e7a86 171 // example of how to draw rectangles
eencae 0:be41a15e7a86 172 // origin x,y,width,height,type
eencae 0:be41a15e7a86 173 lcd.drawRect(10,10,50,30,FILL_BLACK); // filled black rectangle
eencae 0:be41a15e7a86 174 lcd.drawRect(15,15,20,10,FILL_WHITE); // filled white rectange (no outline)
eencae 0:be41a15e7a86 175 lcd.drawRect(2,2,70,40,FILL_TRANSPARENT); // transparent, just outline
eencae 0:be41a15e7a86 176 lcd.refresh(); // refresh after drawing shapes
eencae 0:be41a15e7a86 177 wait(5.0);
eencae 0:be41a15e7a86 178
eencae 0:be41a15e7a86 179 }
eencae 0:be41a15e7a86 180 }
eencae 0:be41a15e7a86 181
eencae 0:be41a15e7a86 182
eencae 0:be41a15e7a86 183 @endcode
eencae 0:be41a15e7a86 184 */
eencae 0:be41a15e7a86 185 class N5110
eencae 0:be41a15e7a86 186 {
eencae 0:be41a15e7a86 187 private:
eencae 0:be41a15e7a86 188 // objects
eencae 0:be41a15e7a86 189 SPI *_spi;
eencae 0:be41a15e7a86 190 DigitalOut *_led;
eencae 0:be41a15e7a86 191 DigitalOut *_pwr;
eencae 0:be41a15e7a86 192 DigitalOut *_sce;
eencae 0:be41a15e7a86 193 DigitalOut *_rst;
eencae 0:be41a15e7a86 194 DigitalOut *_dc;
eencae 0:be41a15e7a86 195
eencae 0:be41a15e7a86 196 // variables
eencae 0:be41a15e7a86 197 unsigned char buffer[84][6]; // screen buffer - the 6 is for the banks - each one is 8 bits;
eencae 0:be41a15e7a86 198
eencae 0:be41a15e7a86 199 public:
eencae 0:be41a15e7a86 200 /** Create a N5110 object connected to the specified pins
eencae 0:be41a15e7a86 201 *
eencae 0:be41a15e7a86 202 * @param pwr Pin connected to Vcc on the LCD display (pin 1)
eencae 0:be41a15e7a86 203 * @param sce Pin connected to chip enable (pin 3)
eencae 0:be41a15e7a86 204 * @param rst Pin connected to reset (pin 4)
eencae 0:be41a15e7a86 205 * @param dc Pin connected to data/command select (pin 5)
eencae 0:be41a15e7a86 206 * @param mosi Pin connected to data input (MOSI) (pin 6)
eencae 0:be41a15e7a86 207 * @param sclk Pin connected to serial clock (SCLK) (pin 7)
eencae 0:be41a15e7a86 208 * @param led Pin connected to LED backlight (must be PWM) (pin 8)
eencae 0:be41a15e7a86 209 *
eencae 0:be41a15e7a86 210 */
eencae 0:be41a15e7a86 211 N5110(PinName const pwrPin,
eencae 0:be41a15e7a86 212 PinName const scePin,
eencae 0:be41a15e7a86 213 PinName const rstPin,
eencae 0:be41a15e7a86 214 PinName const dcPin,
eencae 0:be41a15e7a86 215 PinName const mosiPin,
eencae 0:be41a15e7a86 216 PinName const sclkPin,
eencae 0:be41a15e7a86 217 PinName const ledPin);
eencae 0:be41a15e7a86 218
eencae 0:be41a15e7a86 219 /** Create a N5110 object connected to the specified pins (Vcc to +3V3)
eencae 0:be41a15e7a86 220 *
eencae 0:be41a15e7a86 221 * @param sce Pin connected to chip enable (pin 3)
eencae 0:be41a15e7a86 222 * @param rst Pin connected to reset (pin 4)
eencae 0:be41a15e7a86 223 * @param dc Pin connected to data/command select (pin 5)
eencae 0:be41a15e7a86 224 * @param mosi Pin connected to data input (MOSI) (pin 6)
eencae 0:be41a15e7a86 225 * @param sclk Pin connected to serial clock (SCLK) (pin 7)
eencae 0:be41a15e7a86 226 * @param led Pin connected to LED backlight (must be PWM) (pin 8)
eencae 0:be41a15e7a86 227 *
eencae 0:be41a15e7a86 228 */
eencae 0:be41a15e7a86 229 N5110(PinName const scePin,
eencae 0:be41a15e7a86 230 PinName const rstPin,
eencae 0:be41a15e7a86 231 PinName const dcPin,
eencae 0:be41a15e7a86 232 PinName const mosiPin,
eencae 0:be41a15e7a86 233 PinName const sclkPin,
eencae 0:be41a15e7a86 234 PinName const ledPin);
eencae 0:be41a15e7a86 235
eencae 0:be41a15e7a86 236 /**
eencae 0:be41a15e7a86 237 * Free allocated memory when object goes out of scope
eencae 0:be41a15e7a86 238 */
eencae 0:be41a15e7a86 239 ~N5110();
eencae 0:be41a15e7a86 240
eencae 0:be41a15e7a86 241 /** Initialise display
eencae 0:be41a15e7a86 242 *
eencae 0:be41a15e7a86 243 * Powers up the display and turns on backlight (50% brightness default).
eencae 0:be41a15e7a86 244 * Sets the display up in horizontal addressing mode and with normal video mode.
eencae 0:be41a15e7a86 245 */
eencae 0:be41a15e7a86 246 void init();
eencae 0:be41a15e7a86 247
eencae 0:be41a15e7a86 248 /** Turn off
eencae 0:be41a15e7a86 249 *
eencae 0:be41a15e7a86 250 * Powers down the display and turns of the backlight.
eencae 0:be41a15e7a86 251 * Needs to be reinitialised before being re-used.
eencae 0:be41a15e7a86 252 */
eencae 0:be41a15e7a86 253 void turnOff();
eencae 0:be41a15e7a86 254
eencae 0:be41a15e7a86 255 /** Clear
eencae 0:be41a15e7a86 256 *
eencae 0:be41a15e7a86 257 * Clears the screen buffer.
eencae 0:be41a15e7a86 258 */
eencae 0:be41a15e7a86 259 void clear();
eencae 0:be41a15e7a86 260
eencae 0:be41a15e7a86 261 /** Set screen constrast
eencae 0:be41a15e7a86 262 * @param constrast - float in range 0.0 to 1.0 (0.40 to 0.60 is usually a good value)
eencae 0:be41a15e7a86 263 */
eencae 0:be41a15e7a86 264 void setContrast(float contrast);
eencae 0:be41a15e7a86 265
eencae 0:be41a15e7a86 266 /** Turn on normal video mode (default)
eencae 0:be41a15e7a86 267 * Black on white
eencae 0:be41a15e7a86 268 */
eencae 0:be41a15e7a86 269 void normalMode();
eencae 0:be41a15e7a86 270
eencae 0:be41a15e7a86 271 /** Turn on inverse video mode (default)
eencae 0:be41a15e7a86 272 * White on black
eencae 0:be41a15e7a86 273 */
eencae 0:be41a15e7a86 274 void inverseMode();
eencae 0:be41a15e7a86 275
eencae 0:be41a15e7a86 276 /** Backlight On
eencae 0:be41a15e7a86 277 *
eencae 0:be41a15e7a86 278 * Turns backlight on
eencae 0:be41a15e7a86 279 */
eencae 0:be41a15e7a86 280 void backLightOn();
eencae 0:be41a15e7a86 281
eencae 0:be41a15e7a86 282 /** Set Brightness
eencae 0:be41a15e7a86 283 *
eencae 0:be41a15e7a86 284 * Turns backlight off
eencae 0:be41a15e7a86 285 */
eencae 0:be41a15e7a86 286 void backLightOff();
eencae 0:be41a15e7a86 287
eencae 0:be41a15e7a86 288 /** Print String
eencae 0:be41a15e7a86 289 *
eencae 0:be41a15e7a86 290 * Prints a string of characters to the screen buffer. String is cut-off after the 83rd pixel.
eencae 0:be41a15e7a86 291 * @param x - the column number (0 to 83)
eencae 0:be41a15e7a86 292 * @param y - the row number (0 to 5) - the display is split into 6 banks - each bank can be considered a row
eencae 0:be41a15e7a86 293 */
eencae 0:be41a15e7a86 294 void printString(char const *str,
eencae 0:be41a15e7a86 295 unsigned int const x,
eencae 0:be41a15e7a86 296 unsigned int const y);
eencae 0:be41a15e7a86 297
eencae 0:be41a15e7a86 298 /** Print Character
eencae 0:be41a15e7a86 299 *
eencae 0:be41a15e7a86 300 * Sends a character to the screen buffer. Printed at the specified location. Character is cut-off after the 83rd pixel.
eencae 0:be41a15e7a86 301 * @param c - the character to print. Can print ASCII as so printChar('C').
eencae 0:be41a15e7a86 302 * @param x - the column number (0 to 83)
eencae 0:be41a15e7a86 303 * @param y - the row number (0 to 5) - the display is split into 6 banks - each bank can be considered a row
eencae 0:be41a15e7a86 304 */
eencae 0:be41a15e7a86 305 void printChar(char const c,
eencae 0:be41a15e7a86 306 unsigned int const x,
eencae 0:be41a15e7a86 307 unsigned int const y);
eencae 0:be41a15e7a86 308
eencae 0:be41a15e7a86 309 /**
eencae 0:be41a15e7a86 310 * @brief Set a Pixel
eencae 0:be41a15e7a86 311 *
eencae 0:be41a15e7a86 312 * @param x The x co-ordinate of the pixel (0 to 83)
eencae 0:be41a15e7a86 313 * @param y The y co-ordinate of the pixel (0 to 47)
eencae 0:be41a15e7a86 314 * @param state The state of the pixel [true=black (default), false=white]
eencae 0:be41a15e7a86 315 *
eencae 0:be41a15e7a86 316 * @details This function sets the state of a pixel in the screen buffer.
eencae 0:be41a15e7a86 317 * The third parameter can be omitted,
eencae 0:be41a15e7a86 318 */
eencae 0:be41a15e7a86 319 void setPixel(unsigned int const x,
eencae 0:be41a15e7a86 320 unsigned int const y,
eencae 0:be41a15e7a86 321 bool const state = true);
eencae 0:be41a15e7a86 322
eencae 0:be41a15e7a86 323 /**
eencae 0:be41a15e7a86 324 * @brief Clear a Pixel
eencae 0:be41a15e7a86 325 *
eencae 0:be41a15e7a86 326 * @param x - the x co-ordinate of the pixel (0 to 83)
eencae 0:be41a15e7a86 327 * @param y - the y co-ordinate of the pixel (0 to 47)
eencae 0:be41a15e7a86 328 *
eencae 0:be41a15e7a86 329 * @details This function clears pixel in the screen buffer
eencae 0:be41a15e7a86 330 *
eencae 0:be41a15e7a86 331 * @deprecated Use setPixel(x, y, false) instead
eencae 0:be41a15e7a86 332 */
eencae 0:be41a15e7a86 333 void clearPixel(unsigned int const x,
eencae 0:be41a15e7a86 334 unsigned int const y)
eencae 0:be41a15e7a86 335 __attribute__((deprecated("Use setPixel(x,y,false) instead")));
eencae 0:be41a15e7a86 336
eencae 0:be41a15e7a86 337 /** Get a Pixel
eencae 0:be41a15e7a86 338 *
eencae 0:be41a15e7a86 339 * This function gets the status of a pixel in the screen buffer.
eencae 0:be41a15e7a86 340 * @param x - the x co-ordinate of the pixel (0 to 83)
eencae 0:be41a15e7a86 341 * @param y - the y co-ordinate of the pixel (0 to 47)
eencae 0:be41a15e7a86 342 * @returns
eencae 0:be41a15e7a86 343 * 0 - pixel is clear
eencae 0:be41a15e7a86 344 * 1 - pixel is set
eencae 0:be41a15e7a86 345 */
eencae 0:be41a15e7a86 346 int getPixel(unsigned int const x,
eencae 0:be41a15e7a86 347 unsigned int const y) const;
eencae 0:be41a15e7a86 348
eencae 0:be41a15e7a86 349 /** Refresh display
eencae 0:be41a15e7a86 350 *
eencae 0:be41a15e7a86 351 * This functions sends the screen buffer to the display.
eencae 0:be41a15e7a86 352 */
eencae 0:be41a15e7a86 353 void refresh();
eencae 0:be41a15e7a86 354
eencae 0:be41a15e7a86 355 /** Randomise buffer
eencae 0:be41a15e7a86 356 *
eencae 0:be41a15e7a86 357 * This function fills the buffer with random data. Can be used to test the display.
eencae 0:be41a15e7a86 358 * A call to refresh() must be made to update the display to reflect the change in pixels.
eencae 0:be41a15e7a86 359 * The seed is not set and so the generated pattern will probably be the same each time.
eencae 0:be41a15e7a86 360 * TODO: Randomise the seed - maybe using the noise on the AnalogIn pins.
eencae 0:be41a15e7a86 361 */
eencae 0:be41a15e7a86 362 void randomiseBuffer();
eencae 0:be41a15e7a86 363
eencae 0:be41a15e7a86 364 /** Plot Array
eencae 0:be41a15e7a86 365 *
eencae 0:be41a15e7a86 366 * This function plots a one-dimensional array in the buffer.
eencae 0:be41a15e7a86 367 * @param array[] - y values of the plot. Values should be normalised in the range 0.0 to 1.0. First 84 plotted.
eencae 0:be41a15e7a86 368 */
eencae 0:be41a15e7a86 369 void plotArray(float const array[]);
eencae 0:be41a15e7a86 370
eencae 0:be41a15e7a86 371 /** Draw Circle
eencae 0:be41a15e7a86 372 *
eencae 0:be41a15e7a86 373 * This function draws a circle at the specified origin with specified radius in the screen buffer
eencae 0:be41a15e7a86 374 * Uses the midpoint circle algorithm.
eencae 0:be41a15e7a86 375 * @see http://en.wikipedia.org/wiki/Midpoint_circle_algorithm
eencae 0:be41a15e7a86 376 * @param x0 - x-coordinate of centre
eencae 0:be41a15e7a86 377 * @param y0 - y-coordinate of centre
eencae 0:be41a15e7a86 378 * @param radius - radius of circle in pixels
eencae 0:be41a15e7a86 379 * @param fill - fill-type for the shape
eencae 0:be41a15e7a86 380 */
eencae 0:be41a15e7a86 381 void drawCircle(unsigned int const x0,
eencae 0:be41a15e7a86 382 unsigned int const y0,
eencae 0:be41a15e7a86 383 unsigned int const radius,
eencae 0:be41a15e7a86 384 FillType const fill);
alex_20 1:2ae7a8b01771 385
alex_20 1:2ae7a8b01771 386
alex_20 4:def20a1665d1 387 // Draw Curve
alex_20 3:cbe2dcca5058 388 void drawCurve(std::vector<Vector2Df> curve_points,
alex_20 3:cbe2dcca5058 389 int offset,
alex_20 4:def20a1665d1 390 int dash_len,
alex_20 3:cbe2dcca5058 391 int type);
eencae 0:be41a15e7a86 392
eencae 0:be41a15e7a86 393 /** Draw Line
eencae 0:be41a15e7a86 394 *
eencae 0:be41a15e7a86 395 * This function draws a line between the specified points using linear interpolation.
alex_20 4:def20a1665d1 396 * @param x0 - x-coordinate of first point
alex_20 4:def20a1665d1 397 * @param y0 - y-coordinate of first point
alex_20 4:def20a1665d1 398 * @param x1 - x-coordinate of last point
alex_20 4:def20a1665d1 399 * @param y1 - y-coordinate of last point
alex_20 4:def20a1665d1 400 * @param offset - moved from position
alex_20 4:def20a1665d1 401 * @param step - 0 white, 1 black, >= 2 dotted
eencae 0:be41a15e7a86 402 */
eencae 0:be41a15e7a86 403 void drawLine(unsigned int const x0,
eencae 0:be41a15e7a86 404 unsigned int const y0,
eencae 0:be41a15e7a86 405 unsigned int const x1,
eencae 0:be41a15e7a86 406 unsigned int const y1,
alex_20 4:def20a1665d1 407 unsigned int const offset,
alex_20 4:def20a1665d1 408 unsigned int const step);
eencae 0:be41a15e7a86 409
eencae 0:be41a15e7a86 410 /** Draw Rectangle
eencae 0:be41a15e7a86 411 *
eencae 0:be41a15e7a86 412 * This function draws a rectangle.
eencae 0:be41a15e7a86 413 * @param x0 - x-coordinate of origin (top-left)
eencae 0:be41a15e7a86 414 * @param y0 - y-coordinate of origin (top-left)
eencae 0:be41a15e7a86 415 * @param width - width of rectangle
eencae 0:be41a15e7a86 416 * @param height - height of rectangle
eencae 0:be41a15e7a86 417 * @param fill - fill-type for the shape
eencae 0:be41a15e7a86 418 */
eencae 0:be41a15e7a86 419 void drawRect(unsigned int const x0,
eencae 0:be41a15e7a86 420 unsigned int const y0,
eencae 0:be41a15e7a86 421 unsigned int const width,
eencae 0:be41a15e7a86 422 unsigned int const height,
eencae 0:be41a15e7a86 423 FillType const fill);
eencae 0:be41a15e7a86 424
eencae 0:be41a15e7a86 425 /** Draw Sprite
eencae 0:be41a15e7a86 426 *
eencae 0:be41a15e7a86 427 * This function draws a sprite as defined in a 2D array
eencae 0:be41a15e7a86 428 * @param x0 - x-coordinate of origin (top-left)
eencae 0:be41a15e7a86 429 * @param y0 - y-coordinate of origin (top-left)
eencae 0:be41a15e7a86 430 * @param nrows - number of rows in sprite
eencae 0:be41a15e7a86 431 * @param ncols - number of columns in sprite
eencae 0:be41a15e7a86 432 * @param sprite - 2D array representing the sprite
eencae 0:be41a15e7a86 433 */
eencae 0:be41a15e7a86 434 void drawSprite(int x0,
eencae 0:be41a15e7a86 435 int y0,
eencae 0:be41a15e7a86 436 int nrows,
eencae 0:be41a15e7a86 437 int ncols,
eencae 0:be41a15e7a86 438 int *sprite);
eencae 0:be41a15e7a86 439
eencae 0:be41a15e7a86 440
eencae 0:be41a15e7a86 441 private:
eencae 0:be41a15e7a86 442 // methods
eencae 0:be41a15e7a86 443 void setXYAddress(unsigned int const x,
eencae 0:be41a15e7a86 444 unsigned int const y);
eencae 0:be41a15e7a86 445 void initSPI();
eencae 0:be41a15e7a86 446 void turnOn();
eencae 0:be41a15e7a86 447 void reset();
eencae 0:be41a15e7a86 448 void clearRAM();
eencae 0:be41a15e7a86 449 void sendCommand(unsigned char command);
eencae 0:be41a15e7a86 450 void sendData(unsigned char data);
eencae 0:be41a15e7a86 451 void setTempCoefficient(char tc); // 0 to 3
eencae 0:be41a15e7a86 452 void setBias(char bias); // 0 to 7
eencae 0:be41a15e7a86 453 };
eencae 0:be41a15e7a86 454
eencae 0:be41a15e7a86 455 const unsigned char font5x7[480] = {
eencae 0:be41a15e7a86 456 0x00, 0x00, 0x00, 0x00, 0x00,// (space)
eencae 0:be41a15e7a86 457 0x00, 0x00, 0x5F, 0x00, 0x00,// !
eencae 0:be41a15e7a86 458 0x00, 0x07, 0x00, 0x07, 0x00,// "
eencae 0:be41a15e7a86 459 0x14, 0x7F, 0x14, 0x7F, 0x14,// #
eencae 0:be41a15e7a86 460 0x24, 0x2A, 0x7F, 0x2A, 0x12,// $
eencae 0:be41a15e7a86 461 0x23, 0x13, 0x08, 0x64, 0x62,// %
eencae 0:be41a15e7a86 462 0x36, 0x49, 0x55, 0x22, 0x50,// &
eencae 0:be41a15e7a86 463 0x00, 0x05, 0x03, 0x00, 0x00,// '
eencae 0:be41a15e7a86 464 0x00, 0x1C, 0x22, 0x41, 0x00,// (
eencae 0:be41a15e7a86 465 0x00, 0x41, 0x22, 0x1C, 0x00,// )
eencae 0:be41a15e7a86 466 0x08, 0x2A, 0x1C, 0x2A, 0x08,// *
eencae 0:be41a15e7a86 467 0x08, 0x08, 0x3E, 0x08, 0x08,// +
eencae 0:be41a15e7a86 468 0x00, 0x50, 0x30, 0x00, 0x00,// ,
eencae 0:be41a15e7a86 469 0x08, 0x08, 0x08, 0x08, 0x08,// -
eencae 0:be41a15e7a86 470 0x00, 0x60, 0x60, 0x00, 0x00,// .
eencae 0:be41a15e7a86 471 0x20, 0x10, 0x08, 0x04, 0x02,// /
eencae 0:be41a15e7a86 472 0x3E, 0x51, 0x49, 0x45, 0x3E,// 0
eencae 0:be41a15e7a86 473 0x00, 0x42, 0x7F, 0x40, 0x00,// 1
eencae 0:be41a15e7a86 474 0x42, 0x61, 0x51, 0x49, 0x46,// 2
eencae 0:be41a15e7a86 475 0x21, 0x41, 0x45, 0x4B, 0x31,// 3
eencae 0:be41a15e7a86 476 0x18, 0x14, 0x12, 0x7F, 0x10,// 4
eencae 0:be41a15e7a86 477 0x27, 0x45, 0x45, 0x45, 0x39,// 5
eencae 0:be41a15e7a86 478 0x3C, 0x4A, 0x49, 0x49, 0x30,// 6
eencae 0:be41a15e7a86 479 0x01, 0x71, 0x09, 0x05, 0x03,// 7
eencae 0:be41a15e7a86 480 0x36, 0x49, 0x49, 0x49, 0x36,// 8
eencae 0:be41a15e7a86 481 0x06, 0x49, 0x49, 0x29, 0x1E,// 9
eencae 0:be41a15e7a86 482 0x00, 0x36, 0x36, 0x00, 0x00,// :
eencae 0:be41a15e7a86 483 0x00, 0x56, 0x36, 0x00, 0x00,// ;
eencae 0:be41a15e7a86 484 0x00, 0x08, 0x14, 0x22, 0x41,// <
eencae 0:be41a15e7a86 485 0x14, 0x14, 0x14, 0x14, 0x14,// =
eencae 0:be41a15e7a86 486 0x41, 0x22, 0x14, 0x08, 0x00,// >
eencae 0:be41a15e7a86 487 0x02, 0x01, 0x51, 0x09, 0x06,// ?
eencae 0:be41a15e7a86 488 0x32, 0x49, 0x79, 0x41, 0x3E,// @
eencae 0:be41a15e7a86 489 0x7E, 0x11, 0x11, 0x11, 0x7E,// A
eencae 0:be41a15e7a86 490 0x7F, 0x49, 0x49, 0x49, 0x36,// B
eencae 0:be41a15e7a86 491 0x3E, 0x41, 0x41, 0x41, 0x22,// C
eencae 0:be41a15e7a86 492 0x7F, 0x41, 0x41, 0x22, 0x1C,// D
eencae 0:be41a15e7a86 493 0x7F, 0x49, 0x49, 0x49, 0x41,// E
eencae 0:be41a15e7a86 494 0x7F, 0x09, 0x09, 0x01, 0x01,// F
eencae 0:be41a15e7a86 495 0x3E, 0x41, 0x41, 0x51, 0x32,// G
eencae 0:be41a15e7a86 496 0x7F, 0x08, 0x08, 0x08, 0x7F,// H
eencae 0:be41a15e7a86 497 0x00, 0x41, 0x7F, 0x41, 0x00,// I
eencae 0:be41a15e7a86 498 0x20, 0x40, 0x41, 0x3F, 0x01,// J
eencae 0:be41a15e7a86 499 0x7F, 0x08, 0x14, 0x22, 0x41,// K
eencae 0:be41a15e7a86 500 0x7F, 0x40, 0x40, 0x40, 0x40,// L
eencae 0:be41a15e7a86 501 0x7F, 0x02, 0x04, 0x02, 0x7F,// M
eencae 0:be41a15e7a86 502 0x7F, 0x04, 0x08, 0x10, 0x7F,// N
eencae 0:be41a15e7a86 503 0x3E, 0x41, 0x41, 0x41, 0x3E,// O
eencae 0:be41a15e7a86 504 0x7F, 0x09, 0x09, 0x09, 0x06,// P
eencae 0:be41a15e7a86 505 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q
eencae 0:be41a15e7a86 506 0x7F, 0x09, 0x19, 0x29, 0x46,// R
eencae 0:be41a15e7a86 507 0x46, 0x49, 0x49, 0x49, 0x31,// S
eencae 0:be41a15e7a86 508 0x01, 0x01, 0x7F, 0x01, 0x01,// T
eencae 0:be41a15e7a86 509 0x3F, 0x40, 0x40, 0x40, 0x3F,// U
eencae 0:be41a15e7a86 510 0x1F, 0x20, 0x40, 0x20, 0x1F,// V
eencae 0:be41a15e7a86 511 0x7F, 0x20, 0x18, 0x20, 0x7F,// W
eencae 0:be41a15e7a86 512 0x63, 0x14, 0x08, 0x14, 0x63,// X
eencae 0:be41a15e7a86 513 0x03, 0x04, 0x78, 0x04, 0x03,// Y
eencae 0:be41a15e7a86 514 0x61, 0x51, 0x49, 0x45, 0x43,// Z
eencae 0:be41a15e7a86 515 0x00, 0x00, 0x7F, 0x41, 0x41,// [
eencae 0:be41a15e7a86 516 0x02, 0x04, 0x08, 0x10, 0x20,// "\"
eencae 0:be41a15e7a86 517 0x41, 0x41, 0x7F, 0x00, 0x00,// ]
eencae 0:be41a15e7a86 518 0x04, 0x02, 0x01, 0x02, 0x04,// ^
eencae 0:be41a15e7a86 519 0x40, 0x40, 0x40, 0x40, 0x40,// _
eencae 0:be41a15e7a86 520 0x00, 0x01, 0x02, 0x04, 0x00,// `
eencae 0:be41a15e7a86 521 0x20, 0x54, 0x54, 0x54, 0x78,// a
eencae 0:be41a15e7a86 522 0x7F, 0x48, 0x44, 0x44, 0x38,// b
eencae 0:be41a15e7a86 523 0x38, 0x44, 0x44, 0x44, 0x20,// c
eencae 0:be41a15e7a86 524 0x38, 0x44, 0x44, 0x48, 0x7F,// d
eencae 0:be41a15e7a86 525 0x38, 0x54, 0x54, 0x54, 0x18,// e
eencae 0:be41a15e7a86 526 0x08, 0x7E, 0x09, 0x01, 0x02,// f
eencae 0:be41a15e7a86 527 0x08, 0x14, 0x54, 0x54, 0x3C,// g
eencae 0:be41a15e7a86 528 0x7F, 0x08, 0x04, 0x04, 0x78,// h
eencae 0:be41a15e7a86 529 0x00, 0x44, 0x7D, 0x40, 0x00,// i
eencae 0:be41a15e7a86 530 0x20, 0x40, 0x44, 0x3D, 0x00,// j
eencae 0:be41a15e7a86 531 0x00, 0x7F, 0x10, 0x28, 0x44,// k
eencae 0:be41a15e7a86 532 0x00, 0x41, 0x7F, 0x40, 0x00,// l
eencae 0:be41a15e7a86 533 0x7C, 0x04, 0x18, 0x04, 0x78,// m
eencae 0:be41a15e7a86 534 0x7C, 0x08, 0x04, 0x04, 0x78,// n
eencae 0:be41a15e7a86 535 0x38, 0x44, 0x44, 0x44, 0x38,// o
eencae 0:be41a15e7a86 536 0x7C, 0x14, 0x14, 0x14, 0x08,// p
eencae 0:be41a15e7a86 537 0x08, 0x14, 0x14, 0x18, 0x7C,// q
eencae 0:be41a15e7a86 538 0x7C, 0x08, 0x04, 0x04, 0x08,// r
eencae 0:be41a15e7a86 539 0x48, 0x54, 0x54, 0x54, 0x20,// s
eencae 0:be41a15e7a86 540 0x04, 0x3F, 0x44, 0x40, 0x20,// t
eencae 0:be41a15e7a86 541 0x3C, 0x40, 0x40, 0x20, 0x7C,// u
eencae 0:be41a15e7a86 542 0x1C, 0x20, 0x40, 0x20, 0x1C,// v
eencae 0:be41a15e7a86 543 0x3C, 0x40, 0x30, 0x40, 0x3C,// w
eencae 0:be41a15e7a86 544 0x44, 0x28, 0x10, 0x28, 0x44,// x
eencae 0:be41a15e7a86 545 0x0C, 0x50, 0x50, 0x50, 0x3C,// y
eencae 0:be41a15e7a86 546 0x44, 0x64, 0x54, 0x4C, 0x44,// z
eencae 0:be41a15e7a86 547 0x00, 0x08, 0x36, 0x41, 0x00,// {
eencae 0:be41a15e7a86 548 0x00, 0x00, 0x7F, 0x00, 0x00,// |
eencae 0:be41a15e7a86 549 0x00, 0x41, 0x36, 0x08, 0x00,// }
eencae 0:be41a15e7a86 550 0x08, 0x08, 0x2A, 0x1C, 0x08,// ->
eencae 0:be41a15e7a86 551 0x08, 0x1C, 0x2A, 0x08, 0x08 // <-
eencae 0:be41a15e7a86 552 };
eencae 0:be41a15e7a86 553
eencae 0:be41a15e7a86 554 #endif