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.
Revision 0:dc689f01feb2, committed 2013-03-09
- Comitter:
- vin_jm
- Date:
- Sat Mar 09 00:51:21 2013 +0000
- Commit message:
- Rev.1
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/IR_Def.h Sat Mar 09 00:51:21 2013 +0000 @@ -0,0 +1,22 @@ +/*Vinod Modhe*/ +/* 4180 Lab3 */ + +#ifndef IR_DEF_H +#define IR_DEF_H + +//IR Timing +//UL => Upper Tolerance Limit; LL => Lower Tolerance Limit +#define IR_9000us_UL (9500) +#define IR_9000us_LL (8500) +#define IR_4500us_UL (5000) +#define IR_4500us_LL (4000) +#define IR_2250us_UL (2500) +#define IR_2250us_LL (2000) +#define IR_1_UL_us (2500) +#define IR_1_LL_us (2000) +#define IR_0_UL_us (1500) +#define IR_0_LL_us (1000) +#define IR_rep_timeout_ms (135) //In NEC protocol, a 110ms interval exists between any two commands and/or repeat pulses. + //If any repeat pulse is received later than 135msec after the last command or repeat pulse, it is to be ignored, as it will be erroneous. + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/NokiaLCD.cpp Sat Mar 09 00:51:21 2013 +0000
@@ -0,0 +1,455 @@
+/* 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(31);
+ 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 LCD6610:
+ case LCD6100:
+ 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:
+ 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;
+ case PCF8833:
+ _putp(colour);
+ break;
+ case LCD6610:
+ }
+ _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 LCD6610:
+ case PCF8833:
+ for (int i=0; i<width*height; i++) {
+ _putp(colour);
+ }
+ break;
+ case LCD6100:
+ 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 LCD6610:
+ case PCF8833:
+ for (int i=0; i<width*height; i++) {
+ _putp(colour[i]);
+ }
+ break;
+ case LCD6100:
+ 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 LCD6610:
+ 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 LCD6100:
+ 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.h Sat Mar 09 00:51:21 2013 +0000
@@ -0,0 +1,149 @@
+/* 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/main.cpp Sat Mar 09 00:51:21 2013 +0000
@@ -0,0 +1,398 @@
+/*Vinod Modhe*/
+/* 4180 Lab3 */
+
+#include "mbed.h"
+#include "IR_Def.h"
+#include "NokiaLCD.h"
+
+Ticker system_clock; //This will be used to increment a counter every msec inside it's ISR
+Timer T; //Timer used for measuring time interval between successive edges of IR input signal
+InterruptIn IR(p30); //Pin to which IR receiver is connected
+void IR_ISR(); //ISR for decoding the IR signal
+void dummy_ISR(); //Required so that 'IR_ISR' is not called on both rising and falling edges of IR signal at the same time
+void sys_tick(); //ISR for 1 msec. system clock
+void RGB_LED(int red, int green, int blue); //For writing to ShiftBrite
+LocalFileSystem local("local"); // Create the local filesystem under the name "local"
+
+//On board LEDs
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+DigitalOut led3(LED3);
+DigitalOut led4(LED4);
+
+//Pin for entering config mode
+DigitalIn config_pin(p21);
+
+//Power Switch Tail
+DigitalOut switch_tail(p20);
+
+//ShiftBrite
+DigitalOut latch(p15);
+DigitalOut enable(p16);
+SPI spi(p11, p12, p13);
+
+//Nokia LCD
+NokiaLCD lcd(p5, p7, p8, p9, NokiaLCD::LCD6100); // mosi, sclk, cs, rst, type
+
+//Global IR variables
+uint8_t state = 0; //State variable for IR state machine
+uint8_t Rx_count = 0; //Counter to count no. of bits received
+uint32_t Rx_buf = 0; //To store recevied IR data
+char Rx_flag = 0; //Flag which indicates that a valid IR command was received
+uint32_t Rx_rep_count = 0; //To keep track of how many repeat pulses are received
+uint32_t Rx_rep_timeout_count = 0; //Timer which clears the previously received IR command, once it reaches the set limit
+uint32_t T_buf = 0; //Buffer to hold value of timer T
+char Rx_ignore_rep_flag = 0; //0 => Do not ignore repeat pulses
+
+typedef struct IR_Key_Codes {
+ uint32_t red_p,red_m; //Key codes for Red+ and Red-
+ uint32_t green_p,green_m; //Key codes for Green+ and Green-
+ uint32_t blue_p,blue_m; //Key codes for Blue+ and Blue-
+ uint32_t switch_tail; //Key code for power switch tail
+} IR_t;
+
+int main()
+{
+ switch_tail = 0; //Turn OFF the power switch tail
+
+ led1 = led2 = led3 = led4 = 1; //Turn ON all LEDs to indicate initialization
+
+ //Nokia LCD Init
+ lcd.background(0x000000); //Set background to white
+ lcd.cls(); //Clear Screen
+ lcd.locate(0,1); //Go to line 1
+ lcd.printf(" R G B FAN"); //Display this text
+ lcd.locate(0,2); //Go to line 2
+ lcd.printf(" 0 0 0 OFF"); //Display this text
+ lcd.locate(0,15); //Go to line 15
+ lcd.printf("100 100 100"); //Display this text
+
+ config_pin.mode(PullUp); //Enable internal pullup
+
+ wait(0.5);
+
+ if(config_pin == 0) { //If config pin is pulled low, enter config mode, in which key codes are to be saved in the "IRCodes.txt" file
+ led1 = led4 = 0;
+ led2 = led3 = 1;
+ wait(0.5);
+ Rx_ignore_rep_flag = 1; //Ignore repeat pulses while in config mode
+
+ IR_t temp; //Temporary variable to hold the received key codes
+
+ //IR Init
+ IR.mode(PullNone); //Disable internal pullup
+ system_clock.attach_us(&sys_tick, 1000); //This will call the function 'sys_tick' every 1 msec.
+ IR.fall(&IR_ISR); //Set IR interrupt to occur on falling edge
+ IR.rise(&dummy_ISR);
+
+ //Store the received IR codes into temp, while ignoring repeat pulses
+ led1 = led2 = led3 = 0;
+ led4 = 1;
+ while(Rx_flag == 0); //Wait for a valid command
+ temp.red_p = Rx_buf; //Copy it into the temp variable
+ Rx_flag = 0; //Reset the flag
+
+ led1 = led2 = led4 = 0;
+ led3 = 1;
+ while(Rx_flag == 0);
+ temp.red_m = Rx_buf;
+ Rx_flag = 0;
+
+ led1 = led2 = 0;
+ led3 = led4 = 1;
+ while(Rx_flag == 0);
+ temp.green_p = Rx_buf;
+ Rx_flag = 0;
+
+ led1 = led3 = led4 = 0;
+ led2 = 1;
+ while(Rx_flag == 0);
+ temp.green_m = Rx_buf;
+ Rx_flag = 0;
+
+ led1 = led3 = 0;
+ led2 = led4 = 1;
+ while(Rx_flag == 0);
+ temp.blue_p = Rx_buf;
+ Rx_flag = 0;
+
+ led1 = led4 = 0;
+ led2 = led3 = 1;
+ while(Rx_flag == 0);
+ temp.blue_m = Rx_buf;
+ Rx_flag = 0;
+
+ led1 = 0;
+ led2 = led3 = led4 = 1;
+ while(Rx_flag == 0);
+ temp.switch_tail = Rx_buf;
+ Rx_flag = 0;
+
+ FILE *fp = fopen("/local/IRCodes.txt", "w"); // Open "IRCodes.txt" on the local file system for writing
+
+ if(fp != NULL) { //File was opened successfully
+ //Write the key codes into the file one by one in the correct order
+ fprintf(fp, "%x ", temp.red_p);
+ fprintf(fp, "%x ", temp.red_m);
+ fprintf(fp, "%x ", temp.green_p);
+ fprintf(fp, "%x ", temp.green_m);
+ fprintf(fp, "%x ", temp.blue_p);
+ fprintf(fp, "%x ", temp.blue_m);
+ fprintf(fp, "%x ", temp.switch_tail);
+
+ fclose(fp);
+
+ led1 = led2 = led3 = led4 = 1;
+ } else { //File could not be opened
+ led1 = 1;
+ led2 = 0;
+ led3 = 1;
+ led4 = 0;
+
+ while(1) { //Stop executing further code and display error lights
+ led1 = !led1;
+ led2 = !led2;
+ led3 = !led3;
+ led4 = !led4;
+
+ wait(0.5);
+ }
+ }
+ Rx_ignore_rep_flag = 0; //Disable this flag to not ignore repeat pulses while in normal mode
+ }
+
+ IR_t key_code; //Struct variable holding all key codes
+
+ //File System Init
+ FILE *fp = fopen("/local/IRCodes.txt", "r"); // Open "IRCodes.txt" on the local file system for reading
+
+ if(fp != NULL) { //File was opened successfully
+ fscanf(fp, "%8x", &(key_code.red_p)); //Read the key codes from the file into the respective struct members
+ fscanf(fp, "%8x", &(key_code.red_m));
+ fscanf(fp, "%8x", &(key_code.green_p));
+ fscanf(fp, "%8x", &(key_code.green_m));
+ fscanf(fp, "%8x", &(key_code.blue_p));
+ fscanf(fp, "%8x", &(key_code.blue_m));
+ fscanf(fp, "%8x", &(key_code.switch_tail));
+ fclose(fp);
+ } else { //File could not be opened
+ led1 = 1;
+ led2 = 0;
+ led3 = 1;
+ led4 = 0;
+
+ while(1) { //Stop executing further code and display error lights
+ led1 = !led1;
+ led2 = !led2;
+ led3 = !led3;
+ led4 = !led4;
+
+ wait(0.5);
+ }
+ }
+
+ //Shiftbrite Init
+ int red=0;
+ int green=0;
+ int blue=0;
+ spi.format(16,0);
+ spi.frequency(500000);
+ enable=0;
+ latch=0;
+ wait(2);
+
+ RGB_LED( red, green, blue);
+ wait(.1);
+
+ //IR Init
+ IR.mode(PullNone); //Disable internal pullup
+ system_clock.attach_us(&sys_tick, 1000); //This will call the function 'sys_tick' every 1 msec.
+ IR.fall(&IR_ISR); //Set IR interrupt to occur on falling edge
+ IR.rise(&dummy_ISR);
+
+ led1 = led2 = led3 = led4 = 0; //Turn OFF all LEDs to indicate initialization is done
+
+ while(1) {
+ if(Rx_flag == 1) {
+ Rx_flag = 0;
+
+ if(Rx_buf == key_code.red_p) {
+ if((red += 10) > 100) {
+ red = 100;
+ }
+
+ //Display the scaled rectangle
+ lcd.fill(5, 28, 20, 90, 0x000000); //Erase original rectangle
+ lcd.fill(5, 28, 20, (red/10 * 9), 0x0000FF); //Draw red rectangle
+ } else if(Rx_buf == key_code.red_m) {
+ if((red -= 10) < 0) {
+ red = 0;
+ }
+
+ //Display the scaled rectangle
+ lcd.fill(5, 28, 20, 90, 0x000000); //Erase original rectangle
+ lcd.fill(5, 28, 20, (red/10 *9), 0x0000FF); //Draw red rectangle
+ } else if(Rx_buf == key_code.green_p) {
+ if((green += 10) > 100) {
+ green = 100;
+ }
+
+ //Display the scaled rectangle
+ lcd.fill(36, 28, 20, 90, 0x000000); //Erase original rectangle
+ lcd.fill(36, 28, 20, (green/10 * 9), 0x00FF00); //Draw green rectangle
+ } else if(Rx_buf == key_code.green_m) {
+ if((green -= 10) < 0) {
+ green = 0;
+ }
+
+ //Display the scaled rectangle
+ lcd.fill(36, 28, 20, 90, 0x000000); //Erase original rectangle
+ lcd.fill(36, 28, 20, (green/10 * 9), 0x00FF00); //Draw green rectangle
+ } else if(Rx_buf == key_code.blue_p) {
+ if((blue += 10) > 100) {
+ blue = 100;
+ }
+
+ //Display the scaled rectangle
+ lcd.fill(67, 28, 20, 90, 0x000000); //Erase original rectangle
+ lcd.fill(67, 28, 20, (blue/10 * 9), 0xFF0000); //Draw blue rectangle
+ } else if(Rx_buf == key_code.blue_m) {
+ if((blue -= 10) < 0) {
+ blue = 0;
+ }
+
+ //Display the scaled rectangle
+ lcd.fill(67, 28, 20, 90, 0x000000); //Erase original rectangle
+ lcd.fill(67, 28, 20, (blue/10* 9), 0xFF0000); //Draw blue rectangle
+ } else if((Rx_buf == key_code.switch_tail) && (Rx_rep_count == 0)) { //Do not consider repeat pulses for switch tail to avoid rapid switching
+ switch_tail = !switch_tail;
+
+ if(switch_tail == 0) { //Fan OFF
+ lcd.locate(0,2); //Go to line 2
+ lcd.printf(" 0 0 0 OFF"); //Display this text
+ } else if(switch_tail == 1) { //Fan ON
+ lcd.locate(0,2); //Go to line 2
+ lcd.printf(" 0 0 0 ON "); //Display this text
+ }
+
+ }
+
+ RGB_LED( red, green, blue); //Write to ShiftBrite after receiving a valid command
+ wait(.1);
+ }
+
+ wait_us(100); //Wait for 0.1ms
+ }
+}
+
+void RGB_LED(int red, int green, int blue)
+{
+ unsigned int low_color=0;
+ unsigned int high_color=0;
+ high_color=(blue<<4)|((red&0x3C0)>>6);
+ low_color=(((red&0x3F)<<10)|(green));
+ spi.write(high_color);
+ spi.write(low_color);
+ latch=1;
+ latch=0;
+}
+
+void sys_tick()
+{
+ if(Rx_rep_timeout_count < 0xFFFF) { //Do not increment counter beyond 0xFFFF to prevent roll-over
+ ++Rx_rep_timeout_count; //Increment this counter every 1msec.
+ }
+}
+
+void IR_ISR()
+{
+ if(state == 0) {
+ T.stop(); //Stop timer
+ T.reset(); //Reset timer
+ T.start(); //Start timer
+ IR.rise(&IR_ISR); //Set IR interrupt to occur on rising edge
+ IR.fall(&dummy_ISR);
+ state = 1; //Go to next state
+ Rx_count = 0; //Clear the received bits counter
+ } else if(state == 1) {
+ T.stop(); //Stop timer
+ T_buf = (uint32_t)T.read_us(); //Read timer
+ T.reset(); //Reset timer
+ T.start(); //Start timer
+ IR.fall(&IR_ISR); //Set IR interrupt to occur on falling edge
+ IR.rise(&dummy_ISR);
+
+ if(T_buf <= IR_9000us_UL && T_buf >= IR_9000us_LL) { //Check for preamble start pulse(9ms)
+ state = 2; //Go to next state
+ } else {
+ state = 0; //Reset the state machine
+ }
+ } else if(state == 2) {
+ T.stop(); //Stop timer
+ T_buf = (uint32_t)T.read_us(); //Read the value in timer
+ T.reset(); //Reset timer
+ T.start(); //Start timer
+ IR.fall(&IR_ISR); //Set IR interrupt to occur on falling edge
+ IR.rise(&dummy_ISR);
+
+ if(T_buf <= IR_4500us_UL && T_buf >= IR_4500us_LL) { //Check for preamble space(4.5ms)
+ state = 3; //Go to next state
+ Rx_rep_timeout_count = 0; //Reset counter
+ Rx_rep_count = 0; //Reset the repeat pulse counter
+ } else if(T_buf <= IR_2250us_UL && T_buf >= IR_2250us_LL) { //Check for repeat pulse(2.25ms)
+ state = 0; //Reset the state machine
+
+ if(Rx_rep_count < 0xFFFF) {
+ if(Rx_rep_timeout_count < IR_rep_timeout_ms) { //Only increment the repeat pulse counter if the delay between two successive repeat pulses is less than 135msec.
+ Rx_rep_timeout_count = 0; //Reset the counter everytime a valid repeat pulse is received
+ ++Rx_rep_count;
+ } else { //Invald repeat pulse received
+ Rx_rep_count = 0; //Reset counter
+ Rx_flag = 0; //Clear the flag to indicate that an IR command was not received
+ Rx_buf = 0; //Clear the previously received command
+ }
+ }
+ goto ahead; //Repeat the previous command
+ } else { //Wrong pulse
+ Rx_rep_count = 0; //Reset counter
+ state = 0; //Reset the state machine
+ }
+ } else if(state == 3) {
+ T.stop(); //Stop timer
+ T_buf = T.read_us(); //Read the value in timer
+ T.reset(); //Reset timer
+ T.start(); //Start timer
+ IR.fall(&IR_ISR); //Set IR interrupt to occur on falling edge
+ IR.rise(&dummy_ISR);
+
+ if(T_buf <= IR_1_UL_us && T_buf >= IR_1_LL_us) { //Check if bit is '1'(2.25ms)
+ ++Rx_count; //Increment the bit counter
+ Rx_buf >>= 1;
+ Rx_buf |= 0x80000000; //Shift in a '1' from the left side
+ state = 3; //Remain in current state
+ } else if(T_buf <= IR_0_UL_us && T_buf >= IR_0_LL_us) { //Check if bit is '0'(1.12ms)
+ ++Rx_count; //Increment the bit counter
+ Rx_buf >>= 1; //Shift in a '0' from the left side
+ state = 3; //Remain in current state
+ } else { //Invalid data received
+ Rx_count = 0;//Reset the bit counter
+ state = 0; //Reset state m/c
+ }
+
+ if(Rx_count == 32) { //Check if all 32 bits have been received
+ state = 0; //Reset state m/c
+
+ahead:
+
+ if(!((Rx_rep_count > 0) && (Rx_ignore_rep_flag == 1))) {
+ Rx_flag = 1; //Set this flag for repeat pulses only if repeat pulses are to be considered
+ }
+ Rx_rep_timeout_count = 0; //Reset the counter everytime a valid command is received
+ }
+ }
+}
+
+void dummy_ISR()
+{
+ //Do nothing
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Sat Mar 09 00:51:21 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/5e5da4a5990b \ No newline at end of file