mbed Geiger counter

Dependencies:   mbed NokiaLCD

Committer:
kanpapa
Date:
Sun Jun 05 06:16:31 2011 +0000
Revision:
1:a03717f88919
Parent:
0:72fdbcde2fa0
beta version

Who changed what in which revision?

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