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:36fb749b83c7, committed 2009-12-07
- Comitter:
- snatch59
- Date:
- Mon Dec 07 17:24:52 2009 +0000
- Commit message:
Changed in this revision
--- /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;
+}
--- /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
--- /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
--- /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);
+ }
+ }
+}
--- /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
--- /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
--- /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
--- /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;
+}
--- /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
--- /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