My code work about accelerometer MMA8452

Dependencies:   Beep MMA8452 mbed

Committer:
lssyczy
Date:
Sat May 09 11:55:51 2015 +0000
Revision:
0:ef370734cc1a
my code submit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lssyczy 0:ef370734cc1a 1 /**
lssyczy 0:ef370734cc1a 2 @file N5110.cpp
lssyczy 0:ef370734cc1a 3
lssyczy 0:ef370734cc1a 4 @brief Member functions implementations
lssyczy 0:ef370734cc1a 5
lssyczy 0:ef370734cc1a 6 */
lssyczy 0:ef370734cc1a 7 #include "mbed.h"
lssyczy 0:ef370734cc1a 8 #include "N5110.h"
lssyczy 0:ef370734cc1a 9 #include "MMA8452.h"
lssyczy 0:ef370734cc1a 10 #include "Beep.h"
lssyczy 0:ef370734cc1a 11
lssyczy 0:ef370734cc1a 12
lssyczy 0:ef370734cc1a 13 N5110::N5110(PinName pwrPin, PinName scePin, PinName rstPin, PinName dcPin, PinName mosiPin, PinName sclkPin, PinName ledPin)
lssyczy 0:ef370734cc1a 14 {
lssyczy 0:ef370734cc1a 15
lssyczy 0:ef370734cc1a 16 spi = new SPI(mosiPin,NC,sclkPin); // create new SPI instance and initialise
lssyczy 0:ef370734cc1a 17 initSPI();
lssyczy 0:ef370734cc1a 18
lssyczy 0:ef370734cc1a 19 // set up pins as required
lssyczy 0:ef370734cc1a 20 led = new PwmOut(ledPin);
lssyczy 0:ef370734cc1a 21 pwr = new DigitalOut(pwrPin);
lssyczy 0:ef370734cc1a 22 sce = new DigitalOut(scePin);
lssyczy 0:ef370734cc1a 23 rst = new DigitalOut(rstPin);
lssyczy 0:ef370734cc1a 24 dc = new DigitalOut(dcPin);
lssyczy 0:ef370734cc1a 25
lssyczy 0:ef370734cc1a 26 }
lssyczy 0:ef370734cc1a 27
lssyczy 0:ef370734cc1a 28 // initialise function - powers up and sends the initialisation commands
lssyczy 0:ef370734cc1a 29 void N5110::init()
lssyczy 0:ef370734cc1a 30 {
lssyczy 0:ef370734cc1a 31 turnOn(); // power up
lssyczy 0:ef370734cc1a 32 wait_ms(10); // small delay seems to prevent spurious pixels during mbed reset
lssyczy 0:ef370734cc1a 33 reset(); // reset LCD - must be done within 100 ms
lssyczy 0:ef370734cc1a 34
lssyczy 0:ef370734cc1a 35 // function set - extended
lssyczy 0:ef370734cc1a 36 sendCommand(0x20 | CMD_FS_ACTIVE_MODE | CMD_FS_HORIZONTAL_MODE | CMD_FS_EXTENDED_MODE);
lssyczy 0:ef370734cc1a 37 // Don't completely understand these parameters - they seem to work as they are
lssyczy 0:ef370734cc1a 38 // Consult the datasheet if you need to change them
lssyczy 0:ef370734cc1a 39 sendCommand(CMD_VOP_7V38); // operating voltage - these values are from Chris Yan's Library
lssyczy 0:ef370734cc1a 40 sendCommand(CMD_TC_TEMP_2); // temperature control
lssyczy 0:ef370734cc1a 41 sendCommand(CMD_BI_MUX_48); // bias
lssyczy 0:ef370734cc1a 42
lssyczy 0:ef370734cc1a 43 // function set - basic
lssyczy 0:ef370734cc1a 44 sendCommand(0x20 | CMD_FS_ACTIVE_MODE | CMD_FS_HORIZONTAL_MODE | CMD_FS_BASIC_MODE);
lssyczy 0:ef370734cc1a 45 normalMode(); // normal video mode by default
lssyczy 0:ef370734cc1a 46 sendCommand(CMD_DC_NORMAL_MODE); // black on white
lssyczy 0:ef370734cc1a 47
lssyczy 0:ef370734cc1a 48 // RAM is undefined at power-up so clear
lssyczy 0:ef370734cc1a 49 clearRAM();
lssyczy 0:ef370734cc1a 50
lssyczy 0:ef370734cc1a 51 }
lssyczy 0:ef370734cc1a 52
lssyczy 0:ef370734cc1a 53 // sets normal video mode (black on white)
lssyczy 0:ef370734cc1a 54 void N5110::normalMode()
lssyczy 0:ef370734cc1a 55 {
lssyczy 0:ef370734cc1a 56 sendCommand(CMD_DC_NORMAL_MODE);
lssyczy 0:ef370734cc1a 57
lssyczy 0:ef370734cc1a 58 }
lssyczy 0:ef370734cc1a 59
lssyczy 0:ef370734cc1a 60 // sets normal video mode (white on black)
lssyczy 0:ef370734cc1a 61 void N5110::inverseMode()
lssyczy 0:ef370734cc1a 62 {
lssyczy 0:ef370734cc1a 63 sendCommand(CMD_DC_INVERT_VIDEO);
lssyczy 0:ef370734cc1a 64 }
lssyczy 0:ef370734cc1a 65
lssyczy 0:ef370734cc1a 66 // function to power up the LCD and backlight
lssyczy 0:ef370734cc1a 67 void N5110::turnOn()
lssyczy 0:ef370734cc1a 68 {
lssyczy 0:ef370734cc1a 69 // set brightness of LED - 0.0 to 1.0 - default is 50%
lssyczy 0:ef370734cc1a 70 setBrightness(0.5);
lssyczy 0:ef370734cc1a 71 pwr->write(1); // apply power
lssyczy 0:ef370734cc1a 72 }
lssyczy 0:ef370734cc1a 73
lssyczy 0:ef370734cc1a 74 // function to power down LCD
lssyczy 0:ef370734cc1a 75 void N5110::turnOff()
lssyczy 0:ef370734cc1a 76 {
lssyczy 0:ef370734cc1a 77 setBrightness(0.0); // turn backlight off
lssyczy 0:ef370734cc1a 78 clearRAM(); // clear RAM to ensure specified current consumption
lssyczy 0:ef370734cc1a 79 // send command to ensure we are in basic mode
lssyczy 0:ef370734cc1a 80 sendCommand(0x20 | CMD_FS_ACTIVE_MODE | CMD_FS_HORIZONTAL_MODE | CMD_FS_BASIC_MODE);
lssyczy 0:ef370734cc1a 81 // clear the display
lssyczy 0:ef370734cc1a 82 sendCommand(CMD_DC_CLEAR_DISPLAY);
lssyczy 0:ef370734cc1a 83 // enter the extended mode and power down
lssyczy 0:ef370734cc1a 84 sendCommand(0x20 | CMD_FS_POWER_DOWN_MODE | CMD_FS_HORIZONTAL_MODE | CMD_FS_EXTENDED_MODE);
lssyczy 0:ef370734cc1a 85 // small delay and then turn off the power pin
lssyczy 0:ef370734cc1a 86 wait_ms(10);
lssyczy 0:ef370734cc1a 87 pwr->write(0);
lssyczy 0:ef370734cc1a 88
lssyczy 0:ef370734cc1a 89 }
lssyczy 0:ef370734cc1a 90
lssyczy 0:ef370734cc1a 91 // function to change LED backlight brightness
lssyczy 0:ef370734cc1a 92 void N5110::setBrightness(float brightness)
lssyczy 0:ef370734cc1a 93 {
lssyczy 0:ef370734cc1a 94 // check whether brightness is within range
lssyczy 0:ef370734cc1a 95 if (brightness < 0.0)
lssyczy 0:ef370734cc1a 96 brightness = 0.0;
lssyczy 0:ef370734cc1a 97 if (brightness > 1.0)
lssyczy 0:ef370734cc1a 98 brightness = 1.0;
lssyczy 0:ef370734cc1a 99 // set PWM duty cycle
lssyczy 0:ef370734cc1a 100 led->write(brightness);
lssyczy 0:ef370734cc1a 101 }
lssyczy 0:ef370734cc1a 102
lssyczy 0:ef370734cc1a 103
lssyczy 0:ef370734cc1a 104 // pulse the active low reset line
lssyczy 0:ef370734cc1a 105 void N5110::reset()
lssyczy 0:ef370734cc1a 106 {
lssyczy 0:ef370734cc1a 107 rst->write(0); // reset the LCD
lssyczy 0:ef370734cc1a 108 rst->write(1);
lssyczy 0:ef370734cc1a 109 }
lssyczy 0:ef370734cc1a 110
lssyczy 0:ef370734cc1a 111 // function to initialise SPI peripheral
lssyczy 0:ef370734cc1a 112 void N5110::initSPI()
lssyczy 0:ef370734cc1a 113 {
lssyczy 0:ef370734cc1a 114 spi->format(8,1); // 8 bits, Mode 1 - polarity 0, phase 1 - base value of clock is 0, data captured on falling edge/propagated on rising edge
lssyczy 0:ef370734cc1a 115 spi->frequency(4000000); // maximum of screen is 4 MHz
lssyczy 0:ef370734cc1a 116 }
lssyczy 0:ef370734cc1a 117
lssyczy 0:ef370734cc1a 118 // send a command to the display
lssyczy 0:ef370734cc1a 119 void N5110::sendCommand(unsigned char command)
lssyczy 0:ef370734cc1a 120 {
lssyczy 0:ef370734cc1a 121 dc->write(0); // set DC low for command
lssyczy 0:ef370734cc1a 122 sce->write(0); // set CE low to begin frame
lssyczy 0:ef370734cc1a 123 spi->write(command); // send command
lssyczy 0:ef370734cc1a 124 dc->write(1); // turn back to data by default
lssyczy 0:ef370734cc1a 125 sce->write(1); // set CE high to end frame (expected for transmission of single byte)
lssyczy 0:ef370734cc1a 126
lssyczy 0:ef370734cc1a 127 }
lssyczy 0:ef370734cc1a 128
lssyczy 0:ef370734cc1a 129 // send data to the display at the current XY address
lssyczy 0:ef370734cc1a 130 // dc is set to 1 (i.e. data) after sending a command and so should
lssyczy 0:ef370734cc1a 131 // be the default mode.
lssyczy 0:ef370734cc1a 132 void N5110::sendData(unsigned char data)
lssyczy 0:ef370734cc1a 133 {
lssyczy 0:ef370734cc1a 134 sce->write(0); // set CE low to begin frame
lssyczy 0:ef370734cc1a 135 spi->write(data);
lssyczy 0:ef370734cc1a 136 sce->write(1); // set CE high to end frame (expected for transmission of single byte)
lssyczy 0:ef370734cc1a 137 }
lssyczy 0:ef370734cc1a 138
lssyczy 0:ef370734cc1a 139 // this function writes 0 to the 504 bytes to clear the RAM
lssyczy 0:ef370734cc1a 140 void N5110::clearRAM()
lssyczy 0:ef370734cc1a 141 {
lssyczy 0:ef370734cc1a 142 int i;
lssyczy 0:ef370734cc1a 143 sce->write(0); //set CE low to begin frame
lssyczy 0:ef370734cc1a 144 for(i = 0; i < WIDTH * HEIGHT; i++) { // 48 x 84 bits = 504 bytes
lssyczy 0:ef370734cc1a 145 spi->write(0x00); // send 0's
lssyczy 0:ef370734cc1a 146 }
lssyczy 0:ef370734cc1a 147 sce->write(1); // set CE high to end frame
lssyczy 0:ef370734cc1a 148
lssyczy 0:ef370734cc1a 149 }
lssyczy 0:ef370734cc1a 150
lssyczy 0:ef370734cc1a 151 // function to set the XY address in RAM for subsequenct data write
lssyczy 0:ef370734cc1a 152 void N5110::setXYAddress(int x, int y)
lssyczy 0:ef370734cc1a 153 {
lssyczy 0:ef370734cc1a 154 if (x>=0 && x<WIDTH && y>=0 && y<HEIGHT) { // check within range
lssyczy 0:ef370734cc1a 155 sendCommand(0x80 | x); // send addresses to display with relevant mask
lssyczy 0:ef370734cc1a 156 sendCommand(0x40 | y);
lssyczy 0:ef370734cc1a 157 }
lssyczy 0:ef370734cc1a 158 }
lssyczy 0:ef370734cc1a 159
lssyczy 0:ef370734cc1a 160 // These functions are used to set, clear and get the value of pixels in the display
lssyczy 0:ef370734cc1a 161 // Pixels are addressed in the range of 0 to 47 (y) and 0 to 83 (x). The refresh()
lssyczy 0:ef370734cc1a 162 // function must be called after set and clear in order to update the display
lssyczy 0:ef370734cc1a 163 void N5110::setPixel(int x, int y)
lssyczy 0:ef370734cc1a 164 {
lssyczy 0:ef370734cc1a 165 if (x>=0 && x<WIDTH && y>=0 && y<HEIGHT) { // check within range
lssyczy 0:ef370734cc1a 166 // calculate bank and shift 1 to required position in the data byte
lssyczy 0:ef370734cc1a 167 buffer[x][y/8] |= (1 << y%8);
lssyczy 0:ef370734cc1a 168 }
lssyczy 0:ef370734cc1a 169 }
lssyczy 0:ef370734cc1a 170
lssyczy 0:ef370734cc1a 171 void N5110::clearPixel(int x, int y)
lssyczy 0:ef370734cc1a 172 {
lssyczy 0:ef370734cc1a 173 if (x>=0 && x<WIDTH && y>=0 && y<HEIGHT) { // check within range
lssyczy 0:ef370734cc1a 174 // calculate bank and shift 1 to required position (using bit clear)
lssyczy 0:ef370734cc1a 175 buffer[x][y/8] &= ~(1 << y%8);
lssyczy 0:ef370734cc1a 176 }
lssyczy 0:ef370734cc1a 177 }
lssyczy 0:ef370734cc1a 178
lssyczy 0:ef370734cc1a 179 int N5110::getPixel(int x, int y)
lssyczy 0:ef370734cc1a 180 {
lssyczy 0:ef370734cc1a 181 if (x>=0 && x<WIDTH && y>=0 && y<HEIGHT) { // check within range
lssyczy 0:ef370734cc1a 182 // return relevant bank and mask required bit
lssyczy 0:ef370734cc1a 183 return (int) buffer[x][y/8] & (1 << y%8);
lssyczy 0:ef370734cc1a 184 // note this does not necessarily return 1 - a non-zero number represents a pixel
lssyczy 0:ef370734cc1a 185 } else {
lssyczy 0:ef370734cc1a 186 return 0;
lssyczy 0:ef370734cc1a 187 }
lssyczy 0:ef370734cc1a 188 }
lssyczy 0:ef370734cc1a 189
lssyczy 0:ef370734cc1a 190 // function to refresh the display
lssyczy 0:ef370734cc1a 191 void N5110::refresh()
lssyczy 0:ef370734cc1a 192 {
lssyczy 0:ef370734cc1a 193 int i,j;
lssyczy 0:ef370734cc1a 194
lssyczy 0:ef370734cc1a 195 setXYAddress(0,0); // important to set address back to 0,0 before refreshing display
lssyczy 0:ef370734cc1a 196 // address auto increments after printing string, so buffer[0][0] will not coincide
lssyczy 0:ef370734cc1a 197 // with top-left pixel after priting string
lssyczy 0:ef370734cc1a 198
lssyczy 0:ef370734cc1a 199 sce->write(0); //set CE low to begin frame
lssyczy 0:ef370734cc1a 200
lssyczy 0:ef370734cc1a 201 for(j = 0; j < BANKS; j++) { // be careful to use correct order (j,i) for horizontal addressing
lssyczy 0:ef370734cc1a 202 for(i = 0; i < WIDTH; i++) {
lssyczy 0:ef370734cc1a 203 spi->write(buffer[i][j]); // send buffer
lssyczy 0:ef370734cc1a 204 }
lssyczy 0:ef370734cc1a 205 }
lssyczy 0:ef370734cc1a 206 sce->write(1); // set CE high to end frame
lssyczy 0:ef370734cc1a 207
lssyczy 0:ef370734cc1a 208 }
lssyczy 0:ef370734cc1a 209
lssyczy 0:ef370734cc1a 210 // fills the buffer with random bytes. Can be used to test the display.
lssyczy 0:ef370734cc1a 211 // The rand() function isn't seeded so it probably creates the same pattern everytime
lssyczy 0:ef370734cc1a 212 void N5110::randomiseBuffer()
lssyczy 0:ef370734cc1a 213 {
lssyczy 0:ef370734cc1a 214 int i,j;
lssyczy 0:ef370734cc1a 215 for(j = 0; j < BANKS; j++) { // be careful to use correct order (j,i) for horizontal addressing
lssyczy 0:ef370734cc1a 216 for(i = 0; i < WIDTH; i++) {
lssyczy 0:ef370734cc1a 217 buffer[i][j] = rand()%256; // generate random byte
lssyczy 0:ef370734cc1a 218 }
lssyczy 0:ef370734cc1a 219 }
lssyczy 0:ef370734cc1a 220
lssyczy 0:ef370734cc1a 221 }
lssyczy 0:ef370734cc1a 222
lssyczy 0:ef370734cc1a 223 // function to print 5x7 font
lssyczy 0:ef370734cc1a 224 void N5110::printChar(char c,int x,int y)
lssyczy 0:ef370734cc1a 225 {
lssyczy 0:ef370734cc1a 226 if (y>=0 && y<BANKS) { // check if printing in range of y banks
lssyczy 0:ef370734cc1a 227
lssyczy 0:ef370734cc1a 228 for (int i = 0; i < 5 ; i++ ) {
lssyczy 0:ef370734cc1a 229 int pixel_x = x+i;
lssyczy 0:ef370734cc1a 230 if (pixel_x > WIDTH-1) // ensure pixel isn't outside the buffer size (0 - 83)
lssyczy 0:ef370734cc1a 231 break;
lssyczy 0:ef370734cc1a 232 buffer[pixel_x][y] = font5x7[(c - 32)*5 + i];
lssyczy 0:ef370734cc1a 233 // array is offset by 32 relative to ASCII, each character is 5 pixels wide
lssyczy 0:ef370734cc1a 234 }
lssyczy 0:ef370734cc1a 235
lssyczy 0:ef370734cc1a 236 refresh(); // this sends the buffer to the display and sets address (cursor) back to 0,0
lssyczy 0:ef370734cc1a 237 }
lssyczy 0:ef370734cc1a 238 }
lssyczy 0:ef370734cc1a 239
lssyczy 0:ef370734cc1a 240 // function to print string at specified position
lssyczy 0:ef370734cc1a 241 void N5110::printString(const char * str,int x,int y)
lssyczy 0:ef370734cc1a 242 {
lssyczy 0:ef370734cc1a 243 if (y>=0 && y<BANKS) { // check if printing in range of y banks
lssyczy 0:ef370734cc1a 244
lssyczy 0:ef370734cc1a 245 int n = 0 ; // counter for number of characters in string
lssyczy 0:ef370734cc1a 246 // loop through string and print character
lssyczy 0:ef370734cc1a 247 while(*str) {
lssyczy 0:ef370734cc1a 248
lssyczy 0:ef370734cc1a 249 // writes the character bitmap data to the buffer, so that
lssyczy 0:ef370734cc1a 250 // text and pixels can be displayed at the same time
lssyczy 0:ef370734cc1a 251 for (int i = 0; i < 5 ; i++ ) {
lssyczy 0:ef370734cc1a 252 int pixel_x = x+i+n*6;
lssyczy 0:ef370734cc1a 253 if (pixel_x > WIDTH-1) // ensure pixel isn't outside the buffer size (0 - 83)
lssyczy 0:ef370734cc1a 254 break;
lssyczy 0:ef370734cc1a 255 buffer[pixel_x][y] = font5x7[(*str - 32)*5 + i];
lssyczy 0:ef370734cc1a 256 }
lssyczy 0:ef370734cc1a 257
lssyczy 0:ef370734cc1a 258 str++; // go to next character in string
lssyczy 0:ef370734cc1a 259
lssyczy 0:ef370734cc1a 260 n++; // increment index
lssyczy 0:ef370734cc1a 261
lssyczy 0:ef370734cc1a 262 }
lssyczy 0:ef370734cc1a 263
lssyczy 0:ef370734cc1a 264 refresh(); // this sends the buffer to the display and sets address (cursor) back to 0,0
lssyczy 0:ef370734cc1a 265 }
lssyczy 0:ef370734cc1a 266 }
lssyczy 0:ef370734cc1a 267
lssyczy 0:ef370734cc1a 268 // function to clear the screen
lssyczy 0:ef370734cc1a 269 void N5110::clear()
lssyczy 0:ef370734cc1a 270 {
lssyczy 0:ef370734cc1a 271 clearBuffer(); // clear the buffer then call the refresh function
lssyczy 0:ef370734cc1a 272 refresh();
lssyczy 0:ef370734cc1a 273 }
lssyczy 0:ef370734cc1a 274
lssyczy 0:ef370734cc1a 275 // function to clear the buffer
lssyczy 0:ef370734cc1a 276 void N5110::clearBuffer()
lssyczy 0:ef370734cc1a 277 {
lssyczy 0:ef370734cc1a 278 int i,j;
lssyczy 0:ef370734cc1a 279 for (i=0; i<WIDTH; i++) { // loop through the banks and set the buffer to 0
lssyczy 0:ef370734cc1a 280 for (j=0; j<BANKS; j++) {
lssyczy 0:ef370734cc1a 281 buffer[i][j]=0;
lssyczy 0:ef370734cc1a 282 }
lssyczy 0:ef370734cc1a 283 }
lssyczy 0:ef370734cc1a 284 }
lssyczy 0:ef370734cc1a 285
lssyczy 0:ef370734cc1a 286 // function to plot array on display
lssyczy 0:ef370734cc1a 287 void N5110::plotArray(float array[])
lssyczy 0:ef370734cc1a 288 {
lssyczy 0:ef370734cc1a 289
lssyczy 0:ef370734cc1a 290 int i;
lssyczy 0:ef370734cc1a 291
lssyczy 0:ef370734cc1a 292 for (i=0; i<WIDTH; i++) { // loop through array
lssyczy 0:ef370734cc1a 293 // elements are normalised from 0.0 to 1.0, so multiply
lssyczy 0:ef370734cc1a 294 // by 47 to convert to pixel range, and subtract from 47
lssyczy 0:ef370734cc1a 295 // since top-left is 0,0 in the display geometry
lssyczy 0:ef370734cc1a 296 setPixel(i,47 - int(array[i]*47.0));
lssyczy 0:ef370734cc1a 297 }
lssyczy 0:ef370734cc1a 298
lssyczy 0:ef370734cc1a 299 refresh();
lssyczy 0:ef370734cc1a 300
lssyczy 0:ef370734cc1a 301 }
lssyczy 0:ef370734cc1a 302
lssyczy 0:ef370734cc1a 303 // function to draw circle
lssyczy 0:ef370734cc1a 304 void N5110:: drawCircle(int x0,int y0,int radius,int fill)
lssyczy 0:ef370734cc1a 305 {
lssyczy 0:ef370734cc1a 306 // from http://en.wikipedia.org/wiki/Midpoint_circle_algorithm
lssyczy 0:ef370734cc1a 307 int x = radius;
lssyczy 0:ef370734cc1a 308 int y = 0;
lssyczy 0:ef370734cc1a 309 int radiusError = 1-x;
lssyczy 0:ef370734cc1a 310
lssyczy 0:ef370734cc1a 311 while(x >= y) {
lssyczy 0:ef370734cc1a 312
lssyczy 0:ef370734cc1a 313 // if transparent, just draw outline
lssyczy 0:ef370734cc1a 314 if (fill == 0) {
lssyczy 0:ef370734cc1a 315 setPixel( x + x0, y + y0);
lssyczy 0:ef370734cc1a 316 setPixel(-x + x0, y + y0);
lssyczy 0:ef370734cc1a 317 setPixel( y + x0, x + y0);
lssyczy 0:ef370734cc1a 318 setPixel(-y + x0, x + y0);
lssyczy 0:ef370734cc1a 319 setPixel(-y + x0, -x + y0);
lssyczy 0:ef370734cc1a 320 setPixel( y + x0, -x + y0);
lssyczy 0:ef370734cc1a 321 setPixel( x + x0, -y + y0);
lssyczy 0:ef370734cc1a 322 setPixel(-x + x0, -y + y0);
lssyczy 0:ef370734cc1a 323 } else { // drawing filled circle, so draw lines between points at same y value
lssyczy 0:ef370734cc1a 324
lssyczy 0:ef370734cc1a 325 int type = (fill==1) ? 1:0; // black or white fill
lssyczy 0:ef370734cc1a 326
lssyczy 0:ef370734cc1a 327 drawLine(x+x0,y+y0,-x+x0,y+y0,type);
lssyczy 0:ef370734cc1a 328 drawLine(y+x0,x+y0,-y+x0,x+y0,type);
lssyczy 0:ef370734cc1a 329 drawLine(y+x0,-x+y0,-y+x0,-x+y0,type);
lssyczy 0:ef370734cc1a 330 drawLine(x+x0,-y+y0,-x+x0,-y+y0,type);
lssyczy 0:ef370734cc1a 331 }
lssyczy 0:ef370734cc1a 332
lssyczy 0:ef370734cc1a 333
lssyczy 0:ef370734cc1a 334 y++;
lssyczy 0:ef370734cc1a 335 if (radiusError<0) {
lssyczy 0:ef370734cc1a 336 radiusError += 2 * y + 1;
lssyczy 0:ef370734cc1a 337 } else {
lssyczy 0:ef370734cc1a 338 x--;
lssyczy 0:ef370734cc1a 339 radiusError += 2 * (y - x) + 1;
lssyczy 0:ef370734cc1a 340 }
lssyczy 0:ef370734cc1a 341 }
lssyczy 0:ef370734cc1a 342
lssyczy 0:ef370734cc1a 343 }
lssyczy 0:ef370734cc1a 344
lssyczy 0:ef370734cc1a 345 void N5110::drawLine(int x0,int y0,int x1,int y1,int type)
lssyczy 0:ef370734cc1a 346 {
lssyczy 0:ef370734cc1a 347 int y_range = y1-y0; // calc range of y and x
lssyczy 0:ef370734cc1a 348 int x_range = x1-x0;
lssyczy 0:ef370734cc1a 349 int start,stop,step;
lssyczy 0:ef370734cc1a 350
lssyczy 0:ef370734cc1a 351 // if dotted line, set step to 2, else step is 1
lssyczy 0:ef370734cc1a 352 step = (type==2) ? 2:1;
lssyczy 0:ef370734cc1a 353
lssyczy 0:ef370734cc1a 354 // make sure we loop over the largest range to get the most pixels on the display
lssyczy 0:ef370734cc1a 355 // for instance, if drawing a vertical line (x_range = 0), we need to loop down the y pixels
lssyczy 0:ef370734cc1a 356 // or else we'll only end up with 1 pixel in the x column
lssyczy 0:ef370734cc1a 357 if ( abs(x_range) > abs(y_range) ) {
lssyczy 0:ef370734cc1a 358
lssyczy 0:ef370734cc1a 359 // ensure we loop from smallest to largest or else for-loop won't run as expected
lssyczy 0:ef370734cc1a 360 start = x1>x0 ? x0:x1;
lssyczy 0:ef370734cc1a 361 stop = x1>x0 ? x1:x0;
lssyczy 0:ef370734cc1a 362
lssyczy 0:ef370734cc1a 363 // loop between x pixels
lssyczy 0:ef370734cc1a 364 for (int x = start; x<= stop ; x+=step) {
lssyczy 0:ef370734cc1a 365 // do linear interpolation
lssyczy 0:ef370734cc1a 366 int y = y0 + (y1-y0)*(x-x0)/(x1-x0);
lssyczy 0:ef370734cc1a 367
lssyczy 0:ef370734cc1a 368 if (type == 0) // if 'white' line, turn off pixel
lssyczy 0:ef370734cc1a 369 clearPixel(x,y);
lssyczy 0:ef370734cc1a 370 else
lssyczy 0:ef370734cc1a 371 setPixel(x,y); // else if 'black' or 'dotted' turn on pixel
lssyczy 0:ef370734cc1a 372 }
lssyczy 0:ef370734cc1a 373 } else {
lssyczy 0:ef370734cc1a 374
lssyczy 0:ef370734cc1a 375 // ensure we loop from smallest to largest or else for-loop won't run as expected
lssyczy 0:ef370734cc1a 376 start = y1>y0 ? y0:y1;
lssyczy 0:ef370734cc1a 377 stop = y1>y0 ? y1:y0;
lssyczy 0:ef370734cc1a 378
lssyczy 0:ef370734cc1a 379 for (int y = start; y<= stop ; y+=step) {
lssyczy 0:ef370734cc1a 380 // do linear interpolation
lssyczy 0:ef370734cc1a 381 int x = x0 + (x1-x0)*(y-y0)/(y1-y0);
lssyczy 0:ef370734cc1a 382
lssyczy 0:ef370734cc1a 383 if (type == 0) // if 'white' line, turn off pixel
lssyczy 0:ef370734cc1a 384 clearPixel(x,y);
lssyczy 0:ef370734cc1a 385 else
lssyczy 0:ef370734cc1a 386 setPixel(x,y); // else if 'black' or 'dotted' turn on pixel
lssyczy 0:ef370734cc1a 387
lssyczy 0:ef370734cc1a 388 }
lssyczy 0:ef370734cc1a 389 }
lssyczy 0:ef370734cc1a 390
lssyczy 0:ef370734cc1a 391 }
lssyczy 0:ef370734cc1a 392
lssyczy 0:ef370734cc1a 393 void N5110::drawRect(int x0,int y0,int width,int height,int fill)
lssyczy 0:ef370734cc1a 394 {
lssyczy 0:ef370734cc1a 395
lssyczy 0:ef370734cc1a 396 if (fill == 0) { // transparent, just outline
lssyczy 0:ef370734cc1a 397 drawLine(x0,y0,x0+width,y0,1); // top
lssyczy 0:ef370734cc1a 398 drawLine(x0,y0+height,x0+width,y0+height,1); // bottom
lssyczy 0:ef370734cc1a 399 drawLine(x0,y0,x0,y0+height,1); // left
lssyczy 0:ef370734cc1a 400 drawLine(x0+width,y0,x0+width,y0+height,1); // right
lssyczy 0:ef370734cc1a 401 } else { // filled rectangle
lssyczy 0:ef370734cc1a 402 int type = (fill==1) ? 1:0; // black or white fill
lssyczy 0:ef370734cc1a 403 for (int y = y0; y<= y0+height; y++) { // loop through rows of rectangle
lssyczy 0:ef370734cc1a 404 drawLine(x0,y,x0+width,y,type); // draw line across screen
lssyczy 0:ef370734cc1a 405 }
lssyczy 0:ef370734cc1a 406 }
lssyczy 0:ef370734cc1a 407
lssyczy 0:ef370734cc1a 408 }
lssyczy 0:ef370734cc1a 409
lssyczy 0:ef370734cc1a 410
lssyczy 0:ef370734cc1a 411
lssyczy 0:ef370734cc1a 412
lssyczy 0:ef370734cc1a 413 N5110 lcd(p7,p8,p9,p10,p11,p13,p26);
lssyczy 0:ef370734cc1a 414 BusOut leds(LED4,LED3,LED2,LED1);
lssyczy 0:ef370734cc1a 415 MMA8452 mma8452(p28,p27);
lssyczy 0:ef370734cc1a 416 Beep buzzer(p21);
lssyczy 0:ef370734cc1a 417 DigitalOut led(p24);
lssyczy 0:ef370734cc1a 418 InterruptIn button(p29);
lssyczy 0:ef370734cc1a 419
lssyczy 0:ef370734cc1a 420 int buttonFlag = 0;
lssyczy 0:ef370734cc1a 421
lssyczy 0:ef370734cc1a 422 void buttonPressed()
lssyczy 0:ef370734cc1a 423 {
lssyczy 0:ef370734cc1a 424 buttonFlag = 1;
lssyczy 0:ef370734cc1a 425 }
lssyczy 0:ef370734cc1a 426
lssyczy 0:ef370734cc1a 427 int main()
lssyczy 0:ef370734cc1a 428 {
lssyczy 0:ef370734cc1a 429 lcd.init();
lssyczy 0:ef370734cc1a 430 mma8452.init(); // 100 Hz update rate, ±4g scale
lssyczy 0:ef370734cc1a 431 lcd.normalMode(); // normal colour mode
lssyczy 0:ef370734cc1a 432 lcd.setBrightness(0.5);
lssyczy 0:ef370734cc1a 433 button.rise(&buttonPressed);
lssyczy 0:ef370734cc1a 434
lssyczy 0:ef370734cc1a 435
lssyczy 0:ef370734cc1a 436 Acceleration acceleration;
lssyczy 0:ef370734cc1a 437
lssyczy 0:ef370734cc1a 438 while(1)
lssyczy 0:ef370734cc1a 439 {
lssyczy 0:ef370734cc1a 440 lcd.printString("Direction",0,3);
lssyczy 0:ef370734cc1a 441 acceleration = mma8452.readValues();
lssyczy 0:ef370734cc1a 442
lssyczy 0:ef370734cc1a 443 char Acce_X[14];
lssyczy 0:ef370734cc1a 444 int a=sprintf(Acce_X,"x = %.2f g",acceleration.x);
lssyczy 0:ef370734cc1a 445 lcd.printString(Acce_X,0,0);
lssyczy 0:ef370734cc1a 446
lssyczy 0:ef370734cc1a 447 char Acce_Y[14];
lssyczy 0:ef370734cc1a 448 int b=sprintf(Acce_Y,"y = %.2f g",acceleration.y);
lssyczy 0:ef370734cc1a 449 lcd.printString(Acce_Y,0,1);
lssyczy 0:ef370734cc1a 450
lssyczy 0:ef370734cc1a 451 char Acce_Z[14];
lssyczy 0:ef370734cc1a 452 int c=sprintf(Acce_Z,"z = %.2f g",acceleration.z);
lssyczy 0:ef370734cc1a 453 lcd.printString(Acce_Z,0,2);
lssyczy 0:ef370734cc1a 454
lssyczy 0:ef370734cc1a 455 if (acceleration.x<0){
lssyczy 0:ef370734cc1a 456
lssyczy 0:ef370734cc1a 457 led = 1;
lssyczy 0:ef370734cc1a 458 }
lssyczy 0:ef370734cc1a 459
lssyczy 0:ef370734cc1a 460
lssyczy 0:ef370734cc1a 461 if (acceleration.x>0){
lssyczy 0:ef370734cc1a 462
lssyczy 0:ef370734cc1a 463 led = 0;
lssyczy 0:ef370734cc1a 464 }
lssyczy 0:ef370734cc1a 465
lssyczy 0:ef370734cc1a 466
lssyczy 0:ef370734cc1a 467
lssyczy 0:ef370734cc1a 468 if (buttonFlag){
lssyczy 0:ef370734cc1a 469 buttonFlag = 0;
lssyczy 0:ef370734cc1a 470
lssyczy 0:ef370734cc1a 471 if (acceleration.x<0){
lssyczy 0:ef370734cc1a 472 lcd.printString("Left",0,4);
lssyczy 0:ef370734cc1a 473
lssyczy 0:ef370734cc1a 474 }
lssyczy 0:ef370734cc1a 475
lssyczy 0:ef370734cc1a 476
lssyczy 0:ef370734cc1a 477 if (acceleration.x>0){
lssyczy 0:ef370734cc1a 478 lcd.printString("Right",42,4);
lssyczy 0:ef370734cc1a 479
lssyczy 0:ef370734cc1a 480 }
lssyczy 0:ef370734cc1a 481
lssyczy 0:ef370734cc1a 482 if (acceleration.y>0){
lssyczy 0:ef370734cc1a 483 lcd.printString("Up",0,5);
lssyczy 0:ef370734cc1a 484
lssyczy 0:ef370734cc1a 485 }
lssyczy 0:ef370734cc1a 486
lssyczy 0:ef370734cc1a 487 if (acceleration.y<0){
lssyczy 0:ef370734cc1a 488 lcd.printString("Down",42,5);
lssyczy 0:ef370734cc1a 489
lssyczy 0:ef370734cc1a 490 }
lssyczy 0:ef370734cc1a 491
lssyczy 0:ef370734cc1a 492 wait (1.5);
lssyczy 0:ef370734cc1a 493 lcd.refresh();
lssyczy 0:ef370734cc1a 494 if (acceleration.x<0){
lssyczy 0:ef370734cc1a 495
lssyczy 0:ef370734cc1a 496
lssyczy 0:ef370734cc1a 497
lssyczy 0:ef370734cc1a 498 buzzer.beep(4000,0.5);
lssyczy 0:ef370734cc1a 499
lssyczy 0:ef370734cc1a 500 }
lssyczy 0:ef370734cc1a 501 else {
lssyczy 0:ef370734cc1a 502 buzzer.nobeep();
lssyczy 0:ef370734cc1a 503 }
lssyczy 0:ef370734cc1a 504 wait (1.5);
lssyczy 0:ef370734cc1a 505 lcd.refresh();
lssyczy 0:ef370734cc1a 506
lssyczy 0:ef370734cc1a 507 lcd.clear();
lssyczy 0:ef370734cc1a 508 }
lssyczy 0:ef370734cc1a 509 }
lssyczy 0:ef370734cc1a 510
lssyczy 0:ef370734cc1a 511
lssyczy 0:ef370734cc1a 512
lssyczy 0:ef370734cc1a 513
lssyczy 0:ef370734cc1a 514 }