MARMEX_OB_oled with Japanese font

Dependencies:   NokiaLCD

Dependents:   MARMEX_OB_oled_J_Helloworld mbed_strscroll

Committer:
diasea
Date:
Sat Feb 16 15:12:52 2013 +0000
Revision:
1:1106831b0509
Parent:
0:9adb08a2910c
modify  SPI_FREQUENCY = 16000000

Who changed what in which revision?

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