A "Hello" program for MARMEX_VB library. This application may work 40pin type mbed platforms ;) This application expects to have the MARMEX_VB module on a "MAPLE mini type-B (MARM03-BASE)" baseboard (slot2) with a MARMEX_OB module (on slot1)

Dependencies:   MARMEX_VB NokiaLCD mbed

Sample code for MARMEX-VB (MARY-VB) camera module.
/media/uploads/nxpfan/dsc_0497s.png

This is a very simple program just copies the data from camera to OELD.
/media/uploads/nxpfan/dsc_0513.jpg

Committer:
nxpfan
Date:
Fri Jun 20 09:19:00 2014 +0000
Revision:
2:7294334432d4
Parent:
1:715bb00d7008
sample code with latest libraries (SPI-FIFO optimize option version)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nxpfan 0:139f0c46d0fd 1 /** MARMEX_OB OLED screen drawing library
nxpfan 0:139f0c46d0fd 2 *
nxpfan 0:139f0c46d0fd 3 * @class MARMEX_OB_oled
nxpfan 0:139f0c46d0fd 4 * @author tedd
nxpfan 2:7294334432d4 5 * @version 0.55 (optimized for "line data transfer")
nxpfan 2:7294334432d4 6 * @date 20-Jun-2014
nxpfan 0:139f0c46d0fd 7 *
nxpfan 0:139f0c46d0fd 8 * Released under the MIT License: http://mbed.org/license/mit
nxpfan 0:139f0c46d0fd 9 *
nxpfan 0:139f0c46d0fd 10 * MARMEX_OB_oled OLED screen drawing library for mbed
nxpfan 0:139f0c46d0fd 11 * This code has been written based on sample code and advises
nxpfan 0:139f0c46d0fd 12 * from Ochiai-san (Marutsu-Elec). Thank you!
nxpfan 0:139f0c46d0fd 13 *
nxpfan 0:139f0c46d0fd 14 * SPI mode:
nxpfan 0:139f0c46d0fd 15 * 9bit or 8bit SPI mode can be selected by disabling/enabling "#define MARMEX_OB_SPI_8BIT_MODE".
nxpfan 0:139f0c46d0fd 16 * See source code in this (MARMEX_OB_oled.h) file.
nxpfan 0:139f0c46d0fd 17 */
nxpfan 0:139f0c46d0fd 18
nxpfan 0:139f0c46d0fd 19 #ifndef MBED_MARMEX_OB_OLED
nxpfan 0:139f0c46d0fd 20 #define MBED_MARMEX_OB_OLED
nxpfan 0:139f0c46d0fd 21
nxpfan 0:139f0c46d0fd 22 #include "mbed.h"
nxpfan 0:139f0c46d0fd 23 #include "NokiaLCD.h"
nxpfan 0:139f0c46d0fd 24
nxpfan 2:7294334432d4 25 //#define LINE_WRITE_OPT NO_OPTIMIZATION
nxpfan 2:7294334432d4 26 //#define LINE_WRITE_OPT LOOP_UNROLL
nxpfan 2:7294334432d4 27 #define LINE_WRITE_OPT USING_SSP_FIFO
nxpfan 2:7294334432d4 28
nxpfan 2:7294334432d4 29 /* Setting for "LINE_WRITE_OPT == USING_SSP_FIFO"
nxpfan 2:7294334432d4 30 * Choose one line from next 3 lines when the FIFO option is taken
nxpfan 2:7294334432d4 31 */
nxpfan 2:7294334432d4 32 #define SSP_AUTO_SELECTION // for demo setup on "MAPLE mini type-B (MARM03-BASE)" baseboard (slot2) with a MARMEX_OB module (on slot1)
nxpfan 2:7294334432d4 33 //#define SSP_USE_SSP0
nxpfan 2:7294334432d4 34 //#define SSP_USE_SSP1
nxpfan 2:7294334432d4 35
nxpfan 2:7294334432d4 36
nxpfan 2:7294334432d4 37
nxpfan 0:139f0c46d0fd 38 /** @def MARMEX_OB_SPI_8BIT_MODE
nxpfan 0:139f0c46d0fd 39 *
nxpfan 0:139f0c46d0fd 40 * MARMEX_OB_oled_oled OLED screen SPI access length setting
nxpfan 0:139f0c46d0fd 41 * Enabling "MARMEX_OB_SPI_8BIT_MODE" makes 9bit SPI access by 8bit * 2 times.
nxpfan 0:139f0c46d0fd 42 * This may be useful if other 8bit access SPI device on same SPI bus.
nxpfan 0:139f0c46d0fd 43 *
nxpfan 0:139f0c46d0fd 44 * If disabled (just coment out the "#define MARMEX_OB_SPI_8BIT_MODE"), SPI access willbe done by 9 bit format.
nxpfan 0:139f0c46d0fd 45 */
nxpfan 0:139f0c46d0fd 46 //#define MARMEX_OB_SPI_8BIT_MODE
nxpfan 0:139f0c46d0fd 47
nxpfan 0:139f0c46d0fd 48 /** MARMEX_OB_oled OLED screen drawing class
nxpfan 0:139f0c46d0fd 49 *
nxpfan 0:139f0c46d0fd 50 * This is a driver code for MARMEX_OB_oled board OLED screen.
nxpfan 0:139f0c46d0fd 51 * This class inherits NokiaLCD class of mbed.org.
nxpfan 0:139f0c46d0fd 52 * To use this class, import the NokiaLCD class from here..
nxpfan 0:139f0c46d0fd 53 * http://mbed.org/users/simon/libraries/NokiaLCD/
nxpfan 0:139f0c46d0fd 54 *
nxpfan 0:139f0c46d0fd 55 * Example:
nxpfan 0:139f0c46d0fd 56 * @code
nxpfan 0:139f0c46d0fd 57 * #include "mbed.h"
nxpfan 0:139f0c46d0fd 58 * #include "MARMEX_OB_oled.h"
nxpfan 0:139f0c46d0fd 59 *
nxpfan 0:139f0c46d0fd 60 * // oled1 is for MARMEX_OB_oled board on MAPLE slot 1
nxpfan 0:139f0c46d0fd 61 * // oled2 is for MARMEX_OB_oled board on MAPLE slot 2
nxpfan 0:139f0c46d0fd 62 *
nxpfan 0:139f0c46d0fd 63 * //MARMEX_OB_oled oled1( p5, p7, p8, p30, p11 ); // mosi, sclk, cs, rst, power_control
nxpfan 0:139f0c46d0fd 64 * MARMEX_OB_oled oled2( p5, p7, p26, p21, p17 ); // mosi, sclk, cs, rst, power_control
nxpfan 0:139f0c46d0fd 65 *
nxpfan 0:139f0c46d0fd 66 * int main() {
nxpfan 0:139f0c46d0fd 67 * oled2.background( 0x000000 );
nxpfan 0:139f0c46d0fd 68 * oled2.cls();
nxpfan 0:139f0c46d0fd 69 *
nxpfan 0:139f0c46d0fd 70 * for ( int i = 0; i < 8; i++ )
nxpfan 0:139f0c46d0fd 71 * oled2.fill( (MARMEX_OB_oled::WIDTH / 8) * i, 0, (MARMEX_OB_oled::WIDTH / 8), 128, ((i & 0x4) ? 0xFF0000 : 0x000000) | ((i & 0x2) ? 0x00FF00 : 0x000000) |((i & 0x1) ? 0x0000FF : 0x000000) );
nxpfan 0:139f0c46d0fd 72 *
nxpfan 0:139f0c46d0fd 73 * oled2.fill( 50, 50, 64, 64, 0xCCCCCC );
nxpfan 0:139f0c46d0fd 74 *
nxpfan 0:139f0c46d0fd 75 * oled2.locate( 0, 3 );
nxpfan 0:139f0c46d0fd 76 * oled2.printf( "Hello World!" );
nxpfan 0:139f0c46d0fd 77 * oled2.locate( 0, 4 );
nxpfan 0:139f0c46d0fd 78 * oled2.printf( "SPI = %s", MERMEX_OB_SPI_MODE_STR );
nxpfan 0:139f0c46d0fd 79 *
nxpfan 0:139f0c46d0fd 80 * for (int i = 0; i < MARMEX_OB_oled::WIDTH; i++ ) {
nxpfan 0:139f0c46d0fd 81 * oled2.pixel( i, 80 + sin( (float)i / 5.0 ) * 10, 0x000000 );
nxpfan 0:139f0c46d0fd 82 * }
nxpfan 0:139f0c46d0fd 83 * }
nxpfan 0:139f0c46d0fd 84 * @endcode
nxpfan 0:139f0c46d0fd 85 */
nxpfan 0:139f0c46d0fd 86
nxpfan 0:139f0c46d0fd 87 class MARMEX_OB_oled : public NokiaLCD
nxpfan 0:139f0c46d0fd 88 {
nxpfan 0:139f0c46d0fd 89
nxpfan 0:139f0c46d0fd 90 public:
nxpfan 0:139f0c46d0fd 91
nxpfan 0:139f0c46d0fd 92 /** General parameters for MARMEX_OB_oled */
nxpfan 0:139f0c46d0fd 93 enum {
nxpfan 0:139f0c46d0fd 94 ROWS = 15, /**< # of rows (lines) for displaying characters */
nxpfan 0:139f0c46d0fd 95 COLS = 16, /**< # of columns (width) for displaying characters */
nxpfan 0:139f0c46d0fd 96 WIDTH = 128, /**< screen width [pixels] */
nxpfan 0:139f0c46d0fd 97 HEIGHT = 128, /**< screen height [pixels] */
nxpfan 0:139f0c46d0fd 98 SPI_FREQUENCY = 12000000 /**< SPI (sclk) SPI_FREQUENCY */
nxpfan 0:139f0c46d0fd 99 };
nxpfan 0:139f0c46d0fd 100
nxpfan 0:139f0c46d0fd 101 /** Constants for power() function */
nxpfan 0:139f0c46d0fd 102 enum {
nxpfan 0:139f0c46d0fd 103 OFF = 0, /**< : to turning-OFF */
nxpfan 0:139f0c46d0fd 104 ON /**< : to turning-ON */
nxpfan 0:139f0c46d0fd 105 };
nxpfan 0:139f0c46d0fd 106
nxpfan 0:139f0c46d0fd 107 /** Create a MARMEX_OB_oled object connected to specified SPI and DigitalOut pins
nxpfan 0:139f0c46d0fd 108 *
nxpfan 0:139f0c46d0fd 109 * @param mosi SPI-MOSI pin (for MAPLE board, use p5)
nxpfan 0:139f0c46d0fd 110 * @param sclk SPI-SCLK pin (for MAPLE board, use p8)
nxpfan 0:139f0c46d0fd 111 * @param cs chip select signal (for MAPLE board, use p8(slot1), p26(slot2))
nxpfan 0:139f0c46d0fd 112 * @param rst reset signal (for MAPLE board, use p30(slot1), p21(slot2))
nxpfan 0:139f0c46d0fd 113 * @param power_pin backlight power control signal (for MAPLE board, use p11(slot1), p17(slot2))
nxpfan 0:139f0c46d0fd 114 *
nxpfan 0:139f0c46d0fd 115 * Example of MARMEX_OB_oled on MAPLE board:
nxpfan 0:139f0c46d0fd 116 * @code
nxpfan 0:139f0c46d0fd 117 * #include "mbed.h"
nxpfan 0:139f0c46d0fd 118 * #include "MARMEX_OB_oled.h"
nxpfan 0:139f0c46d0fd 119 *
nxpfan 0:139f0c46d0fd 120 * MARMEX_OB_oled oled_on_maple_slot1( p5, p7, p8, p30, p11 ); // mosi, sclk, cs, rst, power_control
nxpfan 0:139f0c46d0fd 121 * MARMEX_OB_oled oled_on_maple_slot2( p5, p7, p26, p21, p17 ); // mosi, sclk, cs, rst, power_control
nxpfan 0:139f0c46d0fd 122 * ...
nxpfan 0:139f0c46d0fd 123 * ..
nxpfan 0:139f0c46d0fd 124 * @endcode
nxpfan 0:139f0c46d0fd 125 */
nxpfan 0:139f0c46d0fd 126
nxpfan 0:139f0c46d0fd 127 MARMEX_OB_oled( PinName mosi, PinName sclk, PinName cs, PinName rst, PinName power_pin ) : NokiaLCD( mosi, sclk, cs, rst, NokiaLCD::LCD6100 ), _power_pin( power_pin ) {
nxpfan 0:139f0c46d0fd 128 power( ON );
nxpfan 0:139f0c46d0fd 129 reset();
nxpfan 0:139f0c46d0fd 130 }
nxpfan 0:139f0c46d0fd 131
nxpfan 0:139f0c46d0fd 132 #if DOXYGEN_ONLY
nxpfan 0:139f0c46d0fd 133 /** Write a character to the LCD
nxpfan 0:139f0c46d0fd 134 *
nxpfan 0:139f0c46d0fd 135 * @param c The character to write to the display
nxpfan 0:139f0c46d0fd 136 */
nxpfan 0:139f0c46d0fd 137 int putc( int c );
nxpfan 0:139f0c46d0fd 138
nxpfan 0:139f0c46d0fd 139 /** Write a formated string to the LCD
nxpfan 0:139f0c46d0fd 140 *
nxpfan 0:139f0c46d0fd 141 * @param format A printf-style format string, followed by the
nxpfan 0:139f0c46d0fd 142 * variables to use in formating the string.
nxpfan 0:139f0c46d0fd 143 *
nxpfan 0:139f0c46d0fd 144 * !!! 16th character in the string will be disappeared
nxpfan 0:139f0c46d0fd 145 * !!! This problem is due to difference of screen size NokiaLCD library and its internal mechanism...
nxpfan 0:139f0c46d0fd 146 */
nxpfan 0:139f0c46d0fd 147 int printf( const char* format, ... );
nxpfan 0:139f0c46d0fd 148
nxpfan 0:139f0c46d0fd 149 /** Set the foreground colour
nxpfan 0:139f0c46d0fd 150 *
nxpfan 0:139f0c46d0fd 151 * @param c 24-bit colour
nxpfan 0:139f0c46d0fd 152 */
nxpfan 0:139f0c46d0fd 153 void foreground(int c);
nxpfan 0:139f0c46d0fd 154
nxpfan 0:139f0c46d0fd 155 /** Set the background colour
nxpfan 0:139f0c46d0fd 156 *
nxpfan 0:139f0c46d0fd 157 * @param c 24-bit colour
nxpfan 0:139f0c46d0fd 158 */
nxpfan 0:139f0c46d0fd 159 void background(int c);
nxpfan 0:139f0c46d0fd 160
nxpfan 0:139f0c46d0fd 161 #endif
nxpfan 0:139f0c46d0fd 162
nxpfan 0:139f0c46d0fd 163 /** reset MARMEX_OB_oled
nxpfan 0:139f0c46d0fd 164 *
nxpfan 0:139f0c46d0fd 165 * Executes hardware reset and initialize.
nxpfan 0:139f0c46d0fd 166 * See MARMEX_OB_oled manual for the initialization sequence and values
nxpfan 0:139f0c46d0fd 167 * For gamma correction table, using math function to make the code simple
nxpfan 0:139f0c46d0fd 168 */
nxpfan 0:139f0c46d0fd 169
nxpfan 0:139f0c46d0fd 170 void reset( void ) {
nxpfan 0:139f0c46d0fd 171
nxpfan 0:139f0c46d0fd 172 #define GAMMA_LUT_SIZE 63
nxpfan 0:139f0c46d0fd 173 unsigned char gamma_LUT[ GAMMA_LUT_SIZE ];
nxpfan 0:139f0c46d0fd 174
nxpfan 0:139f0c46d0fd 175 for ( int i = 0; i < GAMMA_LUT_SIZE; i++ )
nxpfan 0:139f0c46d0fd 176 gamma_LUT[ i ] = (unsigned char)(powf( ((float)i / 62.0), (1.0 / 0.58) ) * 178.0 + 2.0);
nxpfan 0:139f0c46d0fd 177
nxpfan 0:139f0c46d0fd 178 // setup the SPI interface and bring display out of reset
nxpfan 0:139f0c46d0fd 179 _cs = 1;
nxpfan 0:139f0c46d0fd 180 _rst = 0;
nxpfan 0:139f0c46d0fd 181 #ifdef MARMEX_OB_SPI_8BIT_MODE
nxpfan 0:139f0c46d0fd 182 _spi.format( 8 );
nxpfan 0:139f0c46d0fd 183 #else
nxpfan 0:139f0c46d0fd 184 _spi.format( 9 );
nxpfan 0:139f0c46d0fd 185 #endif
nxpfan 0:139f0c46d0fd 186
nxpfan 0:139f0c46d0fd 187 _spi.frequency( SPI_FREQUENCY );
nxpfan 0:139f0c46d0fd 188 wait_ms( 1 );
nxpfan 0:139f0c46d0fd 189 _rst = 1;
nxpfan 0:139f0c46d0fd 190 wait_ms( 1 );
nxpfan 0:139f0c46d0fd 191
nxpfan 0:139f0c46d0fd 192 _cs = 0;
nxpfan 0:139f0c46d0fd 193
nxpfan 0:139f0c46d0fd 194 command( SET_DISPLAY_MODE_ALL_OFF );
nxpfan 0:139f0c46d0fd 195 command( SET_COMMAND_LOCK );
nxpfan 0:139f0c46d0fd 196 data( 0x12 );
nxpfan 0:139f0c46d0fd 197
nxpfan 0:139f0c46d0fd 198 command( SET_COMMAND_LOCK );
nxpfan 0:139f0c46d0fd 199 data( 0xb1 );
nxpfan 0:139f0c46d0fd 200
nxpfan 0:139f0c46d0fd 201 command( SET_SLEEP_MODE_ON );
nxpfan 0:139f0c46d0fd 202
nxpfan 0:139f0c46d0fd 203 command( FRONT_CLOCK_DRIVER_OSC_FREQ );
nxpfan 0:139f0c46d0fd 204 data( 0xF1 );
nxpfan 0:139f0c46d0fd 205
nxpfan 0:139f0c46d0fd 206 command( SET_MUX_RATIO );
nxpfan 0:139f0c46d0fd 207 data( 0x7F );
nxpfan 0:139f0c46d0fd 208
nxpfan 0:139f0c46d0fd 209 command( SET_DISPAY_OFFSET );
nxpfan 0:139f0c46d0fd 210 data( 0x00 );
nxpfan 0:139f0c46d0fd 211
nxpfan 0:139f0c46d0fd 212 command( SET_DISPAY_START_LINE );
nxpfan 0:139f0c46d0fd 213 data( 0x00 );
nxpfan 0:139f0c46d0fd 214
nxpfan 0:139f0c46d0fd 215 command( SET_REMAP_COLOR_DEPTH );
nxpfan 0:139f0c46d0fd 216 data( 0x74 );
nxpfan 0:139f0c46d0fd 217
nxpfan 0:139f0c46d0fd 218 command( SET_GPIO );
nxpfan 0:139f0c46d0fd 219 data( 0x00);
nxpfan 0:139f0c46d0fd 220
nxpfan 0:139f0c46d0fd 221 command( FUNCTION_SELECTION );
nxpfan 0:139f0c46d0fd 222 data( 0x01 );
nxpfan 0:139f0c46d0fd 223
nxpfan 0:139f0c46d0fd 224 command( SET_SEGMENT_LOW_VOLTAGE );
nxpfan 0:139f0c46d0fd 225 data( 0xA0 );
nxpfan 0:139f0c46d0fd 226 data( 0xB5 );
nxpfan 0:139f0c46d0fd 227 data( 0x55 );
nxpfan 0:139f0c46d0fd 228
nxpfan 0:139f0c46d0fd 229 command( SET_CONTRAST_CURRENT_FOR_COLOR_ABC );
nxpfan 0:139f0c46d0fd 230 data( 0xC8 );
nxpfan 0:139f0c46d0fd 231 data( 0x80 );
nxpfan 0:139f0c46d0fd 232 data( 0xC8 );
nxpfan 0:139f0c46d0fd 233
nxpfan 0:139f0c46d0fd 234 command( MASTER_CONTRAST_CURRENT_CONTROL );
nxpfan 0:139f0c46d0fd 235 data( 0x0F );
nxpfan 0:139f0c46d0fd 236
nxpfan 0:139f0c46d0fd 237 command( LOOKUP_TABLE_FOR_GRAYSCALE_PULSE_WIDTH );
nxpfan 0:139f0c46d0fd 238 for ( int i = 0; i < GAMMA_LUT_SIZE; i++ )
nxpfan 0:139f0c46d0fd 239 data( gamma_LUT[ i ] );
nxpfan 0:139f0c46d0fd 240
nxpfan 0:139f0c46d0fd 241 command( SET_RESET_PRECHARGE_PERIOD );
nxpfan 0:139f0c46d0fd 242 data( 0x32 );
nxpfan 0:139f0c46d0fd 243
nxpfan 0:139f0c46d0fd 244 command( ENHANCE_DRIVING_SCHEME_CAPABILITY );
nxpfan 0:139f0c46d0fd 245 data( 0x04 );
nxpfan 0:139f0c46d0fd 246 data( 0x00 );
nxpfan 0:139f0c46d0fd 247 data( 0x00 );
nxpfan 0:139f0c46d0fd 248
nxpfan 0:139f0c46d0fd 249 command( SET_PRECHARGE_VOLTAGE );
nxpfan 0:139f0c46d0fd 250 data( 0x17 );
nxpfan 0:139f0c46d0fd 251
nxpfan 0:139f0c46d0fd 252 command( SET_SECOND_PRECHARGE_VOLTAGE );
nxpfan 0:139f0c46d0fd 253 data( 0x01 );
nxpfan 0:139f0c46d0fd 254
nxpfan 0:139f0c46d0fd 255 command( SET_VCOMH_VOLTAGE );
nxpfan 0:139f0c46d0fd 256 data( 0x05 );
nxpfan 0:139f0c46d0fd 257
nxpfan 0:139f0c46d0fd 258 command( SET_DISPLAY_MODE_RESET );
nxpfan 0:139f0c46d0fd 259
nxpfan 0:139f0c46d0fd 260 #if 0
nxpfan 0:139f0c46d0fd 261 command( SET_COLUMN_ADDRESS );
nxpfan 0:139f0c46d0fd 262 data( 0x00 );
nxpfan 0:139f0c46d0fd 263 data( 0x7F );
nxpfan 0:139f0c46d0fd 264
nxpfan 0:139f0c46d0fd 265 command( SET_ROW_ADDRESS );
nxpfan 0:139f0c46d0fd 266 data( 0x00 );
nxpfan 0:139f0c46d0fd 267 data( 0x7F);
nxpfan 0:139f0c46d0fd 268
nxpfan 0:139f0c46d0fd 269 command( WRITE_RAM_COMMAND );
nxpfan 0:139f0c46d0fd 270 for ( int i = 0; i < WIDTH * HEIGHT; i++ )
nxpfan 0:139f0c46d0fd 271 data( 0x00 );
nxpfan 0:139f0c46d0fd 272 #endif
nxpfan 0:139f0c46d0fd 273 _cs = 1;
nxpfan 0:139f0c46d0fd 274
nxpfan 0:139f0c46d0fd 275 cls();
nxpfan 0:139f0c46d0fd 276 wait_ms( 200 );
nxpfan 0:139f0c46d0fd 277
nxpfan 0:139f0c46d0fd 278 command( SET_SLEEP_MODE_OFF );
nxpfan 0:139f0c46d0fd 279 }
nxpfan 0:139f0c46d0fd 280
nxpfan 0:139f0c46d0fd 281 /** Clear the screen and locate to 0,0 */
nxpfan 0:139f0c46d0fd 282
nxpfan 0:139f0c46d0fd 283 void cls( void ) {
nxpfan 0:139f0c46d0fd 284 fill( 0, 0, WIDTH , HEIGHT, _background );
nxpfan 0:139f0c46d0fd 285 _row = 0;
nxpfan 0:139f0c46d0fd 286 _column = 0;
nxpfan 0:139f0c46d0fd 287 }
nxpfan 0:139f0c46d0fd 288
nxpfan 0:139f0c46d0fd 289 /** Set a pixel on te screen
nxpfan 0:139f0c46d0fd 290 *
nxpfan 0:139f0c46d0fd 291 * @param x horizontal position from left
nxpfan 0:139f0c46d0fd 292 * @param y vertical position from top
nxpfan 0:139f0c46d0fd 293 * @param colour 24-bit colour in format 0x00RRGGBB
nxpfan 0:139f0c46d0fd 294 */
nxpfan 0:139f0c46d0fd 295
nxpfan 0:139f0c46d0fd 296 virtual void pixel( int x, int y, int colour ) {
nxpfan 0:139f0c46d0fd 297 _cs = 0;
nxpfan 0:139f0c46d0fd 298 _window( x, y, 1, 1 );
nxpfan 0:139f0c46d0fd 299 _putp( colour );
nxpfan 0:139f0c46d0fd 300 _cs = 1;
nxpfan 0:139f0c46d0fd 301 }
nxpfan 0:139f0c46d0fd 302
nxpfan 0:139f0c46d0fd 303 /** Fill an area of the screen
nxpfan 0:139f0c46d0fd 304 *
nxpfan 0:139f0c46d0fd 305 * @param x horizontal position from left
nxpfan 0:139f0c46d0fd 306 * @param y vertical position from top
nxpfan 0:139f0c46d0fd 307 * @param width width in pixels
nxpfan 0:139f0c46d0fd 308 * @param height height in pixels
nxpfan 0:139f0c46d0fd 309 * @param colour 24-bit colour in format 0x00RRGGBB
nxpfan 0:139f0c46d0fd 310 */
nxpfan 0:139f0c46d0fd 311
nxpfan 0:139f0c46d0fd 312 void fill( int x, int y, int width, int height, int colour ) {
nxpfan 0:139f0c46d0fd 313 _cs = 0;
nxpfan 0:139f0c46d0fd 314 _window( x, y, width, height );
nxpfan 0:139f0c46d0fd 315
nxpfan 0:139f0c46d0fd 316 for (int i = 0; i < width * height; i++ ) {
nxpfan 0:139f0c46d0fd 317 _putp( colour );
nxpfan 0:139f0c46d0fd 318 }
nxpfan 0:139f0c46d0fd 319
nxpfan 0:139f0c46d0fd 320 _window( 0, 0, WIDTH, HEIGHT );
nxpfan 0:139f0c46d0fd 321 _cs = 1;
nxpfan 0:139f0c46d0fd 322 }
nxpfan 0:139f0c46d0fd 323
nxpfan 0:139f0c46d0fd 324 void blit( int x, int y, int width, int height, const int* colour ) {
nxpfan 0:139f0c46d0fd 325 _cs = 0;
nxpfan 0:139f0c46d0fd 326 _window( x, y, width, height );
nxpfan 0:139f0c46d0fd 327
nxpfan 0:139f0c46d0fd 328 for (int i = 0; i < width * height; i++ ) {
nxpfan 0:139f0c46d0fd 329 _putp( colour[i] );
nxpfan 0:139f0c46d0fd 330 }
nxpfan 0:139f0c46d0fd 331 _window( 0, 0, WIDTH, HEIGHT );
nxpfan 0:139f0c46d0fd 332 _cs = 1;
nxpfan 0:139f0c46d0fd 333 }
nxpfan 0:139f0c46d0fd 334
nxpfan 0:139f0c46d0fd 335 void blit565( int x, int y, int width, int height, short* colour ) {
nxpfan 2:7294334432d4 336
nxpfan 2:7294334432d4 337 // OPTION REFERENCE NUMBER (DO NOT EDIT)
nxpfan 2:7294334432d4 338 #define NO_OPTIMIZATION 0
nxpfan 2:7294334432d4 339 #define LOOP_UNROLL 1
nxpfan 2:7294334432d4 340 #define USING_SSP_FIFO 2
nxpfan 2:7294334432d4 341
nxpfan 0:139f0c46d0fd 342 _window( x, y, width, height );
nxpfan 0:139f0c46d0fd 343
nxpfan 2:7294334432d4 344 #if ( LINE_WRITE_OPT == NO_OPTIMIZATION )
nxpfan 2:7294334432d4 345
nxpfan 2:7294334432d4 346 for (int i = 0; i < width * height; i++ ) {
nxpfan 2:7294334432d4 347 _putp565( colour[i] );
nxpfan 2:7294334432d4 348 }
nxpfan 2:7294334432d4 349
nxpfan 2:7294334432d4 350 #endif
nxpfan 2:7294334432d4 351
nxpfan 2:7294334432d4 352
nxpfan 2:7294334432d4 353 #if ( LINE_WRITE_OPT == LOOP_UNROLL )
nxpfan 0:139f0c46d0fd 354
nxpfan 1:715bb00d7008 355 _cs = 0;
nxpfan 0:139f0c46d0fd 356
nxpfan 1:715bb00d7008 357 for (int i = 0; i < width * height; i += 8 ) {
nxpfan 1:715bb00d7008 358 _spi.write( 0x100 | (*colour >> 8) );
nxpfan 0:139f0c46d0fd 359 _spi.write( 0x100 | *colour++ );
nxpfan 0:139f0c46d0fd 360
nxpfan 1:715bb00d7008 361 _spi.write( 0x100 | (*colour >> 8) );
nxpfan 0:139f0c46d0fd 362 _spi.write( 0x100 | *colour++ );
nxpfan 0:139f0c46d0fd 363
nxpfan 0:139f0c46d0fd 364 _spi.write( 0x100 | (*colour >> 8) );
nxpfan 1:715bb00d7008 365 _spi.write( 0x100 | *colour++ );
nxpfan 0:139f0c46d0fd 366
nxpfan 1:715bb00d7008 367 _spi.write( 0x100 | (*colour >> 8) );
nxpfan 0:139f0c46d0fd 368 _spi.write( 0x100 | *colour++ );
nxpfan 0:139f0c46d0fd 369
nxpfan 0:139f0c46d0fd 370 _spi.write( 0x100 | (*colour >> 8) );
nxpfan 0:139f0c46d0fd 371 _spi.write( 0x100 | *colour++ );
nxpfan 0:139f0c46d0fd 372
nxpfan 0:139f0c46d0fd 373 _spi.write( 0x100 | (*colour >> 8) );
nxpfan 0:139f0c46d0fd 374 _spi.write( 0x100 | *colour++ );
nxpfan 0:139f0c46d0fd 375
nxpfan 0:139f0c46d0fd 376 _spi.write( 0x100 | (*colour >> 8) );
nxpfan 0:139f0c46d0fd 377 _spi.write( 0x100 | *colour++ );
nxpfan 0:139f0c46d0fd 378
nxpfan 0:139f0c46d0fd 379 _spi.write( 0x100 | (*colour >> 8) );
nxpfan 1:715bb00d7008 380 _spi.write( 0x100 | *colour++ );
nxpfan 1:715bb00d7008 381 }
nxpfan 2:7294334432d4 382
nxpfan 2:7294334432d4 383 _cs = 1;
nxpfan 2:7294334432d4 384 #endif
nxpfan 2:7294334432d4 385
nxpfan 2:7294334432d4 386
nxpfan 2:7294334432d4 387 #if ( LINE_WRITE_OPT == USING_SSP_FIFO )
nxpfan 2:7294334432d4 388
nxpfan 2:7294334432d4 389 #define FIFO_DEPTH 4
nxpfan 2:7294334432d4 390
nxpfan 2:7294334432d4 391 #if defined( SSP_AUTO_SELECTION )
nxpfan 2:7294334432d4 392 #if defined( TARGET_MBED_LPC1768 )
nxpfan 2:7294334432d4 393 #define SPI_PORT_SELECTOR LPC_SSP1
nxpfan 2:7294334432d4 394 #elif defined( TARGET_LPC11U35_501 ) || defined( TARGET_LPC11U24_401 )
nxpfan 2:7294334432d4 395 #define SPI_PORT_SELECTOR LPC_SSP0
nxpfan 2:7294334432d4 396 #endif
nxpfan 2:7294334432d4 397 #elif defined( SSP_USE_SSP0 )
nxpfan 2:7294334432d4 398 #define SPI_PORT_SELECTOR LPC_SSP0
nxpfan 2:7294334432d4 399 #elif defined( SSP_USE_SSP1 )
nxpfan 2:7294334432d4 400 #define SPI_PORT_SELECTOR LPC_SSP1
nxpfan 2:7294334432d4 401 #else
nxpfan 2:7294334432d4 402 #error when using FIFO option for the optimization, choose one of definition from SSP_AUTO_SELECTION, SSP_USE_SSP0 or SSP_USE_SSP1
nxpfan 2:7294334432d4 403 #endif // #if defined( SSP_AUTO_SELECTION )
nxpfan 2:7294334432d4 404
nxpfan 2:7294334432d4 405 int length = width * height;
nxpfan 2:7294334432d4 406 char dummy;
nxpfan 2:7294334432d4 407 int n;
nxpfan 2:7294334432d4 408
nxpfan 1:715bb00d7008 409 _cs = 0;
nxpfan 0:139f0c46d0fd 410
nxpfan 2:7294334432d4 411 for(n = (FIFO_DEPTH >> 1); n > 0; n--) {
nxpfan 2:7294334432d4 412 SPI_PORT_SELECTOR->DR = (*colour >> 8) | 0x100;
nxpfan 2:7294334432d4 413 SPI_PORT_SELECTOR->DR = ((*colour++) & 0xFF) | 0x100;
nxpfan 0:139f0c46d0fd 414 }
nxpfan 2:7294334432d4 415
nxpfan 2:7294334432d4 416 do {
nxpfan 2:7294334432d4 417 #pragma diag_suppress 550 // surpressing a warning messase of "Variable "dummy" was set but never used"
nxpfan 2:7294334432d4 418
nxpfan 2:7294334432d4 419 while (!(SPI_PORT_SELECTOR->SR & 0x4));
nxpfan 2:7294334432d4 420 dummy = SPI_PORT_SELECTOR->DR;
nxpfan 2:7294334432d4 421
nxpfan 2:7294334432d4 422 if (n < length - (FIFO_DEPTH >> 1))
nxpfan 2:7294334432d4 423 SPI_PORT_SELECTOR->DR = (*colour >> 8) | 0x100;
nxpfan 2:7294334432d4 424
nxpfan 2:7294334432d4 425 while (!(SPI_PORT_SELECTOR->SR & 0x4));
nxpfan 2:7294334432d4 426 dummy = SPI_PORT_SELECTOR->DR;
nxpfan 2:7294334432d4 427
nxpfan 2:7294334432d4 428 if (n++ < length - (FIFO_DEPTH >> 1))
nxpfan 2:7294334432d4 429 SPI_PORT_SELECTOR->DR = ((*colour++) & 0xFF) | 0x100;
nxpfan 2:7294334432d4 430
nxpfan 2:7294334432d4 431
nxpfan 2:7294334432d4 432 } while(n < length);
nxpfan 0:139f0c46d0fd 433 #endif
nxpfan 0:139f0c46d0fd 434
nxpfan 2:7294334432d4 435 _cs = 1;
nxpfan 0:139f0c46d0fd 436 _window( 0, 0, WIDTH, HEIGHT );
nxpfan 0:139f0c46d0fd 437 }
nxpfan 2:7294334432d4 438
nxpfan 0:139f0c46d0fd 439 void bitblit( int x, int y, int width, int height, const char* bitstream ) {
nxpfan 0:139f0c46d0fd 440 _cs = 0;
nxpfan 0:139f0c46d0fd 441 _window( x, y, width, height );
nxpfan 0:139f0c46d0fd 442
nxpfan 0:139f0c46d0fd 443 for (int i = 0; i < height * width; i++ ) {
nxpfan 0:139f0c46d0fd 444 int byte = i / 8;
nxpfan 0:139f0c46d0fd 445 int bit = i % 8;
nxpfan 0:139f0c46d0fd 446 int colour = ((bitstream[ byte ] << bit) & 0x80) ? _foreground : _background;
nxpfan 0:139f0c46d0fd 447 _putp( colour );
nxpfan 0:139f0c46d0fd 448 }
nxpfan 0:139f0c46d0fd 449 _window( 0, 0, _width, _height );
nxpfan 0:139f0c46d0fd 450 _cs = 1;
nxpfan 0:139f0c46d0fd 451 }
nxpfan 0:139f0c46d0fd 452
nxpfan 0:139f0c46d0fd 453 /** Screen width
nxpfan 0:139f0c46d0fd 454 *
nxpfan 0:139f0c46d0fd 455 * @return screen width [pixel]
nxpfan 0:139f0c46d0fd 456 */
nxpfan 0:139f0c46d0fd 457 int width() {
nxpfan 0:139f0c46d0fd 458 return WIDTH;
nxpfan 0:139f0c46d0fd 459 }
nxpfan 0:139f0c46d0fd 460
nxpfan 0:139f0c46d0fd 461 /** Screen height
nxpfan 0:139f0c46d0fd 462 *
nxpfan 0:139f0c46d0fd 463 * @return screen height [pixel]
nxpfan 0:139f0c46d0fd 464 */
nxpfan 0:139f0c46d0fd 465 int height() {
nxpfan 0:139f0c46d0fd 466 return HEIGHT;
nxpfan 0:139f0c46d0fd 467 }
nxpfan 0:139f0c46d0fd 468 /** Columns
nxpfan 0:139f0c46d0fd 469 *
nxpfan 0:139f0c46d0fd 470 * @return screen columns
nxpfan 0:139f0c46d0fd 471 */
nxpfan 0:139f0c46d0fd 472 int columns() {
nxpfan 0:139f0c46d0fd 473 return COLS;
nxpfan 0:139f0c46d0fd 474 }
nxpfan 0:139f0c46d0fd 475
nxpfan 0:139f0c46d0fd 476 /** Rows
nxpfan 0:139f0c46d0fd 477 *
nxpfan 0:139f0c46d0fd 478 * @return screen rows
nxpfan 0:139f0c46d0fd 479 */
nxpfan 0:139f0c46d0fd 480 int rows() {
nxpfan 0:139f0c46d0fd 481 return ROWS;
nxpfan 0:139f0c46d0fd 482 }
nxpfan 0:139f0c46d0fd 483
nxpfan 0:139f0c46d0fd 484 /** Power switch for OLED backlight
nxpfan 0:139f0c46d0fd 485 *
nxpfan 0:139f0c46d0fd 486 * @param sw argument can be MARMEX_OB_oled::ON or MARMEX_OB_oled::OFF
nxpfan 0:139f0c46d0fd 487 */
nxpfan 0:139f0c46d0fd 488
nxpfan 0:139f0c46d0fd 489 void power( unsigned char sw ) {
nxpfan 0:139f0c46d0fd 490 _power_pin = sw;
nxpfan 0:139f0c46d0fd 491 }
nxpfan 0:139f0c46d0fd 492
nxpfan 0:139f0c46d0fd 493 private:
nxpfan 0:139f0c46d0fd 494 /** Command list for the OLED controller */
nxpfan 0:139f0c46d0fd 495 enum {
nxpfan 0:139f0c46d0fd 496 SET_DISPLAY_MODE_ALL_OFF = 0xA4,
nxpfan 0:139f0c46d0fd 497 SET_COMMAND_LOCK = 0xFD,
nxpfan 0:139f0c46d0fd 498 SET_SLEEP_MODE_ON = 0xAE,
nxpfan 0:139f0c46d0fd 499 FRONT_CLOCK_DRIVER_OSC_FREQ = 0xB3,
nxpfan 0:139f0c46d0fd 500 SET_MUX_RATIO = 0xCA,
nxpfan 0:139f0c46d0fd 501 SET_DISPAY_OFFSET = 0xA2,
nxpfan 0:139f0c46d0fd 502 SET_DISPAY_START_LINE = 0xA1,
nxpfan 0:139f0c46d0fd 503 SET_REMAP_COLOR_DEPTH = 0xA0,
nxpfan 0:139f0c46d0fd 504 SET_GPIO = 0xB5,
nxpfan 0:139f0c46d0fd 505 FUNCTION_SELECTION = 0xAB,
nxpfan 0:139f0c46d0fd 506 SET_SEGMENT_LOW_VOLTAGE = 0xB4,
nxpfan 0:139f0c46d0fd 507 SET_CONTRAST_CURRENT_FOR_COLOR_ABC = 0xC1,
nxpfan 0:139f0c46d0fd 508 MASTER_CONTRAST_CURRENT_CONTROL = 0xC7,
nxpfan 0:139f0c46d0fd 509 LOOKUP_TABLE_FOR_GRAYSCALE_PULSE_WIDTH = 0xB8,
nxpfan 0:139f0c46d0fd 510 SET_RESET_PRECHARGE_PERIOD = 0xB1,
nxpfan 0:139f0c46d0fd 511 ENHANCE_DRIVING_SCHEME_CAPABILITY = 0xB2,
nxpfan 0:139f0c46d0fd 512 SET_PRECHARGE_VOLTAGE = 0xBB,
nxpfan 0:139f0c46d0fd 513 SET_SECOND_PRECHARGE_VOLTAGE = 0xB6,
nxpfan 0:139f0c46d0fd 514 SET_VCOMH_VOLTAGE = 0xBE,
nxpfan 0:139f0c46d0fd 515 SET_DISPLAY_MODE_RESET = 0xA6,
nxpfan 0:139f0c46d0fd 516 SET_COLUMN_ADDRESS = 0x15,
nxpfan 0:139f0c46d0fd 517 SET_ROW_ADDRESS = 0x75,
nxpfan 0:139f0c46d0fd 518 WRITE_RAM_COMMAND = 0x5C,
nxpfan 0:139f0c46d0fd 519 SET_SLEEP_MODE_OFF = 0xAF
nxpfan 0:139f0c46d0fd 520 };
nxpfan 0:139f0c46d0fd 521
nxpfan 0:139f0c46d0fd 522 #ifdef MARMEX_OB_SPI_8BIT_MODE
nxpfan 0:139f0c46d0fd 523 void command( int value ) {
nxpfan 0:139f0c46d0fd 524 int tmp = value & 0x00ff;
nxpfan 0:139f0c46d0fd 525 _cs = 0;
nxpfan 0:139f0c46d0fd 526 _spi.write( tmp >> 1 );
nxpfan 0:139f0c46d0fd 527 _spi.write( tmp << 7 );
nxpfan 0:139f0c46d0fd 528 _cs = 1;
nxpfan 0:139f0c46d0fd 529 }
nxpfan 0:139f0c46d0fd 530
nxpfan 0:139f0c46d0fd 531 void data( int value ) {
nxpfan 0:139f0c46d0fd 532 int tmp = value & 0x00ff;
nxpfan 0:139f0c46d0fd 533 tmp |= 0x0100;
nxpfan 0:139f0c46d0fd 534 _cs = 0;
nxpfan 0:139f0c46d0fd 535 _spi.write( tmp >> 1 );
nxpfan 0:139f0c46d0fd 536 _spi.write( tmp << 7 );
nxpfan 0:139f0c46d0fd 537 _cs = 1;
nxpfan 0:139f0c46d0fd 538 }
nxpfan 0:139f0c46d0fd 539 #else
nxpfan 0:139f0c46d0fd 540 void command( int value ) {
nxpfan 0:139f0c46d0fd 541 _cs = 0;
nxpfan 0:139f0c46d0fd 542 _spi.write( value & 0xFF );
nxpfan 0:139f0c46d0fd 543 _cs = 1;
nxpfan 0:139f0c46d0fd 544 }
nxpfan 0:139f0c46d0fd 545
nxpfan 0:139f0c46d0fd 546 void data(int value) {
nxpfan 0:139f0c46d0fd 547 _cs = 0;
nxpfan 0:139f0c46d0fd 548 _spi.write( value | 0x100 );
nxpfan 0:139f0c46d0fd 549 _cs = 1;
nxpfan 0:139f0c46d0fd 550 }
nxpfan 0:139f0c46d0fd 551 #endif
nxpfan 0:139f0c46d0fd 552
nxpfan 0:139f0c46d0fd 553 virtual void _window( int x, int y, int width, int height ) {
nxpfan 0:139f0c46d0fd 554 int x1 = x + 0;
nxpfan 0:139f0c46d0fd 555 int y1 = y + 0;
nxpfan 0:139f0c46d0fd 556 int x2 = x1 + width - 1;
nxpfan 0:139f0c46d0fd 557 int y2 = y1 + height - 1;
nxpfan 0:139f0c46d0fd 558
nxpfan 0:139f0c46d0fd 559 command( SET_COLUMN_ADDRESS );
nxpfan 0:139f0c46d0fd 560 data( x1 );
nxpfan 0:139f0c46d0fd 561 data( x2 );
nxpfan 0:139f0c46d0fd 562 command( SET_ROW_ADDRESS );
nxpfan 0:139f0c46d0fd 563 data( y1 );
nxpfan 0:139f0c46d0fd 564 data( y2 );
nxpfan 0:139f0c46d0fd 565 command( WRITE_RAM_COMMAND );
nxpfan 0:139f0c46d0fd 566 }
nxpfan 0:139f0c46d0fd 567
nxpfan 0:139f0c46d0fd 568 void window( int x, int y, int width, int height ) {
nxpfan 0:139f0c46d0fd 569 _cs = 0;
nxpfan 0:139f0c46d0fd 570 _window( x, y, width, height );
nxpfan 0:139f0c46d0fd 571 _cs = 1;
nxpfan 0:139f0c46d0fd 572 }
nxpfan 0:139f0c46d0fd 573
nxpfan 0:139f0c46d0fd 574 virtual void _putp( int colour ) {
nxpfan 0:139f0c46d0fd 575 int cnv = 0;
nxpfan 0:139f0c46d0fd 576
nxpfan 0:139f0c46d0fd 577 cnv = (colour >> 8) & 0xf800;
nxpfan 0:139f0c46d0fd 578 cnv |= (colour >> 5) & 0x07e0;
nxpfan 0:139f0c46d0fd 579 cnv |= (colour >> 3) & 0x001f;
nxpfan 0:139f0c46d0fd 580
nxpfan 0:139f0c46d0fd 581 data( cnv >> 8);
nxpfan 0:139f0c46d0fd 582 data( cnv );
nxpfan 0:139f0c46d0fd 583 }
nxpfan 0:139f0c46d0fd 584 virtual void _putp565( short colour ) {
nxpfan 0:139f0c46d0fd 585 data( colour >> 8);
nxpfan 0:139f0c46d0fd 586 data( colour );
nxpfan 0:139f0c46d0fd 587 }
nxpfan 0:139f0c46d0fd 588
nxpfan 0:139f0c46d0fd 589 DigitalOut _power_pin;
nxpfan 0:139f0c46d0fd 590 }
nxpfan 0:139f0c46d0fd 591 ;
nxpfan 0:139f0c46d0fd 592
nxpfan 0:139f0c46d0fd 593 #ifdef MARMEX_OB_SPI_8BIT_MODE
nxpfan 0:139f0c46d0fd 594 #define MERMEX_OB_SPI_MODE_STR "8bit mode"
nxpfan 0:139f0c46d0fd 595 #else
nxpfan 0:139f0c46d0fd 596 #define MERMEX_OB_SPI_MODE_STR "9bit mode"
nxpfan 0:139f0c46d0fd 597 #endif
nxpfan 0:139f0c46d0fd 598 #endif // MBED_MARMEX_OB_OLED
nxpfan 0:139f0c46d0fd 599
nxpfan 0:139f0c46d0fd 600
nxpfan 0:139f0c46d0fd 601