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 with Japanese font
diasea 0:9adb08a2910c 2 *
diasea 0:9adb08a2910c 3 * @class MARMEX_OB_oled_J
diasea 0:9adb08a2910c 4 * @author dia
diasea 0:9adb08a2910c 5 * @version 0.1
diasea 0:9adb08a2910c 6 * @date 01-Feb-2013
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 with Japanese font for mbed
diasea 0:9adb08a2910c 11 *
diasea 0:9adb08a2910c 12 * special thanks
diasea 0:9adb08a2910c 13 * ref http://mbed.org/users/nxpfan/notebook/MARMEX_OB_oled_lib/
diasea 0:9adb08a2910c 14 * ref http://mbed.org/users/s_s_s/notebook/mary-ob%E7%94%A8%E3%81%AE%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%83%BC/
diasea 0:9adb08a2910c 15 * ref http://mbed.org/users/kanpapa/notebook/mary-oled-board/
diasea 0:9adb08a2910c 16 * ref http://www.geocities.jp/littlimi/misaki.htm
diasea 0:9adb08a2910c 17 */
diasea 0:9adb08a2910c 18
diasea 0:9adb08a2910c 19 #ifndef MBED_MARMEX_OB_OLED_J
diasea 0:9adb08a2910c 20 #define MBED_MARMEX_OB_OLED_J
diasea 0:9adb08a2910c 21
diasea 0:9adb08a2910c 22 #define countof(x) ( sizeof(x) / sizeof(x[0]) ) //for Japanese
diasea 0:9adb08a2910c 23
diasea 0:9adb08a2910c 24 #include "mbed.h"
diasea 0:9adb08a2910c 25 #include "MARMEX_OB_oled.h"
diasea 0:9adb08a2910c 26 #include "small_font.h"
diasea 0:9adb08a2910c 27
diasea 0:9adb08a2910c 28 /** MARMEX_OB_oled OLED screen drawing with Japanese class
diasea 0:9adb08a2910c 29 *
diasea 0:9adb08a2910c 30 * This is a driver code for MARMEX_OB_oled board OLED screen with Japanese.
diasea 0:9adb08a2910c 31 * This class inherits MARMEX_OB_oled.h of mbed.org.
diasea 0:9adb08a2910c 32 * To use this class, import MARMEX_OB_oled.h from here..
diasea 0:9adb08a2910c 33 * http://mbed.org/users/nxpfan/notebook/MARMEX_OB_oled_lib/
diasea 0:9adb08a2910c 34 *
diasea 0:9adb08a2910c 35 * Example:
diasea 0:9adb08a2910c 36 * @code
diasea 0:9adb08a2910c 37 * #include "mbed.h"
diasea 0:9adb08a2910c 38 * #include "MARMEX_OB_oled_J.h"
diasea 0:9adb08a2910c 39 *
diasea 0:9adb08a2910c 40 * MARMEX_OB_oled_J oled( p5, p7, p27, p24, p26 ); // mosi, sclk, cs, rst, power_control
diasea 0:9adb08a2910c 41 *
diasea 0:9adb08a2910c 42 * LocalFileSystem local("local");
diasea 0:9adb08a2910c 43 *
diasea 0:9adb08a2910c 44 * void lfTrim(char* text) {
diasea 0:9adb08a2910c 45 * char *p;
diasea 0:9adb08a2910c 46 * p = strchr( text, '\n' );
diasea 0:9adb08a2910c 47 * if ( p != NULL )
diasea 0:9adb08a2910c 48 * {
diasea 0:9adb08a2910c 49 * *p = '\0';
diasea 0:9adb08a2910c 50 * }
diasea 0:9adb08a2910c 51 * }
diasea 0:9adb08a2910c 52 *
diasea 0:9adb08a2910c 53 * int main() {
diasea 0:9adb08a2910c 54 * FILE *fp;
diasea 0:9adb08a2910c 55 * char *filename = "/local/load.txt";
diasea 0:9adb08a2910c 56 * if((fp = fopen(filename, "r")) == NULL){
diasea 0:9adb08a2910c 57 * printf("Error: %s could not open.", filename);
diasea 0:9adb08a2910c 58 * return 1;
diasea 0:9adb08a2910c 59 * }
diasea 0:9adb08a2910c 60 *
diasea 0:9adb08a2910c 61 * char text[20];
diasea 0:9adb08a2910c 62 *
diasea 0:9adb08a2910c 63 * oled.cls();
diasea 0:9adb08a2910c 64 * oled.locate(0,0); oled.fontsize(1,1);oled.foreground(0x00FFFFFF); oled.printf("ABC:123");
diasea 0:9adb08a2910c 65 * oled.locate(0,1); oled.fontsize(2,1);oled.foreground(0x00FF0000); oled.printf("ABC:123");
diasea 0:9adb08a2910c 66 * if(fgets(text, 20, fp ) != NULL) {
diasea 0:9adb08a2910c 67 * lfTrim(text);
diasea 0:9adb08a2910c 68 * oled.locate(0,1); oled.fontsize(1,2);oled.foreground(0x0000FF00); oled.printf("%s", text);
diasea 0:9adb08a2910c 69 * }
diasea 0:9adb08a2910c 70 * if(fgets(text, 20, fp ) != NULL) {
diasea 0:9adb08a2910c 71 * lfTrim(text);
diasea 0:9adb08a2910c 72 * oled.locate(0,4); oled.fontsize(2,1);oled.foreground(0x000000FF); oled.printf("%s", text);
diasea 0:9adb08a2910c 73 * }
diasea 0:9adb08a2910c 74 * if(fgets(text, 20, fp ) != NULL) {
diasea 0:9adb08a2910c 75 * lfTrim(text);
diasea 0:9adb08a2910c 76 * oled.locate(0,3); oled.fontsize(2,2);oled.foreground(0x0000FFFF); oled.printf("%s", text);
diasea 0:9adb08a2910c 77 * }
diasea 0:9adb08a2910c 78 * if(fgets(text, 20, fp ) != NULL) {
diasea 0:9adb08a2910c 79 * lfTrim(text);
diasea 0:9adb08a2910c 80 * oled.locate(0,3); oled.fontsize(3,3);oled.foreground(0x00FF00FF); oled.printf("%s", text);
diasea 0:9adb08a2910c 81 * }
diasea 0:9adb08a2910c 82 * fclose(fp);
diasea 0:9adb08a2910c 83 * }
diasea 0:9adb08a2910c 84 */
diasea 0:9adb08a2910c 85
diasea 0:9adb08a2910c 86 class MARMEX_OB_oled_J : public MARMEX_OB_oled {
diasea 0:9adb08a2910c 87
diasea 0:9adb08a2910c 88 public:
diasea 0:9adb08a2910c 89
diasea 0:9adb08a2910c 90
diasea 0:9adb08a2910c 91 /** Create a MARMEX_OB_oled_J object connected to specified SPI and DigitalOut pins
diasea 0:9adb08a2910c 92 *
diasea 0:9adb08a2910c 93 * @param mosi SPI-MOSI pin (for MAPLE board, use p5)
diasea 0:9adb08a2910c 94 * @param sclk SPI-SCLK pin (for MAPLE board, use p8)
diasea 0:9adb08a2910c 95 * @param cs chip select signal (for MAPLE board, use p8(slot1), p26(slot2))
diasea 0:9adb08a2910c 96 * @param rst reset signal (for MAPLE board, use p30(slot1), p21(slot2))
diasea 0:9adb08a2910c 97 * @param power_pin backlight power control signal (for MAPLE board, use p11(slot1), p17(slot2))
diasea 0:9adb08a2910c 98 *
diasea 0:9adb08a2910c 99 * Example of MARMEX_OB_oled on MAPLE board:
diasea 0:9adb08a2910c 100 * @code
diasea 0:9adb08a2910c 101 * #include "mbed.h"
diasea 0:9adb08a2910c 102 * #include "MARMEX_OB_oled.h"
diasea 0:9adb08a2910c 103 *
diasea 0:9adb08a2910c 104 * MARMEX_OB_oled_J oled( p5, p7, p8, p30, p11 ); // mosi, sclk, cs, rst, power_control
diasea 0:9adb08a2910c 105 * MARMEX_OB_oled_J oled( p5, p7, p26, p21, p17 ); // mosi, sclk, cs, rst, power_control
diasea 0:9adb08a2910c 106 * ...
diasea 0:9adb08a2910c 107 * ..
diasea 0:9adb08a2910c 108 * @endcode
diasea 0:9adb08a2910c 109 */
diasea 0:9adb08a2910c 110
diasea 0:9adb08a2910c 111 MARMEX_OB_oled_J( PinName mosi, PinName sclk, PinName cs, PinName rst, PinName power_pin ) : MARMEX_OB_oled( mosi, sclk, cs, rst, power_pin ) {
diasea 0:9adb08a2910c 112 kstate = false; // for Japanese
diasea 0:9adb08a2910c 113 _font_width_size = 1; //1:8x8 2:16x16 ... for Japanese
diasea 0:9adb08a2910c 114 _font_height_size = 1; //1:8x8 2:16x16 ... for Japanese
diasea 0:9adb08a2910c 115 power( ON );
diasea 0:9adb08a2910c 116 reset();
diasea 0:9adb08a2910c 117 }
diasea 0:9adb08a2910c 118
diasea 0:9adb08a2910c 119 #if DOXYGEN_ONLY
diasea 0:9adb08a2910c 120 /** Write a character to the LCD
diasea 0:9adb08a2910c 121 *
diasea 0:9adb08a2910c 122 * @param c The character to write to the display
diasea 0:9adb08a2910c 123 */
diasea 0:9adb08a2910c 124 int putc( int c );
diasea 0:9adb08a2910c 125
diasea 0:9adb08a2910c 126 /** Write a formated string to the LCD
diasea 0:9adb08a2910c 127 *
diasea 0:9adb08a2910c 128 * @param format A printf-style format string, followed by the
diasea 0:9adb08a2910c 129 * variables to use in formating the string.
diasea 0:9adb08a2910c 130 *
diasea 0:9adb08a2910c 131 * !!! 16th character in the string will be disappeared
diasea 0:9adb08a2910c 132 * !!! This problem is due to difference of screen size NokiaLCD library and its internal mechanism...
diasea 0:9adb08a2910c 133 */
diasea 0:9adb08a2910c 134 int printf( const char* format, ... );
diasea 0:9adb08a2910c 135
diasea 0:9adb08a2910c 136 /** Set the foreground colour
diasea 0:9adb08a2910c 137 *
diasea 0:9adb08a2910c 138 * @param c 24-bit colour
diasea 0:9adb08a2910c 139 */
diasea 0:9adb08a2910c 140 void foreground(int c);
diasea 0:9adb08a2910c 141
diasea 0:9adb08a2910c 142 /** Set the background colour
diasea 0:9adb08a2910c 143 *
diasea 0:9adb08a2910c 144 * @param c 24-bit colour
diasea 0:9adb08a2910c 145 */
diasea 0:9adb08a2910c 146 void background(int c);
diasea 0:9adb08a2910c 147
diasea 0:9adb08a2910c 148 /** Locate to a screen column and row
diasea 0:9adb08a2910c 149 *
diasea 0:9adb08a2910c 150 * @param column The horizontal position from the left, indexed from 0
diasea 0:9adb08a2910c 151 * @param row The vertical position from the top, indexed from 0
diasea 0:9adb08a2910c 152 */
diasea 0:9adb08a2910c 153 void locate(int column, int row);
diasea 0:9adb08a2910c 154
diasea 0:9adb08a2910c 155 /** reset MARMEX_OB_oled
diasea 0:9adb08a2910c 156 *
diasea 0:9adb08a2910c 157 * Executes hardware reset and initialize.
diasea 0:9adb08a2910c 158 * See MARMEX_OB_oled manual for the initialization sequence and values
diasea 0:9adb08a2910c 159 * For gamma correction table, using math function to make the code simple
diasea 0:9adb08a2910c 160 */
diasea 0:9adb08a2910c 161 void reset( void );
diasea 0:9adb08a2910c 162
diasea 0:9adb08a2910c 163 /** Clear the screen and locate to 0,0 */
diasea 0:9adb08a2910c 164 void cls( void );
diasea 0:9adb08a2910c 165
diasea 0:9adb08a2910c 166 /** Set a pixel on te screen
diasea 0:9adb08a2910c 167 *
diasea 0:9adb08a2910c 168 * @param x horizontal position from left
diasea 0:9adb08a2910c 169 * @param y vertical position from top
diasea 0:9adb08a2910c 170 * @param colour 24-bit colour in format 0x00RRGGBB
diasea 0:9adb08a2910c 171 */
diasea 0:9adb08a2910c 172 virtual void pixel( int x, int y, int colour );
diasea 0:9adb08a2910c 173
diasea 0:9adb08a2910c 174 /** Fill an area of the screen
diasea 0:9adb08a2910c 175 *
diasea 0:9adb08a2910c 176 * @param x horizontal position from left
diasea 0:9adb08a2910c 177 * @param y vertical position from top
diasea 0:9adb08a2910c 178 * @param width width in pixels
diasea 0:9adb08a2910c 179 * @param height height in pixels
diasea 0:9adb08a2910c 180 * @param colour 24-bit colour in format 0x00RRGGBB
diasea 0:9adb08a2910c 181 */
diasea 0:9adb08a2910c 182 void fill( int x, int y, int width, int height, int colour );
diasea 0:9adb08a2910c 183
diasea 0:9adb08a2910c 184 void blit( int x, int y, int width, int height, const int* colour );
diasea 0:9adb08a2910c 185
diasea 0:9adb08a2910c 186
diasea 0:9adb08a2910c 187 /** Screen width
diasea 0:9adb08a2910c 188 *
diasea 0:9adb08a2910c 189 * @return screen width [pixel]
diasea 0:9adb08a2910c 190 */
diasea 0:9adb08a2910c 191 int width();
diasea 0:9adb08a2910c 192
diasea 0:9adb08a2910c 193 /** Screen height
diasea 0:9adb08a2910c 194 *
diasea 0:9adb08a2910c 195 * @return screen height [pixel]
diasea 0:9adb08a2910c 196 */
diasea 0:9adb08a2910c 197 int height();
diasea 0:9adb08a2910c 198
diasea 0:9adb08a2910c 199 /** Columns
diasea 0:9adb08a2910c 200 *
diasea 0:9adb08a2910c 201 * @return screen columns
diasea 0:9adb08a2910c 202 */
diasea 0:9adb08a2910c 203 int columns();
diasea 0:9adb08a2910c 204
diasea 0:9adb08a2910c 205 /** Rows
diasea 0:9adb08a2910c 206 *
diasea 0:9adb08a2910c 207 * @return screen rows
diasea 0:9adb08a2910c 208 */
diasea 0:9adb08a2910c 209 int rows();
diasea 0:9adb08a2910c 210
diasea 0:9adb08a2910c 211 /** Power switch for OLED backlight
diasea 0:9adb08a2910c 212 *
diasea 0:9adb08a2910c 213 * @param sw argument can be MARMEX_OB_oled::ON or MARMEX_OB_oled::OFF
diasea 0:9adb08a2910c 214 */
diasea 0:9adb08a2910c 215 void power( unsigned char sw );
diasea 0:9adb08a2910c 216
diasea 0:9adb08a2910c 217 #endif
diasea 0:9adb08a2910c 218
diasea 0:9adb08a2910c 219 /** font size
diasea 0:9adb08a2910c 220 * void Moled::fontsize(int yoko,int tate){
diasea 0:9adb08a2910c 221 *
diasea 0:9adb08a2910c 222 * @param _font_width The vertical multiply factor
diasea 0:9adb08a2910c 223 * @param _font_height The horizotal multiply factor
diasea 0:9adb08a2910c 224 */
diasea 0:9adb08a2910c 225 void fontsize(int fontsize_width,int fontsize_height){
diasea 0:9adb08a2910c 226 _font_width_size=fontsize_width;
diasea 0:9adb08a2910c 227 _font_height_size=fontsize_height;
diasea 0:9adb08a2910c 228 }
diasea 0:9adb08a2910c 229
diasea 0:9adb08a2910c 230 unsigned int findface(unsigned short c) {
diasea 0:9adb08a2910c 231 unsigned int p = 0;
diasea 0:9adb08a2910c 232 int i, sum;
diasea 0:9adb08a2910c 233 for (sum = i = 0; i < countof(font8table); i++) {
diasea 0:9adb08a2910c 234 if (font8table[i].start <= c && c <= font8table[i].end) {
diasea 0:9adb08a2910c 235 p = (sum + c - font8table[i].start);
diasea 0:9adb08a2910c 236 break;
diasea 0:9adb08a2910c 237 }
diasea 0:9adb08a2910c 238 sum += font8table[i].end - font8table[i].start + 1;
diasea 0:9adb08a2910c 239 }
diasea 0:9adb08a2910c 240 return p;
diasea 0:9adb08a2910c 241 }
diasea 0:9adb08a2910c 242
diasea 0:9adb08a2910c 243 virtual int _putc(int value) {
diasea 0:9adb08a2910c 244 int x = _column * 8 ; // FIXME: Char sizes
diasea 0:9adb08a2910c 245 int y = _row * 8;
diasea 0:9adb08a2910c 246
diasea 0:9adb08a2910c 247 if(value == '\n') {
diasea 0:9adb08a2910c 248 newline();
diasea 0:9adb08a2910c 249 } else if (kstate) { // 2nd byte of shift-jis
diasea 0:9adb08a2910c 250 kstate = false;
diasea 0:9adb08a2910c 251 int p = findface(kbuf << 8 | value);
diasea 0:9adb08a2910c 252 bitblit(x + 1, y + 1, 8,8, (char*)&(FontLookup[p][0]));
diasea 0:9adb08a2910c 253
diasea 0:9adb08a2910c 254 //printf("%x %x",( kbuf << 8 | value),p); //for debug
diasea 0:9adb08a2910c 255 _column++;
diasea 0:9adb08a2910c 256 if (_column >= COLS) {
diasea 0:9adb08a2910c 257 _row++;
diasea 0:9adb08a2910c 258 _column = 0;
diasea 0:9adb08a2910c 259 }
diasea 0:9adb08a2910c 260 if (_row >= ROWS) {
diasea 0:9adb08a2910c 261 _row = 0;
diasea 0:9adb08a2910c 262 }
diasea 0:9adb08a2910c 263 } else if ((0x81 <= value && value <= 0x9f) || (0xe0 <= value && value <= 0xfc)) { // 1st byte of shift-jis
diasea 0:9adb08a2910c 264 kstate = true;
diasea 0:9adb08a2910c 265 kbuf = value;
diasea 0:9adb08a2910c 266 } else {
diasea 0:9adb08a2910c 267 bitblit(x + 1, y + 1, 8, 8, (char*)&(FontLookup_ABC[value-32][0]));
diasea 0:9adb08a2910c 268 _column++;
diasea 0:9adb08a2910c 269 if (_column >= COLS) {
diasea 0:9adb08a2910c 270 _row++;
diasea 0:9adb08a2910c 271 _column = 0;
diasea 0:9adb08a2910c 272 }
diasea 0:9adb08a2910c 273 if (_row >= ROWS) {
diasea 0:9adb08a2910c 274 _row = 0;
diasea 0:9adb08a2910c 275 }
diasea 0:9adb08a2910c 276 }
diasea 0:9adb08a2910c 277
diasea 0:9adb08a2910c 278 return value;
diasea 0:9adb08a2910c 279 }
diasea 0:9adb08a2910c 280
diasea 0:9adb08a2910c 281 void bitblit( int x, int y, int width, int height, const char* bitstream ) {
diasea 0:9adb08a2910c 282 _cs = 0;
diasea 0:9adb08a2910c 283 int ii=0;
diasea 0:9adb08a2910c 284 _window(x*_font_width_size, y*_font_height_size, width*_font_width_size, height*_font_height_size); //add *2
diasea 0:9adb08a2910c 285 for (int i=0; i<height*_font_height_size; i++) {
diasea 0:9adb08a2910c 286 ii=i/_font_height_size;
diasea 0:9adb08a2910c 287 for (int j=0;j<width;j++){
diasea 0:9adb08a2910c 288 int byte = (ii*width+j) / 8;
diasea 0:9adb08a2910c 289 int bit = (ii*width+j) % 8;
diasea 0:9adb08a2910c 290 int colour = ((bitstream[byte] << bit) & 0x80) ? _foreground : _background;
diasea 0:9adb08a2910c 291 for (int jj=0;jj<_font_width_size;jj++){
diasea 0:9adb08a2910c 292 _putp(colour);
diasea 0:9adb08a2910c 293 }
diasea 0:9adb08a2910c 294 }
diasea 0:9adb08a2910c 295 }
diasea 0:9adb08a2910c 296 }
diasea 0:9adb08a2910c 297
diasea 0:9adb08a2910c 298
diasea 0:9adb08a2910c 299 private:
diasea 0:9adb08a2910c 300 bool kstate; //for Japnaese
diasea 0:9adb08a2910c 301 unsigned int kbuf; //for Japanese
diasea 0:9adb08a2910c 302 int _font_width_size, _font_height_size; //for Japanese
diasea 0:9adb08a2910c 303 }
diasea 0:9adb08a2910c 304 ;
diasea 0:9adb08a2910c 305
diasea 0:9adb08a2910c 306 #endif // MBED_MARMEX_OB_OLED_J