Code to interface mbed to a Nokia 3310 LCD using the Nokia 3310 LCD shield from nuelectronics. Includes joystick interface and demo.
Revision 0:36fb749b83c7, committed 2009-12-07
- Comitter:
- snatch59
- Date:
- Mon Dec 07 17:24:52 2009 +0000
- Commit message:
Changed in this revision
diff -r 000000000000 -r 36fb749b83c7 Joystick.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Joystick.cpp Mon Dec 07 17:24:52 2009 +0000 @@ -0,0 +1,126 @@ +/* +* N3310LCD. A program to interface mbed with the nuelectronics +* Nokia 3310 LCD shield from www.nuelectronics.com. Ported from +* the nuelectronics Arduino code. +* +* Copyright (C) <2009> Petras Saduikis <petras@petras.co.uk> +* +* This file is part of N3310LCD. +* +* N3310LCD is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* N3310LCD is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with N3310LCD. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <mbed.h> +#include "Joystick.h" + +//keypad debounce parameter +#define DEBOUNCE_MAX 15 +#define DEBOUNCE_ON 10 +#define DEBOUNCE_OFF 3 + +// values correspond to use of a 3.3V supply for the LCD shield. +const int Joystick::adcKeyVal[NUM_KEYS] = {50, // LEFT + 200, // CENTER DEPRESSED + 400, // DOWN + 600, // UP + 800 // RIGHT + // 1024 CENTER NOT DEPRESSED + }; + +Joystick::Joystick(PinName jstick) : joystick(jstick) +{ + // reset button arrays + for (int i = 0; i < NUM_KEYS; i++) + { + buttonCount[i] = 0; + buttonStatus[i] = 0; + buttonFlag[i] = 0; + } +} + +int Joystick::getKeyState(int i) +{ + int retval = 0; + + if (i < NUM_KEYS) + { + retval = buttonFlag[i]; + } + + return retval; +} + +void Joystick::resetKeyState(int i) +{ + if (i < NUM_KEYS) + { + buttonFlag[i] = 0; + } +} + +void Joystick::updateADCKey() +{ + // NOTE: the mbed analog in is 0 - 3.3V, represented as 0.0 - 1.0. It is important + // that the LCD shield is powered from a 3.3V supply in order for the 'right' joystick + // key to function correctly. + + int adcKeyIn = joystick * 1024; // scale this up so we can use int + int keyIn = getKey(adcKeyIn); + + for (int i = 0; i < NUM_KEYS; i++) + { + if (keyIn == i) //one key is pressed + { + if (buttonCount[i] < DEBOUNCE_MAX) + { + buttonCount[i]++; + if (buttonCount[i] > DEBOUNCE_ON) + { + if (buttonStatus[i] == 0) + { + buttonFlag[i] = 1; + buttonStatus[i] = 1; //button debounced to 'pressed' status + } + } + } + } + else // no button pressed + { + if (buttonCount[i] > 0) + { + buttonFlag[i] = 0; + buttonCount[i]--; + if (buttonCount[i] < DEBOUNCE_OFF) + { + buttonStatus[i] = 0; //button debounced to 'released' status + } + } + } + } +} + +// Convert ADC value to key number +int Joystick::getKey(int input) +{ + int k; + + for (k = 0; k < NUM_KEYS; k++) + { + if (input < adcKeyVal[k]) return k; + } + + if (k >= NUM_KEYS) k = -1; // No valid key pressed + + return k; +}
diff -r 000000000000 -r 36fb749b83c7 Joystick.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Joystick.h Mon Dec 07 17:24:52 2009 +0000 @@ -0,0 +1,55 @@ +/* +* N3310LCD. A program to interface mbed with the nuelectronics +* Nokia 3310 LCD shield from www.nuelectronics.com. Ported from +* the nuelectronics Arduino code. +* +* Copyright (C) <2009> Petras Saduikis <petras@petras.co.uk> +* +* This file is part of N3310LCD. +* +* N3310LCD is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* N3310LCD is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with N3310LCD. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef SNATCH59_JOYSTICK_H +#define SNATCH59_JOYSTICK_H + +#define NUM_KEYS 5 + +enum eJoystickKey {LEFT_KEY, CENTER_KEY, DOWN_KEY, UP_KEY, RIGHT_KEY}; + +class Joystick +{ +public: + Joystick(PinName jstick); + + int getKeyState(int i); + void resetKeyState(int i); + void updateADCKey(); // call this to initiate joystick read + +private: + // data + int buttonCount[NUM_KEYS]; // debounce counters + int buttonStatus[NUM_KEYS]; // button status - pressed/released + int buttonFlag[NUM_KEYS]; // button on flags for user program + + static const int adcKeyVal[NUM_KEYS]; + + // I/O + AnalogIn joystick; + + // functions + int getKey(int input); +}; + +#endif \ No newline at end of file
diff -r 000000000000 -r 36fb749b83c7 N3310Fonts.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/N3310Fonts.h Mon Dec 07 17:24:52 2009 +0000 @@ -0,0 +1,264 @@ +/* +* N3310LCD. A program to interface mbed with the nuelectronics +* Nokia 3310 LCD shield from www.nuelectronics.com. Ported from +* the nuelectronics Arduino code. +* +* Copyright (C) <2009> Petras Saduikis <petras@petras.co.uk> +* +* This file is part of N3310LCD. +* +* N3310LCD is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* N3310LCD is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with N3310LCD. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef SNATCH59_N3310FONTS_H +#define SNATCH59_N3310FONTS_H + +// 6 x 8 font +// 1 pixel space at left and bottom +// index = ASCII - 32 + +unsigned char font6_8[][6] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // sp + { 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 }, // ! + { 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 }, // " + { 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // # + { 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $ + { 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 }, // % + { 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 }, // & + { 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 }, // ' + { 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 }, // ( + { 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 }, // ) + { 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 }, // * + { 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08 }, // + + { 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00 }, // , + { 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 }, // - + { 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 }, // . + { 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 }, // / + { 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E }, // 0 + { 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 }, // 1 + { 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2 + { 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 }, // 3 + { 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 }, // 4 + { 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5 + { 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30 }, // 6 + { 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7 + { 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8 + { 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E }, // 9 + { 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 }, // : + { 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 }, // ; + { 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 }, // < + { 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 }, // = + { 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 }, // > + { 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 }, // ? + { 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E }, // @ + { 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C }, // A + { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 }, // B + { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 }, // C + { 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C }, // D + { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 }, // E + { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 }, // F + { 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A }, // G + { 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F }, // H + { 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 }, // I + { 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 }, // J + { 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 }, // K + { 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 }, // L + { 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F }, // M + { 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F }, // N + { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E }, // O + { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 }, // P + { 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E }, // Q + { 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 }, // R + { 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 }, // S + { 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 }, // T + { 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F }, // U + { 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F }, // V + { 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F }, // W + { 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 }, // X + { 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y + { 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z + { 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 }, // [ + { 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55 }, // 55 + { 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 }, // ] + { 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^ + { 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 }, // _ + { 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 }, // ' + { 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 }, // a + { 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 }, // b + { 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 }, // c + { 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F }, // d + { 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 }, // e + { 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 }, // f + { 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C }, // g + { 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 }, // h + { 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 }, // i + { 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 }, // j + { 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 }, // k + { 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 }, // l + { 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 }, // m + { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 }, // n + { 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 }, // o + { 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 }, // p + { 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC }, // q + { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 }, // r + { 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 }, // s + { 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 }, // t + { 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C }, // u + { 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C }, // v + { 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C }, // w + { 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 }, // x + { 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C }, // y + { 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 }, // z + { 0x00,0x00, 0x06, 0x09, 0x09, 0x06 } // horiz lines +}; + + +//******* VERY LARGE FONTS ********** +//used here for displaying numbers 0 - 9 and '+', '-', '.' + +unsigned char big_number[13][3][16] = +{ + 0,128,192,224,224,96,224,224, //'0' + 192,128,0,0,0,0,0,0 + , + 112,255,255,1,0,0,0,0, + 255,255,254,0,0,0,0,0 + , + 0,15,31,60,56,48,56,56, + 31,15,3,0,0,0,0,0 + , + + 0,0,0,0,128,224,224,0, //'1' + 0,0,0,0,0,0,0,0 + , + 0,0,3,3,3,255,255,0, + 0,0,0,0,0,0,0,0 + , + 0,0,56,56,56,63,63,56, + 56,56,0,0,0,0,0,0 + , + + 0,192,192,224,96,96,224,224, //'2' + 192,128,0,0,0,0,0,0 + , + 0,1,0,0,128,192,224,249, + 63,31,0,0,0,0,0,0 + , + 0,60,62,63,63,59,57,56, + 56,56,56,0,0,0,0,0 + , + + 0,192,224,224,96,96,224,224, //'3' + 192,192,0,0,0,0,0,0 + , + 0,1,0,0,48,48,56,125, + 239,207,0,0,0,0,0,0 + , + 0,28,56,56,48,48,56,60, + 31,15,1,0,0,0,0,0 + , + + 0,0,0,0,0,128,192,224, //'4' + 224,0,0,0,0,0,0,0 + , + 224,240,248,222,207,199,193,255, + 255,192,192,0,0,0,0,0 + , + 0,0,0,0,0,0,0,63, + 63,0,0,0,0,0,0,0 + , + + 0,224,224,224,224,224,224,224, //'5' + 224,224,224,0,0,0,0,0 + , + 0,63,63,63,56,56,48,112, + 240,224,0,0,0,0,0,0 + , + 0,28,56,56,48,48,56,60, + 31,15,1,0,0,0,0,0 + , + + 0,0,128,192,192,224,96,96, //'6' + 224,224,0,0,0,0,0,0 + , + 224,254,255,55,57,24,24,56, + 240,240,192,0,0,0,0,0 + , + 0,15,31,28,56,48,48,56, + 31,15,7,0,0,0,0,0 + , + + 0,224,224,224,224,224,224,224, //'7' + 224,224,224,0,0,0,0,0 + , + 0,0,0,0,128,224,248,126, + 31,7,1,0,0,0,0,0 + , + 0,0,56,62,31,7,1,0, + 0,0,0,0,0,0,0,0 + , + + 0,128,192,224,224,96,96,224, //'8' + 192,192,0,0,0,0,0,0 + , + 0,207,255,127,56,48,112,112, + 255,239,199,0,0,0,0,0 + , + 3,15,31,60,56,48,48,56, + 31,31,15,0,0,0,0,0 + , + + 0,128,192,224,224,96,224,224, //'9' + 192,128,0,0,0,0,0,0 + , + 12,63,127,241,224,192,192,225, + 255,255,254,0,0,0,0,0 + , + 0,0,56,48,48,56,56,30, + 15,7,0,0,0,0,0,0 + , + + + 0,0,0,0,0,0,0,0, //'.' + 0,0,0,0,0,0,0,0 + , + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0 + , + 60,60,60,0,0,0,0,0, + 0,0,0,0,0,0,0,0 + , + + 0,0,0,0,0,0,0,0, //'+' + 0,0,0,0,0,0,0,0 + , + 0,0,64,64,64,64,64,254, + 254,64,64,64,64,64,0,0 + , + 0,0,0,0,0,0,0,15, + 15,0,0,0,0,0,0,0 + , + + 0,0,0,0,0,0,0,0, //'-' + 0,0,0,0,0,0,0,0 + , + 0,64,64,64,64,64,64,0, + 0,0,0,0,0,0,0,0 + , + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0 +}; + +#endif
diff -r 000000000000 -r 36fb749b83c7 N3310LCD.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/N3310LCD.cpp Mon Dec 07 17:24:52 2009 +0000 @@ -0,0 +1,176 @@ +/* +* N3310LCD. A program to interface mbed with the nuelectronics +* Nokia 3310 LCD shield from www.nuelectronics.com. Ported from +* the nuelectronics Arduino code. +* +* Copyright (C) <2009> Petras Saduikis <petras@petras.co.uk> +* +* This file is part of N3310LCD. +* +* N3310LCD is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* N3310LCD is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with N3310LCD. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "N3310LCD.h" +#include "N3310Fonts.h" + +N3310LCD::N3310LCD (PinName mosi, PinName miso, PinName sck, + PinName ce, PinName dat_cmd, PinName lcd_rst, PinName bl_on) : + lcdPort(mosi, miso, sck), + ceWire(ce), dcWire(dat_cmd), rstWire(lcd_rst), blWire(bl_on) +{ +} + +void N3310LCD::init() +{ + // use default SPI format + lcdPort.format(8,0); + lcdPort.frequency(1000000); + + // lcd reset + wait_ms(1); + rstWire = 0; + wait_ms(1); + rstWire = 1; + + write(0x21, CMD); + write(0xc8, CMD); + write(0x06, CMD); + write(0x13, CMD); + write(0x20, CMD); + cls(); + write(0x0c, CMD); +} + +void N3310LCD::cls() +{ + write(0x0c, CMD); + write(0x80, CMD); + + for (int i = 0; i < 504; i++) + { + write(0, DATA); + } +} + +void N3310LCD::backlight(eBacklight state) +{ + // switch off/on back light + blWire = state; +} + +void N3310LCD::write(BYTE data, eRequestType req_type) +{ + // bring CS low for write + ceWire = 0; + + if (CMD == req_type) + dcWire = 0; + else // DATA + dcWire = 1; + + lcdPort.write(data); + + // write finished + ceWire = 1; +} + +void N3310LCD::locate(BYTE xPos, BYTE yPos) +{ + write(0x40 | yPos, CMD); // column + write(0x80 | xPos, CMD); // row +} + +void N3310LCD::drawBitmap(BYTE xPos, BYTE yPos, BYTE* bitmap, BYTE bmpXSize, BYTE bmpYSize) +{ + BYTE row; + + if (0 == bmpYSize % 8) + row = bmpYSize/8; + else + row = bmpYSize/8 + 1; + + for (BYTE n = 0; n < row; n++) + { + locate(xPos, yPos); + for(BYTE i = 0; i < bmpXSize; i++) + { + write(bitmap[i + (n * bmpXSize)], DATA); + } + yPos++; + } +} + +void N3310LCD::writeString(BYTE xPos, BYTE yPos, char* string, eDisplayMode mode) +{ + locate(xPos, yPos); + + while (*string) + { + writeChar(*string++, mode); + } +} + +void N3310LCD::writeStringBig(BYTE xPos, BYTE yPos, char* string, eDisplayMode mode) +{ + while (*string) + { + writeCharBig(xPos, yPos, *string , mode); + + if('.' == *string++) + xPos += 5; + else + xPos += 12; + } +} + +void N3310LCD::writeChar(BYTE ch, eDisplayMode mode) +{ + BYTE sendByte; + + unsigned char* pFont = (unsigned char*)font6_8; + ch -= 32; + + for (BYTE line = 0; line < 6; line++) + { + sendByte = *(pFont + ch*6 + line); + write((mode == NORMAL)? sendByte: (sendByte ^ 0xff) , DATA); + } +} + +void N3310LCD::writeCharBig(BYTE xPos, BYTE yPos, BYTE ch, eDisplayMode mode) +{ + BYTE sendByte; + + unsigned char* pFont = (unsigned char *) big_number; + + if('.' == ch) + ch = 10; + else if ('+' == ch) + ch = 11; + else if ('-' == ch) + ch = 12; + else + ch = ch & 0x0f; + + for(BYTE i = 0; i < 3; i++) + { + locate(xPos, yPos + i); + + for(BYTE j = 0; j < 16; j++) + { + sendByte = *(pFont + ch*48 + i*16 + j); + write((mode == NORMAL)? sendByte : (sendByte^0xff), DATA); + } + } +}
diff -r 000000000000 -r 36fb749b83c7 N3310LCD.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/N3310LCD.h Mon Dec 07 17:24:52 2009 +0000 @@ -0,0 +1,57 @@ +/* +* N3310LCD. A program to interface mbed with the nuelectronics +* Nokia 3310 LCD shield from www.nuelectronics.com. Ported from +* the nuelectronics Arduino code. +* +* Copyright (C) <2009> Petras Saduikis <petras@petras.co.uk> +* +* This file is part of N3310LCD. +* +* N3310LCD is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* N3310LCD is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with N3310LCD. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef SNATCH59_N3310LCD_H +#define SNATCH59_N3310LCD_H + +#include <mbed.h> +#include "N3310LCDDefs.h" + +class N3310LCD +{ +public: + N3310LCD(PinName mosi, PinName miso, PinName sck, + PinName ce, PinName dat_cmd, PinName lcd_rst, PinName bl_on); + + void init(); + void cls(); + void backlight(eBacklight state); + void write(BYTE data, eRequestType req_type); + void locate(BYTE xPos, BYTE yPos); + + void drawBitmap(BYTE xPos, BYTE yPos, BYTE* bitmap, BYTE bmpXSize, BYTE bmpYSize); + void writeString(BYTE xPos, BYTE yPos, char* string, eDisplayMode mode); + void writeStringBig(BYTE xPos, BYTE yPos, char* string, eDisplayMode mode); + void writeChar(BYTE ch, eDisplayMode mode); + void writeCharBig(BYTE xPos, BYTE yPos, BYTE ch, eDisplayMode mode); + +private: + // I/O + SPI lcdPort; // does SPI MOSI, MISO and SCK + DigitalOut ceWire; // does SPI CE + DigitalOut dcWire; // does 3310 DAT_CMD + DigitalOut rstWire; // does 3310 LCD_RST + DigitalOut blWire; // does 3310 BL_ON (backlight) +}; + +#endif \ No newline at end of file
diff -r 000000000000 -r 36fb749b83c7 N3310LCDDefs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/N3310LCDDefs.h Mon Dec 07 17:24:52 2009 +0000 @@ -0,0 +1,33 @@ +/* +* N3310LCD. A program to interface mbed with the nuelectronics +* Nokia 3310 LCD shield from www.nuelectronics.com. Ported from +* the nuelectronics Arduino code. +* +* Copyright (C) <2009> Petras Saduikis <petras@petras.co.uk> +* +* This file is part of N3310LCD. +* +* N3310LCD is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* N3310LCD is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with N3310LCD. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef SNATCH59_N3310LCDDEFS_H +#define SNATCH59_N3310LCDDEFS_H + +enum eDisplayMode {NORMAL, HIGHLIGHT}; +enum eRequestType {CMD, DATA}; +enum eBacklight {OFF, ON}; + +typedef unsigned char BYTE; + +#endif \ No newline at end of file
diff -r 000000000000 -r 36fb749b83c7 N3310SPIConfig.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/N3310SPIConfig.h Mon Dec 07 17:24:52 2009 +0000 @@ -0,0 +1,79 @@ +/* +* N3310LCD. A program to interface mbed with the nuelectronics +* Nokia 3310 LCD shield from www.nuelectronics.com. Ported from +* the nuelectronics Arduino code. +* +* Copyright (C) <2009> Petras Saduikis <petras@petras.co.uk> +* +* This file is part of N3310LCD. +* +* N3310LCD is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* N3310LCD is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with N3310LCD. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef SNATCH59_N3310SPICONFIG_H +#define SNATCH59_N3310SPICONFIG_H + +#include <mbed.h> + +class N3310SPIPort +{ +public: + static const PinName MOSI; // Master Out Slave In + static const PinName MISO; // Master In Slave Out + static const PinName SCK; // SPI clock + static const PinName CE; // Chip Enable (aka Chip Select) + static const PinName LCD_RST; // LCD reset + static const PinName DAT_CMD; // indicates if the SPI write is command or date + static const PinName BL_ON; // Back Light On + + static const PinName AD0; // analog in for joystick +}; + +// NOTE pins have been chosen not to conflict with any I2C usage. +// MOSI = p5, MISO = p6, SCK = p7 is also an option +const PinName N3310SPIPort::MOSI = p11; +const PinName N3310SPIPort::MISO = p12; // not used for 3310 +const PinName N3310SPIPort::SCK = p13; + +const PinName N3310SPIPort::CE = p21; +const PinName N3310SPIPort::LCD_RST = p22; +const PinName N3310SPIPort::DAT_CMD = p23; +const PinName N3310SPIPort::BL_ON = p24; + +const PinName N3310SPIPort::AD0 = p20; // joystick analog + +/************************************************ +* +* Nokia 3310 LCD Shield Pins +* NOTE: the LCD shield must be powered from a 3.3V supply in order +* for the joystick to be read correctly by the mbed analog in +* (which operates on a range of 0 - 3.3V). +* +* Connector J3: +* p13: SCK +* p12: MISO (not used) +* p11: MOSI +* p10: CE +* p9: LCD_RST +* p8: DAT_CMD +* +* Connector J1: +* p7: BL_ON +* +* Connector J2: +* p1 : AD0 +* +**************************************************/ + +#endif \ No newline at end of file
diff -r 000000000000 -r 36fb749b83c7 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Dec 07 17:24:52 2009 +0000 @@ -0,0 +1,198 @@ +/* +* N3310LCD. A program to interface mbed with the nuelectronics +* Nokia 3310 LCD shield from www.nuelectronics.com. Ported from +* the nuelectronics Arduino code. +* +* Copyright (C) <2009> Petras Saduikis <petras@petras.co.uk> +* +* This file is part of N3310LCD. +* +* N3310LCD is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* N3310LCD is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with N3310LCD. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "N3310SPIConfig.h" +#include "N3310LCD.h" +#include "Joystick.h" +#include "mbed_bmp.h" + +// demo for nuelectronics Nokia 3310 LCD shield (www.nuelectronics.com) +// + +// menu starting points +#define MENU_X 10 // 0-83 +#define MENU_Y 1 // 0-5 + +#define DEMO_ITEMS 4 + +// menu definition +char menu_items[DEMO_ITEMS][12] = +{ + "TEMPERATURE", + "CHAR MAP", + "BITMAP", + "ABOUT" +}; + +void temperature(N3310LCD* lcd) +{ + lcd->writeStringBig(5, 1, "+21.12", NORMAL); + lcd->writeString(73, 2, "C", NORMAL); +} + +void charmap(N3310LCD* lcd) +{ + for(int i = 0; i < 5; i++) + { + for(int j = 0; j < 14; j++) + { + lcd->locate(j*6, i); + lcd->writeChar(i*14 + j + 32, NORMAL); + } + } +} + +void bitmap(N3310LCD* lcd) +{ + lcd->drawBitmap(20, 1, mbed_bmp, 48, 24); +} + +void about(N3310LCD* lcd) +{ + lcd->writeString(0, 1, "Nokia 3310 LCD", NORMAL); + lcd->writeString(15, 2, "driven by", NORMAL); + lcd->writeString(30, 3, "mbed", NORMAL); +} + +void (*menu_funcs[DEMO_ITEMS])(N3310LCD*) = +{ + temperature, + charmap, + bitmap, + about +}; + +void initMenu(N3310LCD* lcd) +{ + lcd->writeString(MENU_X, MENU_Y, menu_items[0], HIGHLIGHT ); + + for (int i = 1; i < DEMO_ITEMS; i++) + { + lcd->writeString(MENU_X, MENU_Y + i, menu_items[i], NORMAL); + } +} + +void waitforOKKey(N3310LCD* lcd, Joystick* jstick) +{ + lcd->writeString(38, 5, "OK", HIGHLIGHT ); + + int key = 0xFF; + while (key != CENTER_KEY) + { + for (int i = 0; i < NUM_KEYS; i++) + { + if (jstick->getKeyState(i) !=0) + { + jstick->resetKeyState(i); // reset + if (CENTER_KEY == i) key = CENTER_KEY; + } + } + } +} + +void autoDemo(N3310LCD* lcd) +{ + while (true) + { + for (int i = 0; i < DEMO_ITEMS; i++) + { + lcd->cls(); + lcd->backlight(ON); + wait(1); + + (*menu_funcs[i])(lcd); + + wait(3); + + lcd->backlight(OFF); + wait(3); + } + } +} + +int main() +{ + Joystick jstick(N3310SPIPort::AD0); + N3310LCD lcd(N3310SPIPort::MOSI, N3310SPIPort::MISO, N3310SPIPort::SCK, + N3310SPIPort::CE, N3310SPIPort::DAT_CMD, N3310SPIPort::LCD_RST, + N3310SPIPort::BL_ON); + lcd.init(); + lcd.cls(); + lcd.backlight(ON); + + // demo stuff + // autoDemo(&lcd); + + initMenu(&lcd); + int currentMenuItem = 0; + Ticker jstickPoll; + jstickPoll.attach(&jstick, &Joystick::updateADCKey, 0.01); // check ever 10ms + + + while (true) + { + for (int i = 0; i < NUM_KEYS; i++) + { + if (jstick.getKeyState(i) != 0) + { + jstick.resetKeyState(i); // reset button flag + switch(i) + { + case UP_KEY: + // current item to normal display + lcd.writeString(MENU_X, MENU_Y + currentMenuItem, menu_items[currentMenuItem], NORMAL); + currentMenuItem -=1; + if (currentMenuItem <0) currentMenuItem = DEMO_ITEMS -1; + // next item to highlight display + lcd.writeString(MENU_X, MENU_Y + currentMenuItem, menu_items[currentMenuItem], HIGHLIGHT); + break; + + case DOWN_KEY: + // current item to normal display + lcd.writeString(MENU_X, MENU_Y + currentMenuItem, menu_items[currentMenuItem], NORMAL); + currentMenuItem +=1; + if(currentMenuItem >(DEMO_ITEMS - 1)) currentMenuItem = 0; + // next item to highlight display + lcd.writeString(MENU_X, MENU_Y + currentMenuItem, menu_items[currentMenuItem], HIGHLIGHT); + break; + + case LEFT_KEY: + initMenu(&lcd); + currentMenuItem = 0; + break; + + case RIGHT_KEY: + lcd.cls(); + (*menu_funcs[currentMenuItem])(&lcd); + waitforOKKey(&lcd, &jstick); + lcd.cls(); + initMenu(&lcd); + currentMenuItem = 0; + break; + } + } + } + } + + return EXIT_SUCCESS; +}
diff -r 000000000000 -r 36fb749b83c7 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Mon Dec 07 17:24:52 2009 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/49a220cc26e0
diff -r 000000000000 -r 36fb749b83c7 mbed_bmp.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed_bmp.h Mon Dec 07 17:24:52 2009 +0000 @@ -0,0 +1,49 @@ +/* +* N3310LCD. A program to interface mbed with the nuelectronics +* Nokia 3310 LCD shield from www.nuelectronics.com. Ported from +* the nuelectronics Arduino code. +* +* Copyright (C) <2009> Petras Saduikis <petras@petras.co.uk> +* +* This file is part of N3310LCD. +* +* N3310LCD is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* N3310LCD is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with N3310LCD. If not, see <http://www.gnu.org/licenses/>. +*/ + +/*------------------------------------------------------------------------------ +; mbed bitmap - size 48x24 pixels, black/white image +------------------------------------------------------------------------------*/ + +unsigned char mbed_bmp[]= +{ + +0x00,0x80,0x80,0x80,0x00,0x80,0x80,0x80, +0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00, +0xF8,0xF8,0xF8,0x00,0x80,0x80,0x80,0x00, +0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80, +0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80, +0x80,0x80,0x00,0xF8,0xF8,0xF8,0x00,0x00, +0x00,0xFF,0xFF,0xFF,0x01,0x01,0xFF,0xFF, +0xFF,0x01,0x01,0xFF,0xFF,0xFF,0x00,0x00, +0xFF,0xFF,0xFF,0x83,0x01,0x83,0xFF,0xFF, +0xFE,0x00,0x00,0x7C,0xFF,0xFF,0x19,0x19, +0xDF,0xDF,0xDC,0x00,0x00,0xFE,0xFF,0xFF, +0x83,0x01,0x83,0xFF,0xFF,0xFF,0x00,0x00, +0x00,0x03,0x03,0x03,0x00,0x00,0x03,0x03, +0x03,0x00,0x00,0x03,0x03,0x03,0x00,0x00, +0x03,0x03,0x03,0x01,0x03,0x03,0x03,0x01, +0x00,0x00,0x00,0x00,0x01,0x03,0x03,0x03, +0x03,0x01,0x00,0x00,0x00,0x00,0x01,0x03, +0x03,0x03,0x01,0x03,0x03,0x03,0x00,0x00 +}; \ No newline at end of file