Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed ADXL345 beep
Revision 0:200970a8c0bf, committed 2011-10-11
- Comitter:
- jhaksar
- Date:
- Tue Oct 11 16:42:41 2011 +0000
- Commit message:
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ADXL345.lib Tue Oct 11 16:42:41 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/aberk/code/ADXL345/#bd8f0f20f433
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/NokiaLCD/NokiaLCD.cpp Tue Oct 11 16:42:41 2011 +0000
@@ -0,0 +1,459 @@
+/* mbed Nokia LCD Library
+ * Copyright (c) 2007-2010, sford
+ */
+
+#include "NokiaLCD.h"
+
+#include "mbed.h"
+
+#define NOKIALCD_ROWS 16
+#define NOKIALCD_COLS 16
+#define NOKIALCD_WIDTH 130
+#define NOKIALCD_HEIGHT 132
+#define NOKIALCD_FREQUENCY 5000000
+
+NokiaLCD::NokiaLCD(PinName mosi, PinName sclk, PinName cs, PinName rst, LCDType type)
+ : _spi(mosi, NC, sclk)
+ , _rst(rst)
+ , _cs(cs) {
+
+ _type = type;
+
+ _row = 0;
+ _column = 0;
+ _foreground = 0x00FFFFFF;
+ _background = 0x00000000;
+
+ reset();
+}
+
+void NokiaLCD::reset() {
+
+ // setup the SPI interface and bring display out of reset
+ _cs = 1;
+ _rst = 0;
+ _spi.format(9);
+ _spi.frequency(NOKIALCD_FREQUENCY);
+ wait_ms(1);
+ _rst = 1;
+ wait_ms(1);
+
+ _cs = 0;
+
+ switch (_type) {
+ case LCD6100:
+ command(0xCA); // display control
+ data(0);
+ data(32);
+ data(0);
+ command(0xBB);
+ data(1);
+ command(0xD1); // oscillator on
+ command(0x94); // sleep out
+ command(0x20); // power control
+ data(0x0F);
+ command(0xA7); // invert display
+ command(0x81); // Voltage control
+ data(39); // contrast setting: 0..63
+ data(3); // resistance ratio
+ wait_ms(1);
+ command(0xBC);
+ data(0);
+ data(1);
+ data(4);
+ command(0xAF); // turn on the display
+ break;
+
+ case LCD6610:
+ command(0xCA); // display control
+ data(0);
+ data(32);
+ data(0);
+ command(0xBB);
+ data(1);
+ command(0xD1); // oscillator on
+ command(0x94); // sleep out
+ command(0x20); // power control
+ data(0x0F);
+ command(0xA7); // invert display
+ command(0x81); // Voltage control
+ data(39); // contrast setting: 0..63
+ data(3); // resistance ratio
+ wait_ms(1);
+ command(0xBC);
+ data(0);
+ data(0);
+ data(2);
+ command(0xAF); // turn on the display
+ break;
+
+ case PCF8833:
+ command(0x11); // sleep out
+ command(0x3A); // column mode
+ data(0x05);
+ command(0x36); // madctl
+ data(0x60); // vertical RAM, flip x
+ command(0x25); // setcon
+ data(0x30);// contrast 0x30
+ wait_ms(2);
+ command(0x29);//DISPON
+ command(0x03);//BSTRON
+ break;
+ }
+
+ _cs = 1;
+
+ cls();
+}
+
+void NokiaLCD::command(int value) {
+ _spi.write(value & 0xFF);
+}
+
+void NokiaLCD::data(int value) {
+ _spi.write(value | 0x100);
+}
+
+void NokiaLCD::_window(int x, int y, int width, int height) {
+ int x1 = x + 0;
+ int y1 = y + 0;
+ int x2 = x1 + width - 1;
+ int y2 = y1 + height - 1;
+
+ switch (_type) {
+ case LCD6100:
+ case LCD6610:
+ command(0x15); // column
+ data(x1);
+ data(x2);
+ command(0x75); // row
+ data(y1);
+ data(y2);
+ command(0x5C); // start write to ram
+ break;
+ case PCF8833:
+ command(0x2A); // column
+ data(x1);
+ data(x2);
+ command(0x2B); // row
+ data(y1);
+ data(y2);
+ command(0x2C); // start write to ram
+ break;
+ }
+}
+
+void NokiaLCD::_putp(int colour) {
+ int gr = ((colour >> 20) & 0x0F)
+ | ((colour >> 8 ) & 0xF0);
+ int nb = ((colour >> 4 ) & 0x0F);
+ data(nb);
+ data(gr);
+}
+
+const unsigned char FONT8x8[97][8] = {
+ 0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00, // columns, rows, num_bytes_per_char
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // space 0x20
+ 0x30,0x78,0x78,0x30,0x30,0x00,0x30,0x00, // !
+ 0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00, // "
+ 0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00, // #
+ 0x18,0x3E,0x60,0x3C,0x06,0x7C,0x18,0x00, // $
+ 0x00,0x63,0x66,0x0C,0x18,0x33,0x63,0x00, // %
+ 0x1C,0x36,0x1C,0x3B,0x6E,0x66,0x3B,0x00, // &
+ 0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00, // '
+ 0x0C,0x18,0x30,0x30,0x30,0x18,0x0C,0x00, // (
+ 0x30,0x18,0x0C,0x0C,0x0C,0x18,0x30,0x00, // )
+ 0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00, // *
+ 0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0x00, // +
+ 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30, // ,
+ 0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00, // -
+ 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00, // .
+ 0x03,0x06,0x0C,0x18,0x30,0x60,0x40,0x00, // / (forward slash)
+ 0x3E,0x63,0x63,0x6B,0x63,0x63,0x3E,0x00, // 0 0x30
+ 0x18,0x38,0x58,0x18,0x18,0x18,0x7E,0x00, // 1
+ 0x3C,0x66,0x06,0x1C,0x30,0x66,0x7E,0x00, // 2
+ 0x3C,0x66,0x06,0x1C,0x06,0x66,0x3C,0x00, // 3
+ 0x0E,0x1E,0x36,0x66,0x7F,0x06,0x0F,0x00, // 4
+ 0x7E,0x60,0x7C,0x06,0x06,0x66,0x3C,0x00, // 5
+ 0x1C,0x30,0x60,0x7C,0x66,0x66,0x3C,0x00, // 6
+ 0x7E,0x66,0x06,0x0C,0x18,0x18,0x18,0x00, // 7
+ 0x3C,0x66,0x66,0x3C,0x66,0x66,0x3C,0x00, // 8
+ 0x3C,0x66,0x66,0x3E,0x06,0x0C,0x38,0x00, // 9
+ 0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x00, // :
+ 0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x30, // ;
+ 0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00, // <
+ 0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00, // =
+ 0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00, // >
+ 0x3C,0x66,0x06,0x0C,0x18,0x00,0x18,0x00, // ?
+ 0x3E,0x63,0x6F,0x69,0x6F,0x60,0x3E,0x00, // @ 0x40
+ 0x18,0x3C,0x66,0x66,0x7E,0x66,0x66,0x00, // A
+ 0x7E,0x33,0x33,0x3E,0x33,0x33,0x7E,0x00, // B
+ 0x1E,0x33,0x60,0x60,0x60,0x33,0x1E,0x00, // C
+ 0x7C,0x36,0x33,0x33,0x33,0x36,0x7C,0x00, // D
+ 0x7F,0x31,0x34,0x3C,0x34,0x31,0x7F,0x00, // E
+ 0x7F,0x31,0x34,0x3C,0x34,0x30,0x78,0x00, // F
+ 0x1E,0x33,0x60,0x60,0x67,0x33,0x1F,0x00, // G
+ 0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x00, // H
+ 0x3C,0x18,0x18,0x18,0x18,0x18,0x3C,0x00, // I
+ 0x0F,0x06,0x06,0x06,0x66,0x66,0x3C,0x00, // J
+ 0x73,0x33,0x36,0x3C,0x36,0x33,0x73,0x00, // K
+ 0x78,0x30,0x30,0x30,0x31,0x33,0x7F,0x00, // L
+ 0x63,0x77,0x7F,0x7F,0x6B,0x63,0x63,0x00, // M
+ 0x63,0x73,0x7B,0x6F,0x67,0x63,0x63,0x00, // N
+ 0x3E,0x63,0x63,0x63,0x63,0x63,0x3E,0x00, // O
+ 0x7E,0x33,0x33,0x3E,0x30,0x30,0x78,0x00, // P 0x50
+ 0x3C,0x66,0x66,0x66,0x6E,0x3C,0x0E,0x00, // Q
+ 0x7E,0x33,0x33,0x3E,0x36,0x33,0x73,0x00, // R
+ 0x3C,0x66,0x30,0x18,0x0C,0x66,0x3C,0x00, // S
+ 0x7E,0x5A,0x18,0x18,0x18,0x18,0x3C,0x00, // T
+ 0x66,0x66,0x66,0x66,0x66,0x66,0x7E,0x00, // U
+ 0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00, // V
+ 0x63,0x63,0x63,0x6B,0x7F,0x77,0x63,0x00, // W
+ 0x63,0x63,0x36,0x1C,0x1C,0x36,0x63,0x00, // X
+ 0x66,0x66,0x66,0x3C,0x18,0x18,0x3C,0x00, // Y
+ 0x7F,0x63,0x46,0x0C,0x19,0x33,0x7F,0x00, // Z
+ 0x3C,0x30,0x30,0x30,0x30,0x30,0x3C,0x00, // [
+ 0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x00, // \ (back slash)
+ 0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00, // ]
+ 0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00, // ^
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, // _
+ 0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00, // ` 0x60
+ 0x00,0x00,0x3C,0x06,0x3E,0x66,0x3B,0x00, // a
+ 0x70,0x30,0x3E,0x33,0x33,0x33,0x6E,0x00, // b
+ 0x00,0x00,0x3C,0x66,0x60,0x66,0x3C,0x00, // c
+ 0x0E,0x06,0x3E,0x66,0x66,0x66,0x3B,0x00, // d
+ 0x00,0x00,0x3C,0x66,0x7E,0x60,0x3C,0x00, // e
+ 0x1C,0x36,0x30,0x78,0x30,0x30,0x78,0x00, // f
+ 0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x7C, // g
+ 0x70,0x30,0x36,0x3B,0x33,0x33,0x73,0x00, // h
+ 0x18,0x00,0x38,0x18,0x18,0x18,0x3C,0x00, // i
+ 0x06,0x00,0x06,0x06,0x06,0x66,0x66,0x3C, // j
+ 0x70,0x30,0x33,0x36,0x3C,0x36,0x73,0x00, // k
+ 0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00, // l
+ 0x00,0x00,0x66,0x7F,0x7F,0x6B,0x63,0x00, // m
+ 0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x00, // n
+ 0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x00, // o
+ 0x00,0x00,0x6E,0x33,0x33,0x3E,0x30,0x78, // p
+ 0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x0F, // q
+ 0x00,0x00,0x6E,0x3B,0x33,0x30,0x78,0x00, // r
+ 0x00,0x00,0x3E,0x60,0x3C,0x06,0x7C,0x00, // s
+ 0x08,0x18,0x3E,0x18,0x18,0x1A,0x0C,0x00, // t
+ 0x00,0x00,0x66,0x66,0x66,0x66,0x3B,0x00, // u
+ 0x00,0x00,0x66,0x66,0x66,0x3C,0x18,0x00, // v
+ 0x00,0x00,0x63,0x6B,0x7F,0x7F,0x36,0x00, // w
+ 0x00,0x00,0x63,0x36,0x1C,0x36,0x63,0x00, // x
+ 0x00,0x00,0x66,0x66,0x66,0x3E,0x06,0x7C, // y
+ 0x00,0x00,0x7E,0x4C,0x18,0x32,0x7E,0x00, // z
+ 0x0E,0x18,0x18,0x70,0x18,0x18,0x0E,0x00, // {
+ 0x0C,0x0C,0x0C,0x00,0x0C,0x0C,0x0C,0x00, // |
+ 0x70,0x18,0x18,0x0E,0x18,0x18,0x70,0x00, // }
+ 0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00, // ~
+ 0x1C,0x36,0x36,0x1C,0x00,0x00,0x00,0x00
+}; // DEL
+
+void NokiaLCD::locate(int column, int row) {
+ _column = column;
+ _row = row;
+}
+
+void NokiaLCD::newline() {
+ _column = 0;
+ _row++;
+ if (_row >= _rows) {
+ _row = 0;
+ }
+}
+
+int NokiaLCD::_putc(int value) {
+ int x = _column * 8; // FIXME: Char sizes
+ int y = _row * 8;
+ bitblit(x + 1, y + 1, 8, 8, (char*)&(FONT8x8[value - 0x1F][0]));
+
+ _column++;
+
+ if (_column >= NOKIALCD_COLS) {
+ _row++;
+ _column = 0;
+ }
+
+ if (_row >= NOKIALCD_ROWS) {
+ _row = 0;
+ }
+
+ return value;
+}
+
+void NokiaLCD::cls() {
+ fill(0, 0, NOKIALCD_WIDTH, NOKIALCD_HEIGHT, _background);
+ _row = 0;
+ _column = 0;
+}
+
+
+void NokiaLCD::window(int x, int y, int width, int height) {
+ _cs = 0;
+ _window(x, y, width, height);
+ _cs = 1;
+}
+
+void NokiaLCD::putp(int colour) {
+ _cs = 0;
+ _putp(colour);
+ _cs = 1;
+}
+
+void NokiaLCD::pixel(int x, int y, int colour) {
+ _cs = 0;
+ _window(x, y, 1, 1);
+ switch (_type) {
+ case LCD6100:
+ case PCF8833:
+
+ _putp(colour);
+
+ break;
+ case LCD6610:
+
+ int r4 = (colour >> (16 + 4)) & 0xF;
+ int g4 = (colour >> (8 + 4)) & 0xF;
+ int b4 = (colour >> (0 + 4)) & 0xF;
+ int d1 = (r4 << 4) | g4;
+ int d2 = (b4 << 4) | r4;
+ int d3 = (g4 << 4) | b4;
+ data(d1);
+ data(d2);
+ data(d3);
+
+ break;
+ }
+ _cs = 1;
+}
+
+
+void NokiaLCD::fill(int x, int y, int width, int height, int colour) {
+ _cs = 0;
+ _window(x, y, width, height);
+ switch (_type) {
+ case LCD6100:
+ case PCF8833:
+ for (int i=0; i<width*height; i++) {
+ _putp(colour);
+ }
+ break;
+ case LCD6610:
+ for (int i=0; i<width*height/2; i++) {
+ int r4 = (colour >> (16 + 4)) & 0xF;
+ int g4 = (colour >> (8 + 4)) & 0xF;
+ int b4 = (colour >> (0 + 4)) & 0xF;
+ int d1 = (r4 << 4) | g4;
+ int d2 = (b4 << 4) | r4;
+ int d3 = (g4 << 4) | b4;
+ data(d1);
+ data(d2);
+ data(d3);
+ }
+ break;
+ }
+ _window(0, 0, NOKIALCD_WIDTH, NOKIALCD_HEIGHT);
+ _cs = 1;
+}
+
+void NokiaLCD::blit(int x, int y, int width, int height, const int* colour) {
+ _cs = 0;
+ _window(x, y, width, height);
+
+ switch (_type) {
+ case LCD6100:
+ case PCF8833:
+ for (int i=0; i<width*height; i++) {
+ _putp(colour[i]);
+ }
+ break;
+ case LCD6610:
+ for (int i=0; i<width*height/2; i++) {
+ int r41 = (colour[i*2] >> (16 + 4)) & 0xF;
+ int g41 = (colour[i*2] >> (8 + 4)) & 0xF;
+ int b41 = (colour[i*2] >> (0 + 4)) & 0xF;
+
+ int r42 = (colour[i*2+1] >> (16 + 4)) & 0xF;
+ int g42 = (colour[i*2+1] >> (8 + 4)) & 0xF;
+ int b42 = (colour[i*2+1] >> (0 + 4)) & 0xF;
+ int d1 = (r41 << 4) | g41;
+ int d2 = (b41 << 4) | r42;
+ int d3 = (g42 << 4) | b42;
+ data(d1);
+ data(d2);
+ data(d3);
+ }
+ break;
+ }
+ _window(0, 0, NOKIALCD_WIDTH, NOKIALCD_HEIGHT);
+ _cs = 1;
+}
+
+void NokiaLCD::bitblit(int x, int y, int width, int height, const char* bitstream) {
+ _cs = 0;
+ _window(x, y, width, height);
+
+ switch (_type) {
+ case LCD6100:
+ case PCF8833:
+ for (int i=0; i<height*width; i++) {
+ int byte = i / 8;
+ int bit = i % 8;
+ int colour = ((bitstream[byte] << bit) & 0x80) ? _foreground : _background;
+ _putp(colour);
+ }
+ break;
+ case LCD6610:
+ for(int i=0; i<height*width/2; i++) {
+ int byte1 = (i*2) / 8;
+ int bit1 = (i*2) % 8;
+ int colour1 = ((bitstream[byte1] << bit1) & 0x80) ? _foreground : _background;
+ int byte2 = (i*2+1) / 8;
+ int bit2 = (i*2+1) % 8;
+ int colour2 = ((bitstream[byte2] << bit2) & 0x80) ? _foreground : _background;
+
+ int r41 = (colour1 >> (16 + 4)) & 0xF;
+ int g41 = (colour1 >> (8 + 4)) & 0xF;
+ int b41 = (colour1 >> (0 + 4)) & 0xF;
+
+ int r42 = (colour2 >> (16 + 4)) & 0xF;
+ int g42 = (colour2 >> (8 + 4)) & 0xF;
+ int b42 = (colour2 >> (0 + 4)) & 0xF;
+ int d1 = (r41 << 4) | g41;
+ int d2 = (b41 << 4) | r42;
+ int d3 = (g42 << 4) | b42;
+ data(d1);
+ data(d2);
+ data(d3);
+ }
+ break;
+ }
+ _window(0, 0, _width, _height);
+ _cs = 1;
+}
+
+void NokiaLCD::foreground(int c) {
+ _foreground = c;
+}
+
+void NokiaLCD::background(int c) {
+ _background = c;
+}
+
+int NokiaLCD::width() {
+ return NOKIALCD_WIDTH;
+}
+
+int NokiaLCD::height() {
+ return NOKIALCD_HEIGHT;
+}
+
+int NokiaLCD::columns() {
+ return NOKIALCD_COLS;
+}
+
+int NokiaLCD::rows() {
+ return NOKIALCD_ROWS;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/NokiaLCD/NokiaLCD.h Tue Oct 11 16:42:41 2011 +0000
@@ -0,0 +1,151 @@
+/* mbed NokiaLCD Library, for a 130x130 Nokia colour LCD
+ * Copyright (c) 2007-2010, sford
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef MBED_NOKIALCD_H
+#define MBED_NOKIALCD_H
+
+#include "mbed.h"
+
+/** An interface for the 130x130 Nokia Mobile phone screens
+ *
+ * @code
+ * #include "mbed.h"
+ * #include "NokiaLCD.h"
+ *
+ * NokiaLCD lcd(p5, p7, p8, p9, NokiaLCD::6610); // mosi, sclk, cs, rst, type
+ *
+ * int main() {
+ * lcd.printf("Hello World!");
+ * }
+ * @endcode
+ */
+class NokiaLCD : public Stream {
+
+public:
+ /** LCD panel format */
+ enum LCDType {
+ LCD6100 /**< Nokia 6100, as found on sparkfun board (default) */
+ , LCD6610 /**< Nokia 6610, as found on olimex board */
+ , PCF8833
+ };
+
+ /** Create and Nokia LCD interface, using a SPI and two DigitalOut interfaces
+ *
+ * @param mosi SPI data out
+ * @param sclk SPI clock
+ * @param cs Chip Select (DigitalOut)
+ * @param rst Reset (DigitalOut)
+ * @param type The LCDType to select driver chip variants
+ */
+ NokiaLCD(PinName mosi, PinName sclk, PinName cs, PinName rst, LCDType type = LCD6100);
+
+#if DOXYGEN_ONLY
+ /** Write a character to the LCD
+ *
+ * @param c The character to write to the display
+ */
+ int putc(int c);
+
+ /** Write a formated string to the LCD
+ *
+ * @param format A printf-style format string, followed by the
+ * variables to use in formating the string.
+ */
+ int printf(const char* format, ...);
+#endif
+
+ /** Locate to a screen column and row
+ *
+ * @param column The horizontal position from the left, indexed from 0
+ * @param row The vertical position from the top, indexed from 0
+ */
+ void locate(int column, int row);
+
+ /** Clear the screen and locate to 0,0 */
+ void cls();
+
+ /** Set a pixel on te screen
+ *
+ * @param x horizontal position from left
+ * @param y vertical position from top
+ * @param colour 24-bit colour in format 0x00RRGGBB
+ */
+ void pixel(int x, int y, int colour);
+
+ /** Fill an area of the screen
+ *
+ * @param x horizontal position from left
+ * @param y vertical position from top
+ * @param width width in pixels
+ * @param height height in pixels
+ * @param colour 24-bit colour in format 0x00RRGGBB
+ */
+ void fill(int x, int y, int width, int height, int colour);
+
+ void blit(int x, int y, int width, int height, const int* colour);
+ void bitblit(int x, int y, int width, int height, const char* bitstream);
+
+ int width();
+ int height();
+ int columns();
+ int rows();
+
+ void reset();
+
+ /** Set the foreground colour
+ *
+ * @param c 24-bit colour
+ */
+ void foreground(int c);
+
+ /** Set the background colour
+ *
+ * @param c 24-bit colour
+ */
+ void background(int c);
+
+protected:
+ virtual void _window(int x, int y, int width, int height);
+ virtual void _putp(int colour);
+
+ void command(int value);
+ void data(int value);
+
+ void newline();
+ virtual int _putc(int c);
+ virtual int _getc() {
+ return 0;
+ }
+ void putp(int v);
+ void window(int x, int y, int width, int height);
+
+ SPI _spi;
+ DigitalOut _rst;
+ DigitalOut _cs;
+
+ LCDType _type;
+ int _row, _column, _rows, _columns, _foreground, _background, _width, _height;
+};
+
+#endif
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/beep.lib Tue Oct 11 16:42:41 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/dreschpe/code/beep/#5a8242af60ba
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Tue Oct 11 16:42:41 2011 +0000
@@ -0,0 +1,283 @@
+//Cave Runner Game
+//Jay Haksar
+//Anchit Nair
+
+#include "mbed.h"
+#include "NokiaLCD.h"
+#include "ADXL345.h"
+#include "beep.h"
+
+Serial pc(USBTX, USBRX);
+NokiaLCD lcd(p5, p7, p8, p9, NokiaLCD::LCD6610); //dio sck cs rst
+ADXL345 accelerometer(p11, p12, p13, p14); //sda sdo scl cs
+Beep speaker(p21);
+DigitalIn sw(p18);
+AnalogIn xin(p19);
+AnalogIn yin(p20);
+Ticker scorecounter;
+
+int score = 0;
+float difficulty = 0.05;
+
+void scoreincrease(){
+ score+=10;
+ difficulty-=0.0005;
+}
+
+
+void setScreen(int wall[], int width, int numwalls){
+ //Sets the initial screen
+ int current=0;
+
+ lcd.fill(0,0, 130, 132, 0x00FF00);
+ for(int j=0;j<131;j+=numwalls){
+ lcd.fill(wall[current], j, width, numwalls, 0x000000);
+ current++;
+ }
+}
+
+
+int main() {
+
+ long average[3] = {0, 0, 0};
+ int measurement[3] = {0, 0, 0};
+ int scaled[2] = {0,0};
+ int gamestate = 0;
+ int scoreboard[5] = {200, 150, 100, 50, 0};
+
+
+ int ballx = 65, bally = 70, ballw = 4, ballh = 4;
+ int width = 40;
+ int wall[66] = {0};
+ int change;
+ int offset = 0;
+ int numwalls = 2;
+ int check = 0;
+ int prevWall;
+
+ sw.mode(PullUp);
+
+ accelerometer.setPowerControl(0x00);
+ accelerometer.setDataFormatControl(0x0B);
+ accelerometer.setDataRate(ADXL345_3200HZ);
+ accelerometer.setPowerControl(0x08);
+
+ for(int i=0;i<=65;i++){
+ wall[i] = 46;
+ }
+ setScreen(wall, width, numwalls);
+
+ while(1){
+
+ while(gamestate == 0){
+
+ lcd.fill(ballx, bally, ballw, ballh, 0x000000);
+
+ for(int i=65;i>=1;i--){
+ if(i>=15){
+ change = wall[i] - wall[i-1];
+ if(change<0){
+ lcd.fill(wall[i],i*2,-change,numwalls,0x00FF00);
+ lcd.fill(wall[i]+width,i*2,-change,numwalls,0x000000);
+ }
+ else if(change>0){
+ lcd.fill(wall[i-1],i*2,change,numwalls,0x000000);
+ lcd.fill(wall[i-1]+width,i*2,change,numwalls,0x00FF00);
+ }
+ }
+ wall[i] = wall[i-1];
+ }
+
+
+ prevWall = wall[0];
+
+ if(wall[0] < 10){offset = -1;}
+ else if(wall[0]+width > 120){offset = 1;}
+
+ wall[0] = wall[0] + ((rand() % 5) - 2 - offset);
+
+ if(wall[0] <= 0){wall[0] = 1;}
+ if(wall[0]+width >= 130){wall[0] = 130-width;}
+
+ check = bally/numwalls;
+ ballx = (wall[check] + (width/2)) - (ballw/2);
+
+
+ lcd.fill(ballx, bally, ballw, ballh, 0xFF0000);
+
+ wait(0.02);
+
+ lcd.fill(0,0,130,30,0x000000);
+
+ lcd.locate(5,1);
+ lcd.printf(" CAVE");
+ lcd.locate(5,2);
+ lcd.printf("RUNNER");
+
+
+ if(sw == 0){
+ lcd.cls();
+
+ srand(time(NULL));
+
+ for(int i=0;i<=65;i++){
+ wall[i] = 46;
+ }
+ setScreen(wall, width, numwalls);
+
+ speaker.beep(100, 0.1);
+ wait(0.1);
+ speaker.beep(200, 0.1);
+ wait(0.1);
+ speaker.beep(300, 0.1);
+ wait(0.1);
+ speaker.beep(400, 0.2);
+ wait(0.1);
+
+ ballx = 65;
+ bally = 65;
+ scorecounter.attach(&scoreincrease, 1.0);
+
+ gamestate = 1;
+ }
+ }
+
+ while(gamestate == 1){
+
+
+ lcd.fill(ballx, bally, ballw, ballh, 0x000000);
+ /*
+ if(xin > 0.6 && ((ballx+ballw) < 127)){ballx+=2;}
+ if(xin < 0.4 && ((ballx) > 3)){ballx-=2;}
+ if(yin < 0.4 && ((bally) > 5)){bally-=2;}
+ if(yin > 0.6 && ((bally+ballh) < 127)){bally+=2;}
+
+ if(xin > 0.8 && ((ballx+ballw) < 126)){ballx+=3;}
+ else if(xin > 0.6 && ((ballx+ballw) < 128)){ballx++;}
+ else if(xin < 0.2 && ((ballx) > 4)){ballx-=3;}
+ else if(xin < 0.4 && ((ballx) > 2)){ballx--;}
+
+ if(yin > 0.8 && ((bally+ballh) < 128)){bally+=3;}
+ else if(yin > 0.6 && ((bally+ballh) < 130)){bally++;}
+ else if(yin < 0.2 && ((bally) > 6)){bally-=3;}
+ else if(yin < 0.4 && ((bally) > 4)){bally--;}
+ */
+
+ accelerometer.getOutput(measurement);
+
+ average[0] = ((49*(long)measurement[0]) + average[0]) / 50;
+ average[1] = ((49*(long)measurement[1]) + average[1]) / 50;
+ average[2] = ((49*(long)measurement[2]) + average[2]) / 50;
+
+ if((int16_t)average[0] > 50 && (int16_t)average[0] < 200){scaled[0] = 1;}
+ else if((int16_t)average[0] < -10 && (int16_t)average[0] > -200){scaled[0] = -1;}
+ else{scaled[0] = 0;}
+
+ if((int16_t)average[1] > 10 && (int16_t)average[0] < 200){scaled[1] = 1;}
+ else if((int16_t)average[1] < -50 && (int16_t)average[0] > -200){scaled[1] = -1;}
+ else{scaled[1] = 0;}
+
+ if(scaled[0] > 0 && ((ballx+ballw) < 127)){ballx+=2;}
+ if(scaled[0] < 0 && ((ballx) > 3)){ballx-=2;}
+ if(scaled[1] > 0 && ((bally) > 5)){bally-=2;}
+ if(scaled[1] < 0 && ((bally+ballh) < 127)){bally+=2;}
+
+
+
+ for(int i=65;i>=1;i--){
+ change = wall[i] - wall[i-1];
+ if(change<0){
+ lcd.fill(wall[i],i*2,-change,numwalls,0x00FF00);
+ lcd.fill(wall[i]+width,i*2,-change,numwalls,0x000000);
+ }
+ else if(change>0){
+ lcd.fill(wall[i-1],i*2,change,numwalls,0x000000);
+ lcd.fill(wall[i-1]+width,i*2,change,numwalls,0x00FF00);
+ }
+ wall[i] = wall[i-1];
+ }
+
+
+ prevWall = wall[0];
+
+ if(wall[0] < 10){offset = -1;}
+ else if(wall[0]+width > 120){offset = 1;}
+
+ wall[0] = wall[0] + ((rand() % 5) - 2 - offset);
+
+ if(wall[0] <= 0){wall[0] = 1;}
+ if(wall[0]+width >= 130){wall[0] = 130-width;}
+
+
+
+ change = prevWall - wall[0];
+ if(change<0){
+ lcd.fill(prevWall,0,-change,numwalls,0x00FF00);
+ lcd.fill(prevWall+width,0,-change,numwalls,0x000000);
+ }
+ else if(change>0){
+ lcd.fill(wall[0],0,change,numwalls,0x000000);
+ lcd.fill(wall[0]+width,0,change,numwalls,0x00FF00);
+ }
+
+ lcd.fill(ballx, bally, ballw, ballh, 0xFF0000);
+
+ wait(difficulty);
+
+
+ check = bally/numwalls;
+ if(wall[check] >= ballx || (wall[check]+width) <= (ballx+ballh)){
+ gamestate = 2;
+ scorecounter.detach();
+ speaker.beep(400, 0.1);
+ wait(0.1);
+ speaker.beep(300, 0.1);
+ wait(0.1);
+ speaker.beep(200, 0.1);
+ wait(0.1);
+ speaker.beep(100, 0.2);
+ wait(0.1);
+ }
+
+ }
+ while(gamestate == 2){
+
+ for(int i=4;i>=0;i--){
+ if(score > scoreboard[i] && score < scoreboard[i-1]){
+ scoreboard[i] = score;
+ }
+ }
+ if(score > scoreboard[0]){scoreboard[0] = score;}
+
+ lcd.locate(4,3);
+ lcd.printf("%i", score);
+ lcd.locate(4,4);
+ lcd.printf("GAME OVER");
+ for(int i=0;i<=4;i++){
+ lcd.locate(4,i+5);
+ lcd.printf("%i", scoreboard[i]);
+ }
+
+ if(sw == 0){
+ ballx = 65;
+ bally = 65;
+ srand(time(NULL));
+ for(int i=0;i<=65;i++){
+ wall[i] = 46;
+ }
+ setScreen(wall, width, numwalls);
+ gamestate = 0;
+ difficulty = 0.05;
+ score = 0;
+ offset = 0;
+ wait(0.5);
+ }
+ }
+
+ }
+}
+
+
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Tue Oct 11 16:42:41 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/63bcd7ba4912