MARMEX_VB test application program. This application works on "mbed NXP LPC1768" only. This application expects to have the MARMEX_VB module on a "MAPLE mini type-B (MARM03-BASE)" baseboard (slot2) with MARMEX_OB module (on slot1)

Dependencies:   MARMEX_VB NokiaLCD mbed

This is the library test program.
The program can test features of the library (refer to MARMEX-VB's API document) and can save captured data into BMP file.

Warning!

This test program can run on "mbed NXP LPC1768" only.

/media/uploads/nxpfan/dsc_0506_-1-.jpg
Picture : sample of test program operation
The modules of MARMEX-VB and MARMEX-OB are set on the "MAPLE mini type-B (MARM03-BASE)" baseboard.
The image data from camera is mirrored and alpha graphics added by software.

Committer:
nxpfan
Date:
Thu Jun 19 12:21:50 2014 +0000
Revision:
7:125538c50c22
Parent:
5:ac4f0c5d1c6f
Child:
8:86aae677a68b
optimized SPI : FIFO

Who changed what in which revision?

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