Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
NokiaLCD.cpp
00001 /* mbed Nokia LCD Library 00002 * Copyright (c) 2007-2010, sford 00003 */ 00004 00005 #include "NokiaLCD.h" 00006 00007 #include "mbed.h" 00008 00009 #define NOKIALCD_ROWS 16 00010 #define NOKIALCD_COLS 16 00011 #define NOKIALCD_WIDTH 130 00012 #define NOKIALCD_HEIGHT 130 00013 #define NOKIALCD_FREQUENCY 20000000 00014 00015 NokiaLCD::NokiaLCD(PinName mosi, PinName sclk, PinName cs, PinName rst, LCDType type) 00016 : _spi(mosi, NC, sclk) 00017 , _rst(rst) 00018 , _cs(cs) { 00019 00020 _type = type; 00021 00022 _row = 0; 00023 _column = 0; 00024 _foreground = 0x00FFFFFF; 00025 _background = 0x00000000; 00026 00027 reset(); 00028 } 00029 00030 void NokiaLCD::reset() { 00031 00032 // setup the SPI interface and bring display out of reset 00033 _cs = 1; 00034 _rst = 0; 00035 _spi.format(9); 00036 _spi.frequency(NOKIALCD_FREQUENCY); 00037 wait_ms(1); 00038 _rst = 1; 00039 wait_ms(1); 00040 00041 _cs = 0; 00042 00043 switch (_type) { 00044 case LCD6100: 00045 command(0xCA); // display control 00046 data(0); 00047 data(32); 00048 data(0); 00049 command(0xBB); 00050 data(1); 00051 command(0xD1); // oscillator on 00052 command(0x94); // sleep out 00053 command(0x20); // power control 00054 data(0x0F); 00055 command(0xA7); // invert display 00056 command(0x81); // Voltage control 00057 data(39); // contrast setting: 0..63 00058 data(3); // resistance ratio 00059 wait_ms(1); 00060 command(0xBC); 00061 data(0); 00062 data(1); 00063 data(4); 00064 command(0xAF); // turn on the display 00065 break; 00066 00067 case LCD6610: 00068 command(0xCA); // display control 00069 data(0); 00070 data(31); 00071 data(0); 00072 command(0xBB); 00073 data(1); 00074 command(0xD1); // oscillator on 00075 command(0x94); // sleep out 00076 command(0x20); // power control 00077 data(0x0F); 00078 command(0xA7); // invert display 00079 command(0x81); // Voltage control 00080 data(39); // contrast setting: 0..63 00081 data(3); // resistance ratio 00082 wait_ms(1); 00083 command(0xBC); 00084 data(0); 00085 data(0); 00086 data(2); 00087 command(0xAF); // turn on the display 00088 break; 00089 00090 case PCF8833: 00091 command(0x11); // sleep out 00092 command(0x3A); // column mode 00093 data(0x05); 00094 command(0x36); // madctl 00095 data(0x60); // vertical RAM, flip x 00096 command(0x25); // setcon 00097 data(0x30);// contrast 0x30 00098 wait_ms(2); 00099 command(0x29);//DISPON 00100 command(0x03);//BSTRON 00101 break; 00102 } 00103 00104 _cs = 1; 00105 00106 cls(); 00107 } 00108 00109 void NokiaLCD::command(int value) { 00110 _spi.write(value & 0xFF); 00111 } 00112 00113 void NokiaLCD::data(int value) { 00114 _spi.write(value | 0x100); 00115 } 00116 00117 void NokiaLCD::_window(int x, int y, int width, int height) { 00118 int x1 = x + 2; 00119 int y1 = y + 0; 00120 int x2 = x1 + width - 1; 00121 int y2 = y1 + height - 1; 00122 00123 switch (_type) { 00124 case LCD6100: 00125 case LCD6610: 00126 command(0x15); // column 00127 data(x1); 00128 data(x2); 00129 command(0x75); // row 00130 data(y1); 00131 data(y2); 00132 command(0x5C); // start write to ram 00133 break; 00134 case PCF8833: 00135 command(0x2A); // column 00136 data(x1); 00137 data(x2); 00138 command(0x2B); // row 00139 data(y1); 00140 data(y2); 00141 command(0x2C); // start write to ram 00142 break; 00143 } 00144 } 00145 00146 void NokiaLCD::_putp(int colour) { 00147 int gr = ((colour >> 20) & 0x0F) //MSB 4bit(red) 00148 | ((colour >> 8 ) & 0xF0); //Middle 4bit (green) 00149 int nb = ((colour >> 4 ) & 0x0F); //LSB 4bit (blue) 00150 data(nb); 00151 data(gr); 00152 } 00153 00154 const unsigned char FONT8x8[97][8] = { 00155 0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00, // columns, rows, num_bytes_per_char 00156 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // space 0x20 00157 0x30,0x78,0x78,0x30,0x30,0x00,0x30,0x00, // ! 00158 0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00, // " 00159 0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00, // # 00160 0x18,0x3E,0x60,0x3C,0x06,0x7C,0x18,0x00, // $ 00161 0x00,0x63,0x66,0x0C,0x18,0x33,0x63,0x00, // % 00162 0x1C,0x36,0x1C,0x3B,0x6E,0x66,0x3B,0x00, // & 00163 0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00, // ' 00164 0x0C,0x18,0x30,0x30,0x30,0x18,0x0C,0x00, // ( 00165 0x30,0x18,0x0C,0x0C,0x0C,0x18,0x30,0x00, // ) 00166 0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00, // * 00167 0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0x00, // + 00168 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30, // , 00169 0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00, // - 00170 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00, // . 00171 0x03,0x06,0x0C,0x18,0x30,0x60,0x40,0x00, // / (forward slash) 00172 0x3E,0x63,0x63,0x6B,0x63,0x63,0x3E,0x00, // 0 0x30 00173 0x18,0x38,0x58,0x18,0x18,0x18,0x7E,0x00, // 1 00174 0x3C,0x66,0x06,0x1C,0x30,0x66,0x7E,0x00, // 2 00175 0x3C,0x66,0x06,0x1C,0x06,0x66,0x3C,0x00, // 3 00176 0x0E,0x1E,0x36,0x66,0x7F,0x06,0x0F,0x00, // 4 00177 0x7E,0x60,0x7C,0x06,0x06,0x66,0x3C,0x00, // 5 00178 0x1C,0x30,0x60,0x7C,0x66,0x66,0x3C,0x00, // 6 00179 0x7E,0x66,0x06,0x0C,0x18,0x18,0x18,0x00, // 7 00180 0x3C,0x66,0x66,0x3C,0x66,0x66,0x3C,0x00, // 8 00181 0x3C,0x66,0x66,0x3E,0x06,0x0C,0x38,0x00, // 9 00182 0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x00, // : 00183 0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x30, // ; 00184 0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00, // < 00185 0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00, // = 00186 0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00, // > 00187 0x3C,0x66,0x06,0x0C,0x18,0x00,0x18,0x00, // ? 00188 0x3E,0x63,0x6F,0x69,0x6F,0x60,0x3E,0x00, // @ 0x40 00189 0x18,0x3C,0x66,0x66,0x7E,0x66,0x66,0x00, // A 00190 0x7E,0x33,0x33,0x3E,0x33,0x33,0x7E,0x00, // B 00191 0x1E,0x33,0x60,0x60,0x60,0x33,0x1E,0x00, // C 00192 0x7C,0x36,0x33,0x33,0x33,0x36,0x7C,0x00, // D 00193 0x7F,0x31,0x34,0x3C,0x34,0x31,0x7F,0x00, // E 00194 0x7F,0x31,0x34,0x3C,0x34,0x30,0x78,0x00, // F 00195 0x1E,0x33,0x60,0x60,0x67,0x33,0x1F,0x00, // G 00196 0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x00, // H 00197 0x3C,0x18,0x18,0x18,0x18,0x18,0x3C,0x00, // I 00198 0x0F,0x06,0x06,0x06,0x66,0x66,0x3C,0x00, // J 00199 0x73,0x33,0x36,0x3C,0x36,0x33,0x73,0x00, // K 00200 0x78,0x30,0x30,0x30,0x31,0x33,0x7F,0x00, // L 00201 0x63,0x77,0x7F,0x7F,0x6B,0x63,0x63,0x00, // M 00202 0x63,0x73,0x7B,0x6F,0x67,0x63,0x63,0x00, // N 00203 0x3E,0x63,0x63,0x63,0x63,0x63,0x3E,0x00, // O 00204 0x7E,0x33,0x33,0x3E,0x30,0x30,0x78,0x00, // P 0x50 00205 0x3C,0x66,0x66,0x66,0x6E,0x3C,0x0E,0x00, // Q 00206 0x7E,0x33,0x33,0x3E,0x36,0x33,0x73,0x00, // R 00207 0x3C,0x66,0x30,0x18,0x0C,0x66,0x3C,0x00, // S 00208 0x7E,0x5A,0x18,0x18,0x18,0x18,0x3C,0x00, // T 00209 0x66,0x66,0x66,0x66,0x66,0x66,0x7E,0x00, // U 00210 0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00, // V 00211 0x63,0x63,0x63,0x6B,0x7F,0x77,0x63,0x00, // W 00212 0x63,0x63,0x36,0x1C,0x1C,0x36,0x63,0x00, // X 00213 0x66,0x66,0x66,0x3C,0x18,0x18,0x3C,0x00, // Y 00214 0x7F,0x63,0x46,0x0C,0x19,0x33,0x7F,0x00, // Z 00215 0x3C,0x30,0x30,0x30,0x30,0x30,0x3C,0x00, // [ 00216 0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x00, // \ (back slash) 00217 0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00, // ] 00218 0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00, // ^ 00219 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, // _ 00220 0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00, // ` 0x60 00221 0x00,0x00,0x3C,0x06,0x3E,0x66,0x3B,0x00, // a 00222 0x70,0x30,0x3E,0x33,0x33,0x33,0x6E,0x00, // b 00223 0x00,0x00,0x3C,0x66,0x60,0x66,0x3C,0x00, // c 00224 0x0E,0x06,0x3E,0x66,0x66,0x66,0x3B,0x00, // d 00225 0x00,0x00,0x3C,0x66,0x7E,0x60,0x3C,0x00, // e 00226 0x1C,0x36,0x30,0x78,0x30,0x30,0x78,0x00, // f 00227 0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x7C, // g 00228 0x70,0x30,0x36,0x3B,0x33,0x33,0x73,0x00, // h 00229 0x18,0x00,0x38,0x18,0x18,0x18,0x3C,0x00, // i 00230 0x06,0x00,0x06,0x06,0x06,0x66,0x66,0x3C, // j 00231 0x70,0x30,0x33,0x36,0x3C,0x36,0x73,0x00, // k 00232 0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00, // l 00233 0x00,0x00,0x66,0x7F,0x7F,0x6B,0x63,0x00, // m 00234 0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x00, // n 00235 0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x00, // o 00236 0x00,0x00,0x6E,0x33,0x33,0x3E,0x30,0x78, // p 00237 0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x0F, // q 00238 0x00,0x00,0x6E,0x3B,0x33,0x30,0x78,0x00, // r 00239 0x00,0x00,0x3E,0x60,0x3C,0x06,0x7C,0x00, // s 00240 0x08,0x18,0x3E,0x18,0x18,0x1A,0x0C,0x00, // t 00241 0x00,0x00,0x66,0x66,0x66,0x66,0x3B,0x00, // u 00242 0x00,0x00,0x66,0x66,0x66,0x3C,0x18,0x00, // v 00243 0x00,0x00,0x63,0x6B,0x7F,0x7F,0x36,0x00, // w 00244 0x00,0x00,0x63,0x36,0x1C,0x36,0x63,0x00, // x 00245 0x00,0x00,0x66,0x66,0x66,0x3E,0x06,0x7C, // y 00246 0x00,0x00,0x7E,0x4C,0x18,0x32,0x7E,0x00, // z 00247 0x0E,0x18,0x18,0x70,0x18,0x18,0x0E,0x00, // { 00248 0x0C,0x0C,0x0C,0x00,0x0C,0x0C,0x0C,0x00, // | 00249 0x70,0x18,0x18,0x0E,0x18,0x18,0x70,0x00, // } 00250 0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00, // ~ 00251 0x1C,0x36,0x36,0x1C,0x00,0x00,0x00,0x00 00252 }; // DEL 00253 00254 void NokiaLCD::locate(int column, int row) { 00255 _column = column; 00256 _row = row; 00257 } 00258 00259 void NokiaLCD::newline() { 00260 _column = 0; 00261 _row++; 00262 if (_row >= _rows) { 00263 _row = 0; 00264 } 00265 } 00266 00267 int NokiaLCD::_putc(int value) { 00268 int x = _column * 8; // FIXME: Char sizes 00269 int y = _row * 8; 00270 bitblit(x + 1, y + 1, 8, 8, (char*)&(FONT8x8[value - 0x1F][0])); 00271 00272 _column++; 00273 00274 if (_column >= NOKIALCD_COLS) { 00275 _row++; 00276 _column = 0; 00277 } 00278 00279 if (_row >= NOKIALCD_ROWS) { 00280 _row = 0; 00281 } 00282 00283 return value; 00284 } 00285 00286 void NokiaLCD::cls() { 00287 fill(0, 0, NOKIALCD_WIDTH, NOKIALCD_HEIGHT, _background); 00288 _row = 0; 00289 _column = 0; 00290 } 00291 00292 00293 void NokiaLCD::window(int x, int y, int width, int height) { 00294 _cs = 0; 00295 _window(x, y, width, height); 00296 _cs = 1; 00297 } 00298 00299 void NokiaLCD::putp(int colour) { 00300 _cs = 0; 00301 _putp(colour); 00302 _cs = 1; 00303 } 00304 00305 void NokiaLCD::pixel(int x, int y, int colour) { 00306 _cs = 0; 00307 _window(x, y, 1, 1); 00308 _putp(colour); 00309 _cs = 1; 00310 } 00311 00312 void NokiaLCD::fill(int x, int y, int width, int height, int colour) { 00313 _cs = 0; 00314 _window(x, y, width, height); 00315 switch (_type) { 00316 case LCD6100: 00317 case PCF8833: 00318 for (int i=0; i<width*height; i++) { 00319 _putp(colour); 00320 } 00321 break; 00322 case LCD6610: 00323 for (int i=0; i<width*height/2; i++) { 00324 int r4 = (colour >> (16 + 4)) & 0xF; 00325 int g4 = (colour >> (8 + 4)) & 0xF; 00326 int b4 = (colour >> (0 + 4)) & 0xF; 00327 int d1 = (r4 << 4) | g4; 00328 int d2 = (b4 << 4) | r4; 00329 int d3 = (g4 << 4) | b4; 00330 data(d1); 00331 data(d2); 00332 data(d3); 00333 } 00334 break; 00335 } 00336 _window(0, 0, NOKIALCD_WIDTH, NOKIALCD_HEIGHT); 00337 _cs = 1; 00338 } 00339 00340 void NokiaLCD::blit(int x, int y, int width, int height, const int* colour) { 00341 _cs = 0; 00342 _window(x, y, width, height); 00343 00344 switch (_type) { 00345 case LCD6100: 00346 case PCF8833: 00347 for (int i=0; i<width*height; i++) { 00348 _putp(colour[i]); 00349 } 00350 break; 00351 case LCD6610: 00352 for (int i=0; i<width*height/2; i++) { 00353 int r41 = (colour[i*2] >> (16 + 4)) & 0xF; 00354 int g41 = (colour[i*2] >> (8 + 4)) & 0xF; 00355 int b41 = (colour[i*2] >> (0 + 4)) & 0xF; 00356 00357 int r42 = (colour[i*2+1] >> (16 + 4)) & 0xF; 00358 int g42 = (colour[i*2+1] >> (8 + 4)) & 0xF; 00359 int b42 = (colour[i*2+1] >> (0 + 4)) & 0xF; 00360 int d1 = (r41 << 4) | g41; 00361 int d2 = (b41 << 4) | r42; 00362 int d3 = (g42 << 4) | b42; 00363 data(d1); 00364 data(d2); 00365 data(d3); 00366 } 00367 break; 00368 } 00369 _window(0, 0, NOKIALCD_WIDTH, NOKIALCD_HEIGHT); 00370 _cs = 1; 00371 } 00372 00373 void NokiaLCD::bitblit(int x, int y, int width, int height, const char* bitstream) { 00374 _cs = 0; 00375 _window(x, y, width, height); 00376 00377 switch (_type) { 00378 case LCD6100: 00379 case PCF8833: 00380 for (int i=0; i<height*width; i++) { 00381 int byte = i / 8; 00382 int bit = i % 8; 00383 int colour = ((bitstream[byte] << bit) & 0x80) ? _foreground : _background; 00384 _putp(colour); 00385 } 00386 break; 00387 case LCD6610: 00388 for(int i=0; i<height*width/2; i++) { 00389 int byte1 = (i*2) / 8; 00390 int bit1 = (i*2) % 8; 00391 int colour1 = ((bitstream[byte1] << bit1) & 0x80) ? _foreground : _background; 00392 int byte2 = (i*2+1) / 8; 00393 int bit2 = (i*2+1) % 8; 00394 int colour2 = ((bitstream[byte2] << bit2) & 0x80) ? _foreground : _background; 00395 00396 int r41 = (colour1 >> (16 + 4)) & 0xF; 00397 int g41 = (colour1 >> (8 + 4)) & 0xF; 00398 int b41 = (colour1 >> (0 + 4)) & 0xF; 00399 00400 int r42 = (colour2 >> (16 + 4)) & 0xF; 00401 int g42 = (colour2 >> (8 + 4)) & 0xF; 00402 int b42 = (colour2 >> (0 + 4)) & 0xF; 00403 int d1 = (r41 << 4) | g41; 00404 int d2 = (b41 << 4) | r42; 00405 int d3 = (g42 << 4) | b42; 00406 data(d1); 00407 data(d2); 00408 data(d3); 00409 } 00410 break; 00411 } 00412 _window(0, 0, _width, _height); 00413 _cs = 1; 00414 } 00415 00416 void NokiaLCD::foreground(int c) { 00417 _foreground = c; 00418 } 00419 00420 void NokiaLCD::background(int c) { 00421 _background = c; 00422 } 00423 00424 int NokiaLCD::width() { 00425 return NOKIALCD_WIDTH; 00426 } 00427 00428 int NokiaLCD::height() { 00429 return NOKIALCD_HEIGHT; 00430 } 00431 00432 int NokiaLCD::columns() { 00433 return NOKIALCD_COLS; 00434 } 00435 00436 int NokiaLCD::rows() { 00437 return NOKIALCD_ROWS; 00438 }
Generated on Sat Jul 16 2022 19:11:13 by
