Library for Nuelectronics Nokia 3310/5110 LCD Display and joystick.
Dependents: N3310LCD_Demo FRDM_N3110LCD
Revision 0:7efa6655d94b, committed 2013-03-10
- Comitter:
- SomeRandomBloke
- Date:
- Sun Mar 10 18:15:25 2013 +0000
- Child:
- 1:51961974fe55
- Commit message:
- initial commit
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Joystick.cpp Sun Mar 10 18:15:25 2013 +0000 @@ -0,0 +1,130 @@ +/* +* 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> +* +* Converted to a mbed library by Andrew D. Lindsay +* +* 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 +Serial pc(USBTX,USBRX); + +// 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); + pc.printf("%d \n",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; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Joystick.h Sun Mar 10 18:15:25 2013 +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> +* +* Converted to a mbed library by Andrew D. Lindsay +* +* 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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/N3310Fonts.h Sun Mar 10 18:15:25 2013 +0000 @@ -0,0 +1,266 @@ +/* +* 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> +* +* Converted to a mbed library by Andrew D. Lindsay +* +* 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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/N3310LCD.cpp Sun Mar 10 18:15:25 2013 +0000 @@ -0,0 +1,389 @@ +/* +* 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> +* +* Converted to a mbed library by Andrew D. Lindsay +* +* 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" + +static unsigned char lcd_buffer[LCDROWMAX][LCDCOLMAX]; + +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++; + } +} + +/* + * Name : clearBitmap + * Description : Clear an area of the screen, usually to blank out a + * previously drawn image or part of image. + * Argument(s) : x, y - Position on screen, x 0-83, y 1-6 + * size_x,size_y - Size of the image in pixels, + * size_y is multiple of 8 + * Return value : none + */ +void N3310LCD::clearBitmap( unsigned char x,unsigned char y, + unsigned char size_x,unsigned char size_y) + { + unsigned int i,n; + unsigned char row; + + row = (size_y % 8 == 0 ) ? size_y / 8 : size_y / 8 + 1; +// if (size_y % 8==0) +// row=size_y/8; +// else +// row=size_y/8+1; + + for (n=0;n<row;n++) { + locate(x,y); + for(i=0; i<size_x; i++) { + write( 0x00, DATA ); + } + y++; + } +} + +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); + } + } +} + +/* + * Name : setPixel + * Description : Set a single pixel either on or off, update display buffer. + * Argument(s) : x,y - position, x = 0-83, y = 0-6 + * c - colour, either PIXEL_ON, PIXEL_OFF or PIXEL_XOR + * Return value : none + */ +void N3310LCD::setPixel( unsigned char x, unsigned char y, unsigned char c ) { +unsigned char value; +unsigned char row; + +// if( x < 0 || x >= LCDCOLMAX || y < 0 || y >= LCDPIXELROWMAX ) return; + if( x >= LCDCOLMAX || y >= LCDPIXELROWMAX ) return; + + row = y / 8; + + value = lcd_buffer[row][x]; + if( c == PIXEL_ON ) { + value |= (1 << (y % 8)); + } else if( c == PIXEL_XOR ) { + value ^= (1 << (y % 8)); + } else { + value &= ~(1 << (y % 8)); + } + + lcd_buffer[row][x] = value; + + locate (x,row); + write(value, DATA); +} + + +/* + * Name : drawLine + * Description : Draws a line between two points on the display. + * Argument(s) : x1, y1 - Absolute pixel coordinates for line origin. + * x2, y2 - Absolute pixel coordinates for line end. + * c - either PIXEL_ON, PIXEL_OFF or PIXEL_XOR + * Return value : none + */ +void N3310LCD::drawLine(unsigned char x1, unsigned char y1, + unsigned char x2, unsigned char y2, unsigned char c) { + int dx, dy, stepx, stepy, fraction; + + /* Calculate differential form */ + /* dy y2 - y1 */ + /* -- = ------- */ + /* dx x2 - x1 */ + + /* Take differences */ + dy = y2 - y1; + dx = x2 - x1; + + /* dy is negative */ + if ( dy < 0 ) { + dy = -dy; + stepy = -1; + } else { + stepy = 1; + } + + /* dx is negative */ + if ( dx < 0 ) { + dx = -dx; + stepx = -1; + } else { + stepx = 1; + } + + dx <<= 1; + dy <<= 1; + + /* Draw initial position */ + setPixel( x1, y1, c ); + + /* Draw next positions until end */ + if ( dx > dy ) { + /* Take fraction */ + fraction = dy - ( dx >> 1); + while ( x1 != x2 ) { + if ( fraction >= 0 ) { + y1 += stepy; + fraction -= dx; + } + x1 += stepx; + fraction += dy; + + /* Draw calculated point */ + setPixel( x1, y1, c ); + } + } else { + /* Take fraction */ + fraction = dx - ( dy >> 1); + while ( y1 != y2 ) { + if ( fraction >= 0 ) { + x1 += stepx; + fraction -= dy; + } + y1 += stepy; + fraction += dx; + + /* Draw calculated point */ + setPixel( x1, y1, c ); + } + } +} + + +/* + * Name : drawRectangle + * Description : Draw a rectangle given to top left and bottom right points + * Argument(s) : x1, y1 - Absolute pixel coordinates for top left corner + * x2, y2 - Absolute pixel coordinates for bottom right corner + * c - either PIXEL_ON, PIXEL_OFF or PIXEL_XOR + * Return value : none + */ +void N3310LCD::drawRectangle(unsigned char x1, unsigned char y1, + unsigned char x2, unsigned char y2, unsigned char c){ + drawLine( x1, y1, x2, y1, c ); + drawLine( x1, y1, x1, y2, c ); + drawLine( x1, y2, x2, y2, c ); + drawLine( x2, y1, x2, y2, c ); +} + + +/* + * Name : drawFilledRectangle + * Description : Draw a filled rectangle given to top left and bottom right points + * just simply draws horizontal lines where the rectangle would be + * Argument(s) : x1, y1 - Absolute pixel coordinates for top left corner + * x2, y2 - Absolute pixel coordinates for bottom right corner + * c - either PIXEL_ON, PIXEL_OFF or PIXEL_XOR + * Return value : none + */ +void N3310LCD::drawFilledRectangle(unsigned char x1, unsigned char y1, + unsigned char x2, unsigned char y2, unsigned char c) { + for(int i=y1; i <= y2; i++ ) { + drawLine( x1, i, x2, i, c ); + } +} + + +/* + * Name : drawCircle + * Description : Draw a circle using Bresenham's algorithm. + * Some small circles will look like squares!! + * Argument(s) : xc, yc - Centre of circle + * r - Radius + * c - either PIXEL_ON, PIXEL_OFF or PIXEL_XOR + * Return value : None + */ +void N3310LCD::drawCircle(unsigned char xc, unsigned char yc, + unsigned char r, unsigned char c) { + int x=0; + int y=r; + int p=3-(2*r); + + setPixel( (uint8_t)(xc+x),(uint8_t)(yc-y), c); + + for(x=0;x<=y;x++) { + if (p<0) { + y=y; + p=(p+(4*x)+6); + } else { + y=y-1; + p=p+((4*(x-y)+10)); + } + + setPixel((uint8_t)(xc+x),(uint8_t)(yc-y), c); + setPixel((uint8_t)(xc-x),(uint8_t)(yc-y), c); + setPixel((uint8_t)(xc+x),(uint8_t)(yc+y), c); + setPixel((uint8_t)(xc-x),(uint8_t)(yc+y), c); + setPixel((uint8_t)(xc+y),(uint8_t)(yc-x), c); + setPixel((uint8_t)(xc-y),(uint8_t)(yc-x), c); + setPixel((uint8_t)(xc+y),(uint8_t)(yc+x), c); + setPixel((uint8_t)(xc-y),(uint8_t)(yc+x), c); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/N3310LCD.h Sun Mar 10 18:15:25 2013 +0000 @@ -0,0 +1,73 @@ +/* +* 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> +* +* Converted to a mbed library by Andrew D. Lindsay +* +* 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" + +#define LCDCOLMAX 84 +#define LCDROWMAX 6 +#define LCDPIXELROWMAX 48 +#define PIXEL_OFF 0 +#define PIXEL_ON 1 +#define PIXEL_XOR 2 + +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 clearBitmap(BYTE xPos,BYTE yPos, BYTE size_x, BYTE size_y); + 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); + + void setPixel( BYTE x, BYTE y, BYTE c ); + void drawLine(BYTE x1, BYTE y1, BYTE x2, BYTE y2, BYTE c); + void drawRectangle(BYTE x1, BYTE y1,BYTE x2, BYTE y2, BYTE c); + void drawFilledRectangle(BYTE x1, BYTE y1, BYTE x2, BYTE y2, BYTE c); + void drawCircle(BYTE xc, BYTE yc, BYTE r, BYTE c); + +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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/N3310LCDDefs.h Sun Mar 10 18:15:25 2013 +0000 @@ -0,0 +1,35 @@ +/* +* 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> +* +* Converted to a mbed library by Andrew D. Lindsay +* +* 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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/N3310SPIConfig.h Sun Mar 10 18:15:25 2013 +0000 @@ -0,0 +1,82 @@ +/* +* 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> +* +* Converted to a mbed library by Andrew D. Lindsay +* +* 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 = PTD2; +const PinName N3310SPIPort::MISO = PTD3; // not used for 3310 +const PinName N3310SPIPort::SCK = PTD1; + +//const PinName N3310SPIPort::CE = PTC8; // Alternative test display with CE on pin 6 instead of 10 +const PinName N3310SPIPort::CE = PTD0; +const PinName N3310SPIPort::LCD_RST = PTD5; +const PinName N3310SPIPort::DAT_CMD = PTA13; +const PinName N3310SPIPort::BL_ON = PTC9; + +const PinName N3310SPIPort::AD0 = PTB0; // 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